Текст
                    КНИГИ ПО ПРОГРАММАМ
«1С:ПРЕДПРИЯТИЕ 8.2»
спрашивайте в книжных, интернет-магазинах
и у партнеров-1С:Франчайзи
В.А. Ажеронок, А.В. Островерх, М.Г. Радченко,
Е.Ю. Хрусталева
«Разработка управляемого интерфейса»
•	Начинающим и опытным разработчикам.
•	Формирование командного интерфейса.
•	Разработка и программирование форм.
•	Оптимизация работы форм.
•	47 демонстрационных примеров на диске.
Издательство «1 С-Паблишинг», ISBN 978-5-9677-1148-0
Цена 500 руб.* * • Стр. 723 • Код говора 4601546069634
В.А. Ажеронок
«Как настраивать "1С:Предприятие 8.2"
при внедрении»
•	Начинающим специалистам по внедрению и тем,
кто хочет научиться внедрять прикладные решения
версии 8.2.
•	Обзор основных технических приемов и возможностей
платформы, которые могут использоваться при внед-
рении любых прикладных решений «1 СПредприятия 8».
•	Сквозной практический пример.
Издательство «1 С-Паблишинг», ISBN 978-5-9677-1149-7
Цена 240 руб.* • Стр. 172 • Код товара 4601546069641
* Внимание! Указаны рекомендованные розничные цены

http://nashe1c.ru
• Сообщество пользователей «1 СПредприятия 8».
• Обмен профессиональным опытом.
• Методики, разработки, статьи, дипломные проекты.
КООРДИНАТЫ ПАРТНЕРОВ-
1С:ФРАНЧАЙЗИ
на сайте www.1c.ru в разделе
«Купить 1С:Предприятие»
или по телефону отдела продаж
фирмы «1С»: (495) 737-92-57.
ПАБЛИШИНГ

А.П. Габец Д.В. Козырев Д.С. Кухлевский Е.Ю. Хрусталева РЕАЛИЗАЦИЯ ПРИКЛАДНЫХ ЗАДАЧ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ 8.2» ПАБЛИШИНГ
и©=РАЗ^АБСТКД ПРИЛОЖЕНИЕ К КНИГЕ А,П< Г&бец ДХ, Козырек ДХ< Кухяевскнй §LKX Хрусталеаа '^4 РЕАЛИЗАЦИЯ ПРИКЛАДНЫХ ЗАДАЧ В СИСТЕМЕ «1С:ПРЕДПРИЯТИЕ 8.2» ' ' '4 V .-/ ' ' I -5 I
ПРИЛОЖЕНИЕ К КНИГЕ © ООО *1С4Пабли1ц»и«г*, 2011 ЕЛО, Хрустеяева
А. П. Габец Д. В. Козырев Д.С. Кухлевский Е. Ю. Хрусталева Реализация прикладных задач в системе «1С:Предприятие 8.2» Москва 2010
УДК 658.012.011.56:004.42 ББК 65.29 П28 П28 Габец А. П. Реализация прикладных задач в системе «1С:Предприятие 8.2» / А. П. Габец, Д. В. Козырев, Д. С. Кухлевский, Е. Ю. Хрусталева. - М.: ООО «Ю -Паблишинг», 2010. - 714 с.: ил. - (Профессиональная разработка). ISBN 978-5-9677-1387-3 Данная книга посвящена углубленному изучению вопросов создания и модификации прикладных решений на платформе системы «1С:Предприятие 8.2». Она является частичной переработкой популярной книги «Профессиональная разработка в системе «1С:Предприятие 8». В книгу включены лишь те материалы, которые описывают основные прикладные механизмы платформы, позволяющие решать задачи оперативного, бухгалтерского учета и расчета заработной платы. Рассматривается структура и реализация этих механизмов, значительное внимание уделяется организации хранения данных. Другие вопросы разработки будут рассмотрены в следующих книгах, выпускаемых в серии «Профессиональная разработка». Все рассматриваемые в книге примеры адаптированы для использования с версией платформы «1С:Предприятие 8.2» в режиме управляемого приложения. Кроме этого, описание механизмов дополнено новыми возможностями, появившимися в версиях платформы 8.1 и 8.2. Книга рассчитана на разработчиков, обладающих некоторым навыком создания и модификации прикладных решений в системе «I С:Предприятие 8.2» и желающих повысить свой профессиональный уровень. Также книга будет интересна IT-специалистам, не занимающимся разработкой, но желающим получить представление о возможностях системы, ее идеологии, архитектуре и реализации конкретных механизмов. В помощь разработчикам прикладных решений книга содержит компакт-диск с демонстрационными конфигурациями, используемыми в книге. Все конфигурации созданы на версии платформы 8.2.12.87. Книга выпущена под редакцией Максима Радченко Группа подготовки издания: Дизайн обложки - Кира Федотова. Литературное редактирование, корректура - Елена Семененко. Верстка, препресс - Ольга Шестакова. Все права защищены. Никакая часть данной книги не может быть вос- произведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Полное или частичное копирование материалов книги без письменно- го разрешения фирмы «IC-Паблишинг» запрещается. ISBN 978-5-9677-1387-3 ©ооо«1С-Паблишинг», 2ою © Оформление. ООО «1С-11аблишинг», 2010 Подписано в печать 11.11.2010. Формат 60x84 1/16. Печ. л. 44,625. Тираж 10 000 жз. Заказ Налоговая льгота - общероссийский классификатор продукции ОК 005-93, том 2; 95 3005 - литература учебная. Отпечатано с оригиналов ООО «1С-Паблишинг». Фирма «1С». 123056. Москва, а/я 64, Селезневская ул., 21. Гел.: (495) 737-92-57. факс: (495) 681-44-07, fc@lc.ru, http://www lc.ru Издательство ООО «1С-Паблишинг». 127473, Москва, ул. Достоевского, 1/21, строение 1. Тел.: (495) 681-02-21, факс: (495) 681-44-07. puhlishing(« lc.ru Казанский производственный комбинат программных средств. 420044. Казань, ул. Ямашева, 36.
Оглавление Введение.....................................................................7 Что находится на компакт-диске.............................................8 Глава 1. Хранение информации.................................................9 Задачи хранения информации.................................................9 Варианты подходов к решению задач хранения информации.....................15 Хранение информации, общей для информационной базы......................15 Хранение единичных значений условно-постоянной информации...............18 Использование предопределенных элементов................................25 Хранение информации объектных и необъектных сущностей...................27 Хранение информации в самих объектах или в других объектах..............29 Хранение иерархической информации.......................................35 Хранение иерархии данных одной сущности.................................38 Хранение подчиненных данных в составе объекта...........................42 Хранение информации, имеющей привязку ко времени........................50 Использование объекта «ХранилищеЗначения»...............................52 Хранение информации в регистрах сведений..................................54 Уникальность записей регистра сведений..................................54 Периодические регистры сведений.........................................57 Подчинение записей регистратору.........................................59 Структура регистра сведений.............................................63 Создание, изменение, удаление записей регистра сведений.................69 Получение данных из регистров сведений..................................86 Проектирование структуры регистров сведений............................107
4 Реализация прикладных задач в системе «^Предприятие 8.2» Хранение дополнительных характеристик.....................................109 Хранение дополнительных характеристик определенного типа................110 Хранение дополнительных характеристик произвольного типа................114 Место документов в концепции системы «1С:Предприятие».....................139 Глава 2. Документы и последовательности.....................................139 Документы.................................................................142 Функциональность документов.............................................142 Состав документов.......................................................157 Отдельные вопросы типового использования документов.....................162 Запись документов.......................................................169 Специальные случаи использования документов. Ручная операция............214 Журналы документов........................................................219 Состав журналов.........................................................221 Последовательности документов.............................................224 Устройство последовательностей..........................................228 Работа с последовательностями...........................................230 Параллельный ввод документов, участвующих в последовательности..........246 Оперативный учет. Описание задач, решаемых регистрами накопления..........249 Глава 3. Реализация задач учета движения средств............................249 Структура регистра накопления.............................................254 Механизмы заполнения таблиц регистров накопления в базе данных............262 Запись данных в таблицу движений регистра накопления....................264 Свойство «Движения» объекта документа...................................266 Запись набора записей регистра без использования свойства «Движения»....283 Механизмы заполнения таблицы итогов регистра накопления.................289 Получение данных из регистров накопления..................................299 Получение движений регистров накопления.................................300 Получение остатков......................................................310 Получение оборотов......................................................326 Получение остатков и оборотов в одной таблице...........................350 Применение отборов в запросах, использующих виртуальные таблицы регистров накопления..............................................................374 Когда следует использовать запрос вместо объектной модели обращения при получении данных регистров накопления...............................377 Отдельные вопросы использования регистров накопления......................379 Работа с регистрами при отображении динамических данных.................379 Получение остатков при проведении документов............................387 Глава 4. Реализация задач бухгалтерского учета..............................397 Диаграмма взаимодействия объектов.........................................398 План счетов и его основные свойства.......................................400 Коды счетов.............................................................406 Упорядочивание счетов в плане счетов....................................409 Иерархичность плана счетов..............................................413 Предопределенные и пользовательские счета...............................420
Оглавление 5 Основы организации аналитического учета....................................422 Принятие решений при организации аналитического учета......................439 Предназначение регистра бухгалтерии..........................................442 Объект «Регистр бухгалтерии».................................................448 Основные свойства регистра бухгалтерии.....................................449 Данные регистра бухгалтерии................................................453 Запись движений в регистр бухгалтерии........................................469 Интерактивно: ручная операция..............................................471 Программно при проведении документа........................................477 Программно без проведения документа........................................484 Чтение данных регистра бухгалтерии...........................................486 Таблицы регистра бухгалтерии...............................................486 Вопросы производительности регистра бухгалтерии..............................536 Физические таблицы регистра бухгалтерии....................................536 Индексы таблиц итогов регистра бухгалтерии.................................543 Построение виртуальных таблиц регистра бухгалтерии.........................550 Зависимость производительности от настроек субконто счета..................560 Глава 5. Реализация сложных периодических расчетов.............................563 Технология реализации расчетных задач........................................564 Основные понятия...........................................................564 Планы видов расчета..........................................................577 Назначение планов видов расчета............................................577 Свойства планов видов расчета..............................................578 Структура планов видов расчета.............................................580 Проверки, выполняемые при записи вида расчета..............................583 Структура таблиц базы данных...............................................586 Регистры расчета.............................................................588 Назначение регистров расчета...............................................588 Свойства регистров расчета.................................................589 Структура регистров расчета................................................593 Структура таблиц базы данных...............................................600 Настройка протяженных во времени расчетов....................................602 Использование механизма вытеснения.........................................602 Использование графиков.....................................................605 Сторнирование..............................................................612 Настройка зависимости по базовому периоду....................................616 Настройка планов видов расчета и регистров расчета.........................616 Технология формирования и расчета записей регистров расчета..................626 Формирование записей регистра расчета......................................626 Настройка алгоритмов расчета...............................................628 Расчет записей регистра расчета............................................633 Перерасчет записей регистров расчета.........................................646 Объект конфигурации «Перерасчет»...........................................646 Измерения перерасчета......................................................648
6 Реализация прикладных задач в системе «^Предприятие 8.2» Автоматическое формирование записей перерасчета при вводе вытесняющих расчетов...........................................650 Автоматическое формирование записей перерасчета при вводе прочих расчетов.650 Особенности использования таблицы вытесняющих видов расчета..............652 Формирование записей перерасчета средствами встроенного языка............654 Автоматическое удаление записей перерасчета..............................656 Анализ данных таблицы перерасчета........................................656 Реализация перерасчета записей регистров расчета.........................660 Размещение данных системы «1С:Предприятие».................................665 Приложение. Хранение данных..................................................665 Информационные базы......................................................667 Профайлы.................................................................678 Другие вспомогательные данные............................................680 Временные данные.........................................................683 Поля таблиц базы данных....................................................684 Хранение значений полей примитивных и ссылочных типов....................685 Хранение значений полей составного типа..................................686 Индексы таблиц базы данных.................................................697 Справочник...............................................................698 Документ.................................................................701 Журнал документов........................................................702 План видов характеристик.................................................702 План счетов..............................................................702 План видов расчета.......................................................703 План обмена..............................................................704 Табличная часть..........................................................704 Регистр сведений.........................................................704 Регистр накопления.......................................................706 Агрегаты регистра накопления.............................................707 Регистр бухгалтерии......................................................708 Регистр расчета..........................................................709 Последовательность.......................................................710 Перечисление.............................................................710 Бизнес-процесс...........................................................710 Задача...................................................................711 Таблицы регистрации изменений............................................712 Таблица списка пользователей.............................................713 Таблица истории работы пользователей.....................................713 Таблица хранилища системных настроек.....................................713 Таблица хранилища настроек отчетов.......................................713 Таблица хранилища настроек вариантов отчетов.............................713 Таблица хранилища общих настроек.........................................714 Таблица хранилища настроек данных форм...................................714
Введение Идея этой книги заключается в том, чтобы собрать вместе и систематизировать наиболее важную информацию, которая может понадобиться разработчику прикладных решений «ЮПредприятия 8.2». Уровень изложения материала предполагает, с одной стороны, что разработчик уже знаком с системой «1С:Предприятие 8.2», а с другой стороны, что в этой книге он сможет найти ответ даже на довольно сложные вопросы, возникающие в процессе разра- ботки. В одной книге невозможно рассмотреть абсолютно все ситуации, которые могут возникнуть при разработке прикладных решений. Однако на подав- ляющее большинство вопросов, возникающих перед разработчиками, книга дает ответы. Причем книга будет одинаково интересна как начинающим разработчикам, так и более «продвинутым». Как правило, прикладные разработчики имеют достаточно четко опреде- ленную специализацию, сосредотачивая свои усилия на решении задач одной предметной области. Вместе с этим довольно часто возникают ситуации, когда приходится осваивать смежные прикладные области для того, чтобы внести небольшие исправления в существующее решение или, наоборот, создать новую подсистему. Поэтому книга, помимо собственно глубокого изложения прикладных механизмов, содержит общие сведения как о самих механизмах, так и об автоматизируемой предметной области. Благодаря этому разработчик, хорошо знакомый с системой, но специализирующийся,
8 Реализация прикладных задач в системе «1С:Предприятие 8.2» например, на решении задач оперативного учета, всегда сможет разобраться с задачами начисления заработной платы и понять работу механизмов, которые используются для решения этих задач. При написании этой книги мы стремились, чтобы она стала «серьезным инструментом для серьезных разработчиков», книгой, к которой всегда можно обратиться в случае затруднений и которую просто интересно прочи- тать, чтобы узнать что-то новое о хорошо известной предметной области или познакомиться с новым взглядом на привычные вещи. При подготовке материала этой книги был использованы самые различные источники информации: опыт преподавания на учебных курсах по плагформе и прикладным реше- ниям «1С:Пре.цприятия 8»; опыт внедрения прикладных решений: опыт, накопленный разработчиками фирмы «1С»; материалы информационно-технологической поддержки (ИТС); материалы форума пар шеров-разработчиков на http://partners.v8.1c.ru; общение на партнерских семинарах, проводимых фирмой «1С». Что находится на компакт-диске К книге прилагается компакт-диск, который содержит материалы, предназна- ченные для самостоятельного изучения и использования. Прежде всего, это три демонстрационные конфигурации, которые использу- ются в ходе изложения различных глав книги: «Хранение информации и учет движения средств»; «Бухгалтерский учет»; «Сложные периодические расчеты». Все демонстрационные конфигурации содержатся на компакт-диске в виде дистрибутивов. После запуска исполняемого файла шаблоны конфигураций устанавливаются в текущий каталог шаблонов. Конфигурации созданы в версии «1С:Предприятия» 8.2.12.87.
Глава 1. Хранение информации Задачи хранения информации При создании любых решений в области автоматизации практически всегда приходится решать задачи хранения информации. При этом поднимаются вопросы собственно предназначения хранимой информации и многочис- ленные технологические вопросы. К технологическим вопросам можно отнести те, которые приходится решать для достижения оптимального соотношения таких показателей, как: объем, надежность, функциональность, быстродействие. Причем на всех этапах жизненного цикла информации: я запись информации, я хранение информации, получение информации, я удаление информации.
10 Реализация прикладных задач в системе «^Предприятие 8.2» При создании бизнес-приложений сложность решений этих задач обуслов- лена наличием противоречий между: необходимостью обеспечения удобства предел авления логики взаимодейс- твия сущностей в информационной модели; необходимостью хранения больших объемов информации; повышенными требованиями к широкой функциональности и высокой производительности доступа к этим данным. Например, чем больше объем, тем в общем случае сложнее с обеспечением скорости доступа к информации (рис. 1.1). Рис. 1.1. Схема противоречий между требованиями к хранимой информации Объем хранимой информации И в результате очевидные прямые решения одних вопросов ухудшают возмож- ности решения других. Например, хранение информации о происходящих в жизни автоматизируе- мого предприятия событиях в виде набора неструктурированных текстов - идеальное решение с точки зрения простоты и скорости регистрации. Однако последующая обработка этой информации для составления каких бы то ни было аналитических отчетов в таком случае будет сопряжена с колоссаль- ными временными затратами Потому что как для решения задачи поиска информации обо всех продажах предприятия, так и для поиска информации о продажах одному покупателю необходимо будет пересмотреть данные всех текстов. И чем больше функциональных возможностей потребуется на этапе полу- чения информации, тем дольше будут работать соответствующие обработки, зачастую по нескольку раз просматривая одну и ту же информацию, но уже с разными целями.
. йи Глава 1. Хранение информации Объектно-реляционная парадигма системы «1С:Предприятие» позволяет решить проблему соотношения удобства представления и манипулирования объектами, отражающими прикладные сущности, с должной надежностью и эффективностью обработки больших объемов информации этих объектов в базе данных. Объекты и процессы прикладной области отражаются в решении посредством объектов конфигурации. Таким образом, объекты конфигурации обеспечи- вают удобство манипулирования данными, характеризующими прикладные объекты и процессы. Но сами данные объектов хранятся в реляционной базе данных (в виде таблиц, полей, индексов), при этом обеспечиваются вопросы оптимального быстродействия при больших объемах информации (рис. 1.2). Рис. 1.2. Схема представления и манипулирования данными в системе «1С:Предприятие» В системе «ЮПредприятие» все возможные к применению в решениях прикладные объекты прототипированы. Каждый прототип отвечает за отра- жение в прикладном решении определенной совокупности объектов или процессов прикладной области, имеющих схожие поведенческие характе- ристики и схожую роль в общей картине решения. Примерами прототипов являются справочники, документы, регистры различных видов и так далее. В рамках средств платформы для каждого прототипа уже предопределены: оптимальная для большинства задач структура хранения информации в реляционной базе данных; набор средств встроенного языка для манипулирования этой информа- цией; методы, свойства, события и типовые для решаемых задач операции; способы отображения и редактирования; средства регулирования прав доступа и т. д.
Реализация прикладных задач в системе «1С:Предприятие 8.2» Прикладная сущность Прикладная область Расходная наклал нм N. Я2 ат !5 ашуста 2DD4- Ь . вш НИ .••нм к*.' :и "4м>1 . г г г I гвв t L “А.Л HA. sa. -р. tv ’* .А > м 1А* Л • .J - - It ГИ. (?J| S 1 •*-А’ A «и > . <..» > 1* -11 А к ..%•« •.» »- .41 *••• ХГК «V» .’Г ,51 -0г« Сфм .vrrn Jiwavrcr })«д>па Ппдог П1ТЛ Jk Решение Рис. 1.3. Пример представления и манипулирования данными Таким образом, облегчается работа разработчика конкретного приклад- ного решения. С точки зрения эффективного хранения информации вместо решения задач «низкого» уровня он занят решением вопросов: выбора нужного прототипа; создания в рамках прототипов объектов с наиболее подходящим составом для отражения прикладных сущностей; обеспечения обмена информацией и взаимодействия между созданными объектами. Обеспечение же всей остальной необходимом функциональности берет на себя платформа. Но и в этих вопросах, при необходимости, у разработ- чиков достаточно широкие возможности «подправить» поведение программы В частности, при решении задач, связанных с вводом и получением инфор- мации для последующего анализа. Например, при отображении динамических списков система считывает из базы данных содержимое только видимых полей и полей, необходимых «для технологических нужд». Если же разработчику необходимо сделать так, чтобы данные некоего поля, не отображаясь, тем не менее, считывались из базы данных вместе с остальными, он может этого добиться.
Глава 1. Хранение информации Итак, вернемся к общим вопросам, связанным с обеспечением эффективного хранения информации. Прежде всего, они не являются самоцелью. К выбору прототипов объектов для использования в рамках решения необхо- димо подходить с точки зрения обеспечения целей автоматизации и областей применимости прототипов. А вот если одинаковая функциональность может быть достигнута различными альтернативными с точки зрения организации хранения информации путями, то выбор оптимального варианта постро- ения конфигурации как раз и будет определяться оптимальностью решения вопросов хранения информации. Причем разработчику необходимо решать эти вопросы в комплексе. Потому что все объекты будут тесно связаны между собой логическими, информа- ционными, интерфейсными и прочими связями в интересах преследования общих целей автоматизации. В общем виде взаимосвязь и предназначение объектов, относящихся к соот- ветствующим прототипам, могут быть описаны следующим образом (рис. 1.4). Ус повно-постоянная информация Константы Справочники Перечисления Планы видов характеристик Планы счетов Планы видов расчета Докумеить: ^Нумераторы П оследовательности i Документы 4 урналы документов Рис. 1.4. Взаимосвязь различных групп объектов Если требуется хранить в базе данных информацию, которая изменяется достаточно редко и работа с которой строится по принципу «ввели один раз, но используется много раз», то для хранения такой информации наиболее удобны объекты из блока Условно-постоянная информация. То есть справоч- ники, перечисления, константы, планы видов характеристик - при решении практически любых задач. Планы счетов, планы видов расчетов и т. п. - при решении специфичных задач, сопряженных с использованием принципа «двойной записи», использованием механизмов сложных периодических расчетов и т. д.
14 Реализация прикладных задач в системе «1С:Предприятие 8.2» Если требуется хранить информацию о происходящих в жизни автоматизиру- емого предприятия действиях (событиях и выполняемых операциях), то есть информацию, для которой важна привязка ко времени, то наиболее удобно использовать документы. На схеме к этой же группе относятся и другие объекты, которые используются для решения вопросов дополнительной функ- циональности системы при обслуживании этой информации: журналы - средства визуального группирования информации разных документов; последовательности - средства логического группирования информации разных документов; нумераторы - средства группирования разных документов для ведения единой нумерации. Если требуется хранить информацию о состоянии показателей, учитыва- емых в системе, то более удобны для решения этих задач объекты из группы регистры. Причем показатели могут иметь привязку ко времени или не иметь ее, быть наиболее общими или достаточно специфичными, предназначен- ными к использованию в специальных моделях учета (те же «двойная запись», «сложные периодические расчеты» и т. д.). Чаще всего модель обмена информацией между объектами вышеопи- санных прототипов обслуживает следующую модель автоматизации бизнес-решений. Требуемые аналитические и информационные материалы о различных аспектах состояния дел на автоматизируемом предприятии получаются пользователями посредством отчетов и обработок (объектов, специ- ально предназначенных для обеспечения вывода информации в удобном для пользователя виде). и Для обеспечения максимального быстродействия формирования отчетной информации о состоянии учитываемых в системе показателе1 алгоритмы представления этой информации берут ее в уже готовом или почти готовом виде, с последующей «дообработкой», из регистров. Стандартная мегодика использования регистров заключается в том, что изменение состояния учитываемых показателей в регистрах производится не произвольным образом, а при наличии «документального подтверж- дения». То есть информация регистров вторична, она заполняется на основании данных документов. Ведь именно документы, как правило,, служат для обеспечения регистрации происходящих в жизни автоматизи- руемого предприятия событий. В то же время платформа не ограничивает разработчика жесткими рамками стандартной методики и позволяет изме- нять данные регистров и другими произвольными способами, например. напрямую из процедур встроенного языка.
Глава 1. Хранение информации Однозначность толкования вводимой в документы информации обеспечи- вается заполнением документов посредством выбора элементов объектов хранения условно-постоянной информации, отражающих объекты прикладной области. Однако, как уже было замечено выше, разработчик не обязан слепо следовать предлагаемой логике. В ситуациях, когда это окажется оправданным, можно применять приемы, упрощающие или даже полностью отвергающие ее. Например, в платформе «ЮПредприятие» есть возможности и средства прямого интерактивного ввода информации в регистры, формирования отчетов на основании данных первичных документов, заполнения справоч- ников посредством обработок и так далее. Более того, рассмотрение и оценка возможных вариантов выбора прото- типов и объектов будут производиться фактически каждый раз заново, для данной конкретной ситуации данного конкретного решения. Потому что даже в рамках преследования одинаковых целей автоматизации, но для разных условий функционирования, эффективная композиция структуры объектов в рамках решения может оказаться разной. Например, ситуации для предприятия, заключающего в течение года сто сделок по десять миллионов рублей, и для предприятия, заключающего в год десять миллионов сделок по сто рублей, с точки зрения оптимизации хранения информации различаются. Поэтому цель данного раздела не навязать единственно верную струк- турную технологию решения задач хранения информации (тем более что такой не существует), а показать возможности решения вопросов хранения информации. И зачастую - в сравнении плюсов и минусов альтернативных вариантов использования для этих решений различных видов объектов системы «ЮПредприятие». Варианты подходов к решению задач хранения информации Хранение информации, общей для информационной базы При решении вопросов хранения общей информации есть возможности орга- низовать решения в рамках работы с конфигурацией или с базой данных.
Реализация прикладных задач в системе «1С:Предприятие 8 2» Использование общих картинок Например, картинки с логотипами юридических лиц компании могут храниться в составе общих картинок конфигурации, а могут в составе рекви- зитов справочника (например, справочника Организации), рис. 1.5. ------------------ГТ- -------———-------_ w'V Хранением нфорг 1аиииИУчетДвиженияСредств © •• Общие * 5b Подсистемы 1 '3| Общие модули ♦ Параметры сеанса Ч Роли Планы обмена Критерии отбора 2^ Подписки на события О Регламентные задания Функциональные опции Параметры Функциональных опций Хранилища настроек У] Общие формы О Общие команды ЙЙ Группы команд Общие макеты в В Общие картинки * I Логотип £ Общая картинка florori л В Т ип картинки: png Рис. 1.5. Пример хранения картинок в составе конфигурации С точки зрения надежности хранения информации успешность обращения к картинке в первом случае «гарантируется» неизменностью конфигурации, во втором - мерами разграничения прав доступа пользователей к объектам базы данных (то есть при неудачном стечении обстоятельств при обращении к картинке может выясниться, что она удалена или модифицирована пользо- вателем).
Глава 1. Хранение информации 17 Использование макетов Если предпочтение отдается хранению информации на уровне конфигу- рации, то кроме картинок возможно использование макетов - общих макетов и макетов объектов конфигурации. При этом могут быть использованы следующие виды макетов: макет текстового документа, макет табличного документа, макет двоичных данных, макет Active document, макет HTML-документа, макет географической схемы, макет графической схемы, макет схемы компоновки данных, макет оформления компоновки данных. Конфигурация * X Действия - 0 & йф X V & |! W ХранениеИ нформацииИ У чет Д виженияСредств ; '-> Обшие +- Подсистемы |т Общие модули ф Параметры сеанса t Роли Планы обмена jF| Критерии отбора Подписки на события СЭ Регламентные задания Функциональные опции »?.. Параметры Функциональных опций i j Хранилища настроек Л Общие формы QJ Общие команды г UJ руппы команд - Общие макеты Приглашение + ч- Обшие картинки . Л, XDJQ-пакеты , до w 1 petite fljwr--**** ; ... -U " * I Я MW IS k Уважаемый <ФИО: ' Приглашаем Вас посетить нашу компанию в связи с мероприятием <От1исаннеСобытия>. < Ответственны й> / В » - *- # <| _________________________2___________________Г71 Рис. 1.6. Пример хранения макета Active document
18 Реализация прикладных задач в системе «ЮПредприятие 8.2» Чаще всего макеты используются для хранения данных шаблонов нужных типов. Например, когда в конфигурации нужно хранить «красивый» шаблон приглашения, разработанный в Microsoft Word, с целью его автоматического заполнения при выполнении соответствующей задачи работы пользователя (рис. 1.6). При этом можно загружать макеты из файлов, а можно создавать пустые макеты нужного вида (рис. 1.7). Констругто макета X Имя: Синоним: Макет Комментарий: Загрузить из Файла: - Выберите тип макета:---------------- _1Т абличный документ 1Т екстоьый документ 1 1 Двоичные данные Active document: --------------------- С HTML документ Г еиграфиче1 к эя схема Г рафическая схема ( Схема компоновки данных f Макет оформления компоновки данных |, Готово Отмена | [ Справка ] Рис. 1.7. Создание макета Но, кроме того, могут использоваться, например, макеты специального типа (макет схемы компоновки данных) для хранения схемы компоновки данных отчета. В ней описываются источники данных для отчета, связи между ними, параметры получения данных отчета и его настройки: структура отчета, список полей, отбор, сортировка, условное оформление и др. (рис. 1.8). Хранение единичных значений условно-постоянной информации Зачастую при решении задач необходимо реализовывав хранение данных неких единичных значений, которые меняются крайне редко. Использование констант Константы - классические объекты для хранения таких данных. Добавлять новые константы или удалять старые можно только в режиме Конфигуратор, по вот заполнение и модификация значений обычно производятся пользовате- лями (если не ограничен доступ).
Глава 1. Хранение информации '191 *; L. Автозаполнение @ Щ Отчет ПрояажиКонграгентовИмеющихКапгегорию: ОснлвнаяГчемаКомпсмиокиДаннь.х *. О X Наборы данных ’ Связи набора,. , Вычисляемые... Ресурсы Параметры , Макеты , Вложенные с... Настройки Поля: Поле Путь Ограничение поля Роль С., ... —г В ь!ражени... П ровер Автозаголовок П... У... Г.. У... .,„1.., 1 Ограничение ре... П... У.Jr... У.J Выражения Набор jc упорядочи... Параме ..... и .. 1—1 . . . ... . .. ! Категория rxoici ирия 1 1 J v Роль П0Л5 i_J Категория v О v J ij “ КоличествоОборот КоличествоОборот О О U U (_J Количество Оборот v v w v- ™ Контрагент Контрагент О U О О Измерение □ Контрагент □ □ □ □ в» Номенклатура Номенклатура О U О О Измерение □ Номенклатура □ □ □ □ СуммаОборот СуммаОборот О О О С [_] Сумма Оборот j Запрос: ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КоличествоОборот КАК КоличествоОборот ПродажиОбороты.СуммаОборот КАК СуммаОборот ИЗ (ВЫБРАТЬ РАЗЛИЧНЫЕ КатегорииКонтрагентов.Контр аге нт КАК Контр агент ч\ Конструктор запроса... Рис. 1.8. Хранение схемы компоновки данных отчета в макете При решении прикладных задач посредством констант обычно запоминаются общие для всей информационной базы значения. Можно привести примеры таких констант, как ОсновнаяБазоваяВалюта или ОсновнаяОрганизация. Также в константах могут храниться значения по умолчанию для поддержания работы алгоритмов, критичных к пустым значениям. Такими константами являются, например, константы НачалоРабочегоДня, ОкончаниеРабочегоДня. Кроме этого, благодаря тому, что значения, хранящиеся в константе, общие для всех, с помощью констант можно организовать информирование пользо- вательских сеансов работы с программой. Например, пользователь с административными правами имеет право уста- навливать для булевой константы ЗавершениеРаботыПользователей значение Истина. А соответствующая обработка ожидания проверяет значение этой константы и, в случае необходимости, завершает пользовательский сеанс. Пример данного механизма реализован в составе демонстрационной конфигу- рации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске.
20 Реализация прикладных задач в системе «ЮПредприятие 8.2» Необходимая функциональность реализуется в рамках модуля управляемого приложения (листинг 1.1). Листинг 1.1. Фрагмент модуля управляемого приложения Перем ЗавершитьРаботу; Процедура ПриНачалеРаботыСистемы() КонтрольРежимаЗавершенияРаботыПользователей(); ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 180); КонецПроцедуры Процедура КонтрольРежимаЗавершенияРаботыПользователей() Экспорт II Определить текущее значение константы Завершение = ХранениеИнформации.ЗавершитьРаботуПользователей(); Если Завершение Тогда Если Заверши гьРаботу Тогда // Завершить работу окончательно ЗавершитьРаботуСистемы(); Иначе II Предупредить пользователя и приготовиться завершить работу в следующий раз ТекстПредупреждения = "Работа системы будет автоматически завершена через 3 минуты’"; Предупреждение(ТекстПредупреждения, 30, "Завершение работы"); ЗавершитьРаботу - Истина; КонецЕсли; КонецЕсли; КонецПроцедуры /I--------- II Выполнить начальную инициацию флага завершения работы ЗавершитьРаботу = Ложь; Функция для получения значения константы ЗавершениеРаботыПользова- телей располагается в общем модуле ХранениеИнформации, исполняющемся на сервере (в свойствах модуля должен быть установлен флажок ВызовСер- вера), листинг 1.2. Листинг 1.2. Функция общего модуля «ХранениеИнформации» Функция ЗавершитьРаботуПользователей() Экспорт Возврат Константы.ЗавершениеРаботыПользователей.Получить(), КонецФункции
Глава 1. Хранение информации 21 Использование регистров сведений В случае, когда необходимо хранить информацию общую для базы данных, но используемую для отдельных направлений учета или отдельных подсистем конфигурации, может оказаться оправданным хранение единичных условно- постоянных значений не посредством констант, а посредством ресурсов регистра сведений. Рассмотрим, например, непериодический независимый регистр сведений УчетнаяПолитика (рис. 1.9). УчетнаяПолитик з Й Регистры сведений - й 1_ Измерения J Ресурсы J ВестиПартионныйУчетПоСкладам J СписыватьП артииП риП роведении Документов I СпособО ценкиМПЗ > П араметрАВ СКлассиФикацииП окупателей Л П араметрРаспределенияП окупателейП оСтадиям / СтратегияСписанияПартийТ оваровПоСтагусам J И спользовагьСкидкиП оКоличеству Т овара I И спользовагьСкидкиП оСумме Документа J ИспользовагьСкидкиПоВидуОплаты J И спользовагьСкидкиП о ДисконтнойКарте J ВедениеУчетаПоПроектам Л НеВключатьНДСВСтоимостьПапгий в Реквизиты Л Формы (J Команды [] Макеты Рис. 1.9. Структура регистра «УчетнаяПолитика» Возможности пользователей по модификации значений будут определяться средствами разграничения прав доступа. Обратите внимание: в данном регистре не подразумевалось использование измерений, а значит, разрезов учета значений ресурсов. То есть данные регистра могут использоваться как общие для всей базы данных. Подробнее о регистрах сведений можно прочитать в разделе «Хранение информации в регистрах сведений» на стр. 54. Использование перечислений Если необходимо хранить уже не единичные значения, а некие конечные наборы значений, и при этом не подразумевается их модификация пользова- телями, то для решения задач возможно применение перечислений. Все операции по добавлению, изменению, удалению значений перечислений производятся только в режиме работы Конфигуратор.
Реализация прикладных задач в системе «ЮПредприятие 8.2» Само же хранение информации перечислений реализуется в соответствующих таблицах базы данных (по одном для каждого перечисления), рис. 1.10. Значения перечисления относятся к информации конфигурации, но хранятся в базе данных Команды + } ВцдыДоговоров {.•} РазмещениеЗаказовПокупателей '+ ВидыОпераций Таблица перечисления *ВидыКонтрагент*>в" в базе данных Порядок Ссылка 0 Частное Лицо 1 Организация Рис. 1.10. Хранение значений перечислений Обращение для чтения этой информации возможно как средствами табличной модели (запросы), так и объектными методами. Если, например, в ходе обработки необходимо использовать заранее извес- тное значение перечисления, то его можно получить, указав его имя через точку после имени перечисления (в данном примере используется объектная модель доступа к данным), листинг 1.3. Листинг 1.3. Пример получения значения перечисления Запош юмоеЗначениеВидаКонтрагента = Перечисления.ВидыКонтрагентов.Час! ноеЛицо; Еще раз подчеркнем: при использовании такого кода разработчик уверен что данное значение перечисления не может быть удалено или изменено поль- зователем, поскольку модификация этих данных возможна только в режиме Конфигуратор. Кроме того, многие «типовые операции», связанные с использованием пере- числений, уже реализованы средствами платформы. Например, в ходе некоей обработки нужно предложить пользователю выбрать значение перечисления ВидыКонтрагентов. Задача может быть решена следу- ющим образом (в данном примере используется табличная модель доступа к данным), листинг 1.4, 1.5.
Глава 1. Хранение информации 23 Листинг 1.4. Обработчик команды для организации интерактивного выбора значения перечисления &НаКлиенте Процедура ВыбратьЗначениеПеречисления(Команда) СписокЗначенийПеречисления = ПолучитьЗначенияПеречисления(); II Предложить пользователю выбрать значение ВыбранноеЗначение - СписокЗначенийПеречисления.ВыбратьЭлемент(”Выберите вид контрагента”); КонецПроцедуры Листинг 1.5. Получение списка значений перечисления шиммы /оные . пяап . шыымм мн visa «мвлшв* мимы иные па гни им, вшчвш'амгишш «ммылтвз штляг з-п-мыыэнпмк- чма, нит ышн ъ&ия чини, шаш.-м,' шгтнммшыймаышна . ’намш. гчншшиашт / &НаСервереБезКонтекста Функция ПолучитьЗначенияПеречисления() СписокЗначенийПеречисления = Новый СписокЗначений; II Прочитать значения перечисления из базы данных Запрос = Новый Запрос; Запрос.Текст =" ВЫБРАТЬ ВидыКонтрагентов.Ссылка КАК Значение, ПРЕДСТАВЛЕНИЕ(ВидыКонтрагентов.Ссылка) КАК ПредставлениеЗначения ИЗ Перечисление.ВидыКонтрагентов КАК ВидыКонтрагентов”; Результат = Запрос. Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл II Заполнить значения списка СписокЗначенийПеречисления.Добавить(Выборка.Значение, Выборка.ПредставлениеЗначения); КонецЦикла; Возврат СписокЗначенийПеречисления; КонецФункции Краткий комментарий: в функции ПолучитьЗначенияПеречисленияО, выполняющейся на сервере, запросом из таблицы перечисления ВидыКонтр- агентов считываются значения и представления для каждой записи. В цикле выборки из результата запроса заполняются значения и представления списка значений СписокЗначенийПеречисления. Этот список возвращается в обра- ботчик команды, в котором пользователю предлагается выбрать значение из списка СписокЗначенийПеречисления.
24 Реализация прикладных задач в системе «1С:Предприятие 8.2» Однако если бы выбор значения перечисления нужен был для заполнения поля, имеющего визуальное представление (например, в форме контрагента), то данный код писать не пришлось бы вообще. Достаточно было бы устано- вить соответствующий тип значения поля ввода (ПеречислениеСсыл- ка.ВидыКонтрагентов), рис. 1.11. Рис. 1.11. Тип значения поля ввода Дальнейшая функциональность была бы реализована платформой автомати чески (рис. 1.12). Глаголев Максим Олегович (Контрагент) (1 (-Предприятие) и; •я ^hwii Глаголев Максим Олегович (Контрагент) 7 Записать и закрыть Все действия ▼ ‘000000001 Код: Наименование [Глаголев Максим Олегович Вид: [Частное лицо Частное лицо Почтовый адрес _______________ Организация Рис. 1.12. Выбор значения перечисления в поле ввода
Глава 1. Хранение информации 25 Использование предопределенных элементов Если требуется сочетать гарантии наличия информации с гибкими возмож- ностями модификации этой информации, интересные возможности предоставляет использование предопределенных элементов справочников, планов видов характеристик, планов счетов и т. п. Благодаря тому, что добавление и удаление предопределенных элементов возможны только в режиме работы Конфигуратор, разработчик может быть уверен в их сохранности при любых действиях пользователей. Кроме этого, каждый предопределенный элемент обладает уникальным именем, что позво- ляет создавать алгоритмы, использующие, например, предопределенные виды контактной информации, предопределенные вычеты НДФЛ, предопре- деленные счета налогового учета и так далее. Таким образом, предопределенные элементы не «обезличены» для конфигу- рации, и конфигурация имеет возможность отличить один предопределенный элемент от другого (рис. 1.13). Режим "Конфигуратор" Справочник Ви... Предопределенные элементы справочникэ Действия ’ X Ш Справочники ВидыСобытий Имя - ffl] 3 лементы Наименование Реквизиты Т абличные части Формы Команды Макеты ЛичнаяВстреча 000000002 Личная встреча Семинар 000000003 Т елеФонныйРазговор 000000001 Семинар Т р.леф! 1нныи разговор 1Код Режим "1С Предприятие" Виды СОбыСгСЙ-"' Создан^*’ & Х| Q Найти Ь ,Все действия’?! Наименование Выставка Заключение договора 0 Создать Qj Скопировать & Изменить -к Личная встреча “ Презентация % Семинар Т елеФонный разговор Х( Пометить на удаление I Снять пометку tx) Удалить Shift+Del Обновить Найти... Справка Ins F9 F2 Del Отменить поиск Настроить список Вывести список... Изменить Форму... на удаление предопределенного элемента справочника запрещена О X Г Рис. 1.13. Пример предопределенного элемента справочника
26 Реализация прикладных задач в системе «1С:Предприятие 8.2» К предопределенному элементу справочника можно обратиться, указав его имя через точку после имени справочника (например, Справочники.Ви- дыСобытий. Семинар). Например, если при создании документа Событие необходимо заполнить значение реквизита ВидСобытия (тип значения: СправочникСсылка.Ви- дыСобытий) предопределенным элементом справочника, это может выгля- деть так (листинг 1.6, 1.7). Листинг 1.6. Обработчик команды для создания события с предопределенным элементом справочника &НаКлиенте Процедура СогдатьСобытиеСеминар(Команда) СсылкаНаДокумент = СощатьНовоеСобытие(ДатаПроведения); ОткрытьЗначение(СсылкаНаДокумент); КонецПроцедуры Листинг 1.7. Пример использования предопределенного элемента справочника &НаСервереБезКонтекста Функция СоздатьНовоеСобытие(ДатаПроведения) II Создать новый документ НовоеСобытие = Документы. Событие.СоздатьДокумент(); II Заполнить поля НовоеСобытие.Дата = ДатаПроведения; II Заполнить значением предопределенного элемента НовоеСобытие ВидСобытия = Справочники.ВидыСобытий.Семинар; II... II Записать документ НовоеСобытие.Загмсать(); Возврат НовоеСобытиеСсылка; КонецФункции Однако обращение к менеджерам объектов (например. Справочники.<Имя справочника>) на клиенте недоступно. Для получения ссылки на предо- пределенное значение на клиенте следует использовать метод глобального контекста ПредопределенноеЗначениеО (например, Предопределен- ноеЗначение ("Справочник.ВидыСобытий.Семинар")). Например, требуется открыть форму предопределенного элемента справочника. Это можно сделать с помощью следующего кода (листинг 1.8).
Глава 1. Хранение информации 27 j Листинг 1.8. Обработчик команды для открытия формы предопределенного элемента справочника .й» Ж &НаКлиенте Процедура СоздатьСобытиеСеминар( команда) Ж ВидСобытия = ПредопределенноеЗначение("Справочник£идыСобытжСеминар’‘); ОткрытьЗначение(ВидСобытия); КонецПроцедуры При работе с объектами встроенного языка предопределенные элементы отличаются от «обычных» лишь значением свойства Предопределенный (у обычных - Ложь, у предопределенных - Истина). Работа пользователя с предопределенными элементами, по сравнению с обычными, ограничива- ется лишь невозможностью удалить их. Все остальные способы модификации предопределенных элементов следует ограничивать правами доступа или с помощью прикладных алгоритмов. Это означает, что пользователь, при необходимости, может изменить наиме- нование предопределенного элемента, код, пометить на удаление и т.д. При этом для системы этот предопределенный элемент остается тем же самым предопределенным элементом, т. к. его внутренний идентификатор не меняется. Хранение информации объектных и необъектных сущностей При выборе прототипов объектов для хранения информации одним из типичных вопросов, возникающих при неочевидных случаях, является выбор между объектными и необъектными данными. Например, между регис- тром сведений и справочником. К объектным данным относятся данные справочников, документов, планов видов характеристик, планов счетов, планов видов расчета, бизнес-процессов, задач, планов обмена. К необъектным данным относятся данные регистров сведений, регистров накопления, регистров бухгалтерии, регистров расчета, перерасчетов, после- довательностей и констант. В рамках текущей темы ограничимся лишь вопросами выбора этих данных для различных задач хранения информации.
Реализация прикладных задач в системе «^Предприятие 8.2» Для принятия решения рекомендуется обращать внимание на природу данных предметной области. Если они обладают некоей «самостью», несмотря на смену значений отдельных свойств этого объекта, то предпочтение следует отдавать определению этих данных как объектных. Например, сотрудник может сменить фамилию, имя, паспорт, цвет глаз и т. д., однако при этом он останется все тем же сотрудником. Таким образом, мы рассмотрели типичный пример идентификации сотрудников предприятия как данных объектных и подлежащих учету посредством справочника. Однако следует учитывать, что выбор вида объекта конфигурации не должен производиться для каждой сущности отдельно. Необходимо анализиро- вать наличие и остальных сущностей в комплексе всей прикладной задачи. Причем желательно не только на текущий момент, но и с учетом развития задачи в будущем. Например, как определились выше, состав сотрудников предприятия целе- сообразно хранить посредством объекта конфигурации Справочник (рис. 1.14). Однако если взглянуть на проблему шире, может оказаться, что на самом деле тут смешиваются две сущности: «Физические лица» как отражение реальных людей, с которыми предстоит иметь депо в рамках решения; «Сотрудники подразделений предприятия», причем один и тот же человек может быть сотрудником нескольких подразделений предпри- ятия, выполняя в них различные задачи (должности, круг обязанносте( и проч.). Причем вторая сущность как объект нигде не фигурирует, просто нужно помнить «кто есть кто». Тогда хранение сотрудников подразделении может быть реализовано посредством регистра сведений (рис. 1.15). Справочник 'ФизическиеЛица" Ссылка Код Наимсниваниг Справочник "Сотрудники" Ссылка Код Наименование Рис. 1.14. Таблица справочника «Сотрудники» Регистр сведений "Сотрудники!! од разделений" ФизЛицо Подразделение ДОЛЖНО! гь -> Рис. 1.15. Связь таблицы справочника и таблицы регистра сведений
Глава 1. Хранение информации 29 Если аналогичным образом рассматривать хранение данных о сотрудниках и их трудовых договорах, то можно также выделить две сущности: «Физическое лицо»; «Сотрудник - трудовой договор» как отражение юридических отношений данного лица с организацией, имеющее при этом объектную природу, поскольку впоследствии ссылка на трудовой договор будет фигурировать во многих документах и регламентированных отчетах. В этом случае для хранения данных следует использовать два справочника, один из которых (справочник ТрудовыеДоговораСотрудников) будет подчинен другому (справочник ФизическиеЛица), рис. 1.16. Справочник "ФизическиеЛица" Ссылка Код Наименование Справочник "Т рудовыеДоговораСотрудников” Ссылка Код Наименование ФизЛицо ◄ — Рис. 1.16. Связь таблиц справочников Таким образом, выбор каждого из вариантов хранения информации опре- деляется тем, какую сущность предметной области будет отражать тот или иной объект. При этом разработчикам рекомендуется также и имя объекта определять так, чтобы оно максимально отражало описываемую сущность. Это позволит впоследствии обеспечить правильное восприятие и использо- вание объекта. Хранение информации в самих объектах или в других объектах Необходимо помнить, что любой объект - это единая сущность с точки зрения манипулирования данными. То есть при любых операциях с объектом (чтение, запись, модификация) происходит обращение к информации базы данных, касающейся всего объекта. Например, справочник ДоговорыКонтрагентов имеет подчиненные объекты.' два реквизита (ДатаПоставки и ВидДоговора) и табличную часть Специфи- кация. В свою очередь, в состав табличной части тоже входит ряд реквизитов (рис. 1.17).
30 Реализация прикладных задач в системе «1С:Предприятие 8.2» ДоговорыК онтрагентов е И 0 « Реквизиты ДатаПоставки “ В ид Договора ® ЙЗ Т абличные части © J3 Спецификация в Номенклатура ““ Количество « Цена “ Сумма Рис. 1.17. Структура справочника «ДоговорыКонтрагентов» Хранение этой информации в базе данных будет реализовано системой следу- ющим образом: В основной таблице справочника будет храниться информация в следу- ющих полях: □ Ссылка, □ Код, □ Наименование, □ Пометка удаления, □ Предопределенный, □ Родитель, □ Владелец, □ Это Группа, □ ДатаПоставки, □ ВидДоговора. Информация табличной части Спецификация — в отдельной таблице, содер- жащей следующие поля: □ Ссылка (значение этого поля равно значению поля Ссылка основной таблицы справочника); □ НомерСтроки; □ Номенклатура; □ Количество; □ Цена; □ Сумма. Любое обращение к объекту документа приведет к тому, что из базы данных будет считана информация, соответствующая данному объекту, из обеих таблиц.
Глава 1. Хранение информации При этом не важно, как именно выполнялось обращение: посредством метода ПолучитьОбъект () из ссылки (листинг 1.9) или при открытии формы, основным реквизитом которой является объект договора (рис. 1.18). Листинг 1.9. Пример получения объекта справочника из ссылки Объект Справочника Форма элемента справочника (основной реквизит - объект справочника) Отображение реквизитов Т аблица справочника Ссылка — Отображение данных табличной части Т аблица табличной части справочника Ссылка -> -> Рис. 1.18. Открытие формы объекта, отображающей табличную часть В последнем случае, кстати, не важно, будут отображаться на форме данные табличной части элемента или нет (рис. 1.19). Объект Справочника Форма элемента справочника (основной реквизит - объект справочника) Отображение реквизитов Т аблица справочника Ссылка — Т аблица табличной части справочника Ссылка -> -> -► Рис. 1.19. Открытие формы объекта, в которой табличная часть не отображается
Реализация прикладных задач в системе «1С:Предприятие 8.2» Объект в любом случае считывается целиком, поскольку при открытии формы платформа также создает объект справочника, обеспечивая тем самым целостность изменений, вносимых в данные объекта как интерактивно, так и программно, в модуле формы. Данную особенность нужно иметь в виду для сущностей, при работе с кото- рыми часто необходим доступ именно к объектам, а не ссылкам (например, объекты, которые часто модифицируются пользователями). При чтении объекта или его модификации данные будут считываться и записываться по объекту целиком. Таким образом, чем меньше этих данных будет, тем быстрее будут выполняться операции, меньше будет продолжительность блокировок и т. д. Из этого можно сделать вывод, что информацию, которую предполагается хранить в объектах, следует анализировать на предмет разделения на активно используемую и неактивно используемую. Активно используемую инфор- мацию можно хранить в реквизитах самого объекта или его табличных частей. Неактивно используемую информацию об объекте можно хранить не в самом объекте, а посредством других информационных структур. Однако при этом придется самостоятельно заботиться о поддержании целостности изменений при модификации данных объекта. Для вышеприведенного примера, если информацию спецификаций можно считать «неактивно используемой», ее хранение можно организовать посредством, например, регистра сведений СпецификацииДоговоров или подчиненного справочника СпецификацииДоговоров. И в том и в другом случае при считывании объекта договора обращение к информации спецификации выполняться не будет (рис. 1.20). Объект Справочника Форма элемента справочника (основной реквизит - объект справочника) Отображение реквизитов Т аблица справочника Ссылка — Т аблица подчиненного справочника В псделец -> -► Рис. 1.20. Открытие формы объекта
Глава 1. Хранение информации 33 Однако при необходимости выполнить такое обращение это будет легко сделать, например, с помощью запроса (листинг 1.10). Листинг 1.10. Пример получения данных подчиненного справочника запросом Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ СпецификацииДоговоров.Код, СпецификацииДоговоров.Наименование, СпецификацииДоговоров.Номенклатура, СпецификацииДоговоров.Количество, СпецификацииДоговоров.Цена, СпецификацииДоговоров.Сумма ИЗ Справочник.СпецификацииДоговоров КАК СпецификацииДоговоров ГДЕ СпецификацииДоговоров.Владелец = &Владелеця; Запрос.УстановитьПараметр("Владелеця, Договор); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл II Выполнить действия с информацией строки спецификации //... КонецЦикпа; В этом случае из базы данных будет считана лишь нужная информация спецификаций, относящаяся к договору, ссылка на который содержится в переменной Договор. Обратиться к данным подчиненного справочника можно и с помощью объек- тной модели работы с данными (листинг 1.11). Листинг 1.11. Получение данных подчиненного справочника с помощью объектной модели работы с данными СсылкаНаВладельца = Договор; Выборка = Справочники.СпецификацииДоговоров.Выбрать(,СсылкаНаВладельца); Пока Выборка.Следующий() Цикл // Выполнить действия с информацией строки спецификации КонецЦикпа; В этом случае, в отличие от табличной модели работы с данными, будут считаны целиком объекты элементов подчиненного справочника.
34 Реализация прикладных задач в системе «1С.Предприятие 8.2» При выборе того или иного варианта хранения, кроме разницы между «хране- нием необъектных данных» и «хранением объектных данных» (рассмотренной в разделе «Хранение информации объектных и необъектных сущностей» на стр. 27), можно еще учесть требования к уникальности информации, накла- дываемые используемыми объектами системы «1С:Предприятие». Если необходимо обеспечить жесткую уникальность понятия «номенкла- турная позиция спецификации договора» (то есть одна и та же номенклатурная позиция не может быть указана более одного раза в спецификации одного договора), тогда предпочтительнее вариант с использованием регистра сведений. Он как раз позволяет хранить только уникальную с точки зрения ключевых полей информацию (в данном случае - измерений Договор и Номенклатура). Для подчиненного же справочника таких ограничений по уникальности нет. Если необходимо хранить информацию в виде простой таблицы, то вариант с использованием подчиненного справочника будет предпочтительнее. Аналогична цепочка рассуждений, если в ходе решения некоей прикладной задачи на этапе конфигурирования для объекта необходимо ввести много признаков или особых свойств. Одно дело, если эти свойства и признаки касаются всех элементов данной сущности и активно используются при работе с объектами, им соответствую- щими. Тогда информацию данных свойств уместно хранить в виде реквизитов объекта. Например- реквизит Услуга булевого типа для справочника Номенклатура. Очень многие прикладные механизмы, работающие с элементами справоч- ника Номенклатура, должны быстро различать ситуации работы с услугами или материальными номенклатурными позициями. Другое дело, если этот признак касается лишь некоторых элементов и используется лишь в отдельных механизмах. Тогда для хранения этой информации нерационально использовать реквизиты, а можно использовать другие объекты. Например, информацию о том, какие из физических лиц являются пользова- телями, уместнее хранить в отдельном справочнике (с реквизитом ФизЛицо) или в соответствующем регистре сведении. Кроме того, возможна ситуация, когда необходимо, чтобы новые признаки и характеристики могли вводиться не только на этапе конфигурирования (разработчиками), но и в режиме работы «1С'Предприятие» - пользова- телями. Для реализации этой возможности удобна организация хранения информации с использованием объекта План видов характеристик. Более подробно этой теме посвящен раздел «Хранение дополнительных
Глава 1. Хранение информации характеристик произвольного типа. Использование плана видов характе- ристик» на стр. 114. В ситуации, когда требуется с помощью специальных свойств выделить только один элемент, использование реквизитов объектов вообще является неверным. Например, введение булевого реквизита Базо- ваяВалюта в состав справочника Валюты нерационально, как с точки зрения хранения информации (поле будет существовать для всех элементов, хотя значение Истина с прикладной точки зрения уместно только у одного элемента), так и с точки зрения быстродействия. Для корректного разре- шения подобных ситуаций уместно считать элементы, обладающие такими специальными свойствами, данными, общими для всей базы данных, и организовывать хранение информации об этом посредством констант или регистров сведений. Так же осторожно нужно подходить к использованию строковых рекви- зитов неограниченной длины. Крайне не рекомендуется использовать их для хранения информации, объем которой может быть достаточно большим или непрогнозируемым. Примером такого некорректного использования рекви- зита может служить сохранение в реквизите значения, получаемого функцией ЗначениеВСтрокуВнутрО (например, для таблицы значений, содержащей большое количество строк). Не рекомендуется хранить в реквизитах активно используемых объектов картинки и образы файлов (использование полей типа ХранилищеЗна- чения), если заранее известно, что размер их будет велик. Для сохранения подобно! информации следует использовать альтернативные методы. Хранение иерархической информации Иерархическими принято считать структуры, у которых четко прослежива- ются отношения «один ко многим». Например, «один руководитель - много подчиненных» (рис. 1.21). Рис. 1.21. Пример одноуровневой иерархии Кроме того, уровней иерархии может быть больше одного: «один руково- дитель, в подчинении которого находятся руководители подразделений, в подчинении которых находятся подчиненные» - пример трехуровневой иерархической структуры (рис. 1.22). Ну а в общем случае уровней может быть значительно больше.
36 Реализация прикладных задач в системе «ЮПредприятие 8.2» Рис. 1.22. Пример многоуровневой иерархии Необходимо отметить, что в прикладных задачах в любом случае использу- ется не бесконечное количество уровней иерархии. Например, хотя и говорят, что бюрократия бесконечна, но, составляя организационно-штатную струк- туру любой организации, всегда приходим к конечному количеству уровней подчинения, ответственности и т.д. В данном разделе мы не будем обсуждать достоинства и недостатки исполь- зования иерархических структур в области их применения. Сосредоточимся на возможностях организации хранения иерархической информации средс- твами системы «1С:Предприятие». Для «экономного» хранения информации об иерархичности хранимых данных достаточно, если каждый из нижестоящих элементов будет помнить ссылку на непосредственно стоящий над ним элемент. Таким образом, информацию об иерархии можно хранить не только в виде схем, но и в виде таблиц. Например, информация о вышеприведенной схеме может храниться так, как показано в табл. 1.1. Таблица 1.1. Пример хранения иерархической информации Сотрудник Руководитель Директор Руководитель отдела закупок Директор Менеджер по закупкам Руководитель отдела закупок Товаровед Руководитель отдела закупок Руководитель отдела продаж Директор Менеджер по продажам Руководитель отдела продаж Продавец Руководитель отдела продаж Секретарь Директор Каждая строка таблицы содержит информацию по одной персоне. Для каждой строки таблицы упоминание некоей персоны в поле Руководитель означает, что данный сотрудник непосредственно подчинен именно этому руководи-
Глава 1. Хранение информации :-^Ж. телю (а в информации по этому руководителю будет указано, кому он, в свою очередь, подчинен). В строке, отражающей информацию по директору, поле Руководитель пустое. Это значит, что в данной схеме у директора нет руково- дителей. Еще говорят «директор находится на корневом уровне иерархии». Данный прием применяется при хранении иерархической информации объектов прикладной области на уровне объектов базы данных системы «1С:Предприятие». То есть «нижестоящие» элементы должны помнить ссылку на «вышестоящие» элементы иерархии. Однако это не значит, что разработчик в каждом отдельно взятом случае должен «доводить» выполнение этого приема до уровня таблиц базы данных. В типовых ситуациях эту работу берет на себя сама платформа. Разберем, что же это за ситуации. При разработке бизнес-решений разработчику чаще всего приходится иметь дело с иерархическими структурами при организации хранения условно- постоянной информации (справочники, планы видов характеристик), реже - при работе с регистрацией событий. В отношении хранения условно-постоянной информации учтены следующие ситуации: иерархия объектных данных одной сущности (рассматривается в разделе «Хранение иерархии данных одной сущности» на стр. 38); иерархия объектных данных разных сущностей (рассматривается в разделе «Хранение иерархии данных разных сущностей» на стр. 48); хранение иерархии необъектных данных внутри объекта (рассматривается в разделе «Хранение подчиненных данных в составе объекта» на стр. 42); хранение иерархии необъекгных данных вне объекта (рассматривается в разделе «Хранение подчиненных данных вне объекта» на стр. 48). В остальных же случаях или для реализации ситуаций иерархии событий разработчик всегда может реализовать свою иерархическую схему посредс- твом добавления реквизита к «подчиненным» объектам, значением которого должна являться ссылка на объект-владелец. Например, в рамках некоторого договора был оформлен документ ЗаказПо- купателя. На основании документа ЗаказПокупателя был введен документ РеализацияТоваров. На основании документа РеализацияТоваров были введены документы СчетФактура и ПриходныйКассовыйОрдер. Впоследствии часть товара была возвращена, то есть на основании документа Реализа- цияТоваров был введен документ ВозвратТоваровОтПокупателя. Аналогичная цепочка документов может быть оформлена в отношении другого документа ЗаказПокупателя (рис. 1.23).
38 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 1.23. Структура документов, введенных на основании Необходимо хранить информацию о том, что все эти документы находятся в иерархии конкретного договора с покупателем. Решается данная задача включением в состав всех объектов, которые могут подчиняться договору, реквизита, например, Основание, ссылающегося на данный договор. Этот пример более широко (в отношении вопросов ввода на основании, отображения иерархии подчинения договору) рассмотрен в разделе «Ввод на основании», на стр. 204 и приведен в составе демонстрационной конфигу- рации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. Хранение иерархии данных одной сущности Выше (см. табл. 1.1) обсуждалась схема организационно-штатной структуры компании (рис 1.24). Рис. 1.24. Организационно-штатная структура компании
Глава 1. Хранение информации 39 Допустим, при проектировании принято решение, что персоналии, отраженные в схеме, относятся к одной сущности прикладной области - пользователи программы, и являются примерами данных объектного типа. Как информация об этой иерархии может быть отражена средствами плат- формы «ЮПредприятие»? Для этого при разработке следует произвести настройку свойств объекта конфигурации - справочника Пользователи, касающихся иерархии справоч- ника. А именно: справочник - Иерархический, вид иерархии - Иерархия элементов (то есть нижестоящие элементы справочника иерархически подчиняются вышестоящим - именно элементам справочника), количество уровней иерархии ограничено - только три (рис. 1.25). Добавляет поле "Родитель" Позволяет ограничить количество уровней иерархии Рис. 1.25. Настройка иерархии справочника «Пользователи» Дальнейшую работу возьмет на себя платформа. В состав основной таблицы справочника Пользователи будет добавлено поле Родитель для хранения в записях иерархически подчиненных элементов ссылок на элементы, которым они непосредственно иерархически подчиняются. Обращение к этому предопределенному полю будет возможно посредством соответствующих объектов встроенного языка для манипулирования данными справочника или посредством запросов. Кроме того, при записи и модификации данных в справочнике Пользователи платформа будет отслеживать ограничение по количеству уровней иерархии, не позволяя реализовать попытки их превышения, выдавая соответствующие предупрежден ия.
Реализация прикладных задач в системе «^Предприятие 8.2» Помимо этого, в расширения соответствующих форм и элементов форм будут включены средства, облегчающие решение задач отображения информации справочника в иерархическом виде. Например, возможность отображения списка справочника в виде дерева или иерархического списка (рис. 1.26). Рис. 1.26. Отображение справочника «Пользователи» в виде иерархического списка Пример реализации подобной схемы приведен в демонстрационной конфи- гурации «Хранение информации и учет движения средств» (справочник Пользователи), которая находится на прилагаемом компакт-диске. Рассмотренный выше пример касался случая иерархии элементов. Однако могут встречаться задачи, когда иерархия используется лишь для логического упорядочивания хранения и отображения данных объектных сущностей. Например, данные справочника Номенклатура удобнее представлять в виде упорядочивания по товарным группам (рис. 1.27). Родители - группы Кор 43 Номенклатура'4^ Наименование Сам родитель - лишь средство упорядочивания элементов (реквизитами не обладает) । । Остаток Закути >чн1я ц... 11ииное наименова. Клавиатуры Копировальные аппараты I I I J^OHHTOgbl^ I « Qi 000000025 000000003 .СЪ 000000002 Мыши 00000. Мышь 2-кнопА4ТесИ PS/2 16,00 1,20 Мышь 2-кноп A4TeS “ 00000... Мышь 3D-Sensor 2,35 Мышь 3D-Sensor “ 00000.. Мышь uENIUS "EASY" (3 i нопки) 42,00 1,10 Мышь GENIUS "EA. « 00000.. Мышь Ice Mouse MUS-2 24,00 1,15 MUS2P/100-PS Мы... =» 00000 Мышь LOGITECH M-S48 PS/2 t.OO 0,80 Мышь LOGITECH “ ООООи Мышь OK-720 Mouse A4Tech PS/2 |l.00 1.15 Мышь OK-720 Muu J 00000. . Мышь r’UUY 1,45 MbiujbYLIUY(234hy 0" 1 'j IЮОООООР’ Ноутбуки ‘k О 000000004 Принтеры I Элементы справочника, входящие в группу Рис. 1.27. Отображение справочника «Номенклатура» в ниде дерева
Глава 1. Хранение информации 41 Обратите внимание: каждый конечный элемент обладает конкретной заку- почной ценой. Однако говорить о значении закупочной цены родителя этих элементов - нонсенс с прикладной точки зрения. Таким образом, свойства элементов и свойства их родителей отличаются друг от друга. Для реали- зации решений подобных задач используется вид иерархии Иерархия групп и элементов. С точки зрения хранения данных в базе данных для двух видов иерархии большой разницы нет, но для прикладной и интерфейсной функциональности возможности отличаются сильно. Каждый реквизит объекта справочника или плана вида характеристик, если используется иерархия групп и элементов, может иметь следующие значения свойства Использование: Для элемента, Для группы, Для группы и элемента. Это позволяет легче решать задачи, для которых необходимо выделять свойства, присущие нужным уровням иерархии. Например, значение реквизита ОтветственныйМенеджер присуще только группам справочника Контрагенты. Считается, что все элементы нижестоящих уровней данной группы закреплены за этим менеджером (рис. 1.28). В этом случае для реквизита ОтветственныйМенеджер значение свойства Использо- вание указывается - Для группы. Контрагенты ^Создать Qi 5^ Х| (Д Найти... *» Все действия - ? Наименование jS. Кед Ответственный менеджер 1 Вид Тип цен ' © LZ f онтрагенты Семенов • “ Гамаюн, ООО 000000003 ! “ Компания "Риона" "ц'^-чЦ00000004 © иЗ ЧастныеЛица OOOODO0Q2_ Д, - 1 1 1 1 1 - ft И. |ЗД1 М Mt*W* Покупатели (Контрагенты) записать и закры гь лД Все действия - ? Код: (000000001 ) Наименование ВВЯДЕЯЩ ) Родитель: ( Q Ответственный менеджер: [Семенов ,,, Q I Розничная JyOf ^Предприятие) Й,,’SV-LUrX- '• -• Гамаюн, ООО (Контрагент) Записать и закрыл @ Все действия » (g) Код: (000000003 ] Н аи .1еноьани“ | ИДИНЫМ Родитель: [Покупатели [.,. Q Вид: ( [.., Т ип цен: [Розничная Почтовый адрес: [ Рис. 1.28. Группы и элементы справочника «Контрагенты»
42 Реализация прикладных задач в системе «ЮПредприятие 8.2» Выгоды использования такого решения проявятся, например, при решении задачи «перезакрепления» контрагентов за другим менеджером. Чтобы «пере- закрепить» все элементы, входящие в группу, не обязательно будет указывать каждому контрагенту его нового ответственного менеджера, достаточно лишь указать другое значение реквизита ОтветственныйМенеджер для этой группы. С другой стороны, реквизит ОтветственныйМенеджер можно сделать использу- емым и группами, и элементами. Тогда предложенная выше схема закрепления сможет учитывать ситуации, когда контрагент находится в группе, закреп- ленной за одним менеджером, но сам закреплен за другим менеджером. Для интерфейсных задач при использовании данного вида иерархии плат- форма опять же берет на себя решения большинства вопросов различного поведения групп и элементов: «разделение» форм на основную форму элемента и основную форму группы для операций заполнения и просмотра данных объектов, «разделение» на форму выбора и форму выбора группы для реализации операций выбора; определение того, в каких ситуациях правомерен выбор групп, а в каких нет (по умолчанию, например, реквизиты документов интерактивно могут заполняться только значениями элементов); использование отбора динамического списка, содержащего таблицу справочника (ЭтоГруппа = Истина/Ложь), позволяющего просматри- вать (в зависимости от необходимости) только элементы, только группы или элементы и группы; и так далее. Хранение подчиненных данных в составе объекта Практически все объекты системы «1С:Предприятие», предназначенные для хранения данных объектных сущностей (справочники, документы, планы видов характеристик, планы видов расчета и т. д.), имеют возмож ность хранить свою информацию не только в виде значений реквизитов, но и в составе подчиненных табличных частей. Подобным образом также может решаться задача хранения информации «один ко многим», рассмотренная ранее в разделе «Хранение иерархической информации» на стр. 35. В качестве примера возьмем все ту же организаци- онно-штатную структуру компании (см. рис. 1.24). Допустим на ее основе необходимо реализовать хранение информации об объектной сущности «Руководители». Решение может быть реализовано в виде справочника Руководители так, чтобы руководители были элементами
Глава 1. Хранение информации 43 справочника, а рядовые сотрудники указывались в строках табличной части ПодчиненныеРядовыеСотрудники как ссылки на элементы справочника Физи- ческиеЛица (рис. 1.29). Рис. 1.29. Схема хранения данных справочника «Руководители» В результате в системе будет реализовано хранение информации об объек- тных сущностях - «Руководителях», с указанием подчиненных в качестве их описания. Однако необходимо иметь в виду, что информация строк подчиненной табличной части не имеет своей объектной сущности. То есть при данном способе хранения информации нельзя будет сослаться ни на одного «рядового подчиненного некоего руководителя». В составе документов можно будет создавать реквизиты с типом значения СправочникСсылка. Руководи- тели, но нельзя будет создать реквизиты, ссылающиеся на строки табличной части ПодчиненныеРядовыеСотрудники. Для задач, когда ссылка на такие сведения смысла не имеет, хранение множества подчиненных данных, характеризующих данный объект, внутри самого объекта может быть весьма удобным. Классическим примером являются документы с такими табличными частями, как ПоступлениеТоваров, Состав, Событие, СторонниеЛица и т.д. Схемы, когда подчиненная информация сама имеет иерархический вид, также могут быть реализованы внутри объекта, если это покажется удобным. Например, при оформлении заказа покупателя необходимо дать возможность пользователю вводить не только информацию о том, какие номенклатурные позиции, в каком количестве и по какой цене желает приобрести покупатель,
44 Реализация прикладных задач в системе «ЮПредприятие 8.2» но и еще произвольное количество дополнительных пожеланий по любой номенклатурной позиции в свободной форме, с возможностью отметки, насколько эти пожелания действительно важны. Представление информации в этом случае может быть отображено следу- ющей таблицей (табл. 1.2). Таблица 1.2. Схема представления информации Заказ Номенклатура Количество Цена Сумма Пожелания Заказ № 3 от 12.02.10 Лазерный принтер Canon LBP-810 2 200 400 Белого цвета Дополнительно упаковать в гофро-тару Телефон LG W7200 10 30 300 Без гарнитуры Доставку приурочить к 8 марта Цвет любой, только не черный Поскольку речь идет о регистрации события «Заказ покупателя», то для хранения информации логично использовать объект - документ ЗаказПокупа- теля. Таким образом, получаем три уровня иерархии. документ; указание номенклатурных позиций документа с количественно-суммо- выми характеристиками; указание дополнительных пожеланий к номенклатурным позициям. Реализация хранения этой информации может быть организована следующим образом. Для хранения информации о заказанных товарах с количественно- суммовыми характеристиками можно использовать табличную часть Состав. Но дополнительные пожелания будет неудобно хранить в рамках этой таб- личной части. Как показано в таблице выше, к одной номенклатурной позиции может предъявляться более одного требования и форма информации этих требований более «свободная», нежели указание цены, количества и суммы. В этом случае для хранения информации о дополнительных пожеланиях покупателя, если эту информацию нужно хранить внутри объекта, можно использовать еще одну табличную часть ДополнительныеТребования. Рекви- зитами табличной части ДополнительныеТребования будут Требование, Важно и Номенклатура (рис. 1.30). Соответствие с информацией табличной части Состав будет организованно именно по номенклатурным позициям. Дополнительны t сервис для пользователя может касаться вопроса подбора номенклатурных позиций в табличную часть ДополнительныеТребования только из перечисленных в табличной части Состав.
Глава 1. Хранение информации ЗаказП оку пате ля С-j а* Реквизиты ““ Контрагент ““ Договор «“ Размещение в ES Т абличные части Э L5 Состав “* Номенклатура “ Количество «и Цена “ Сумма 'Э Ш Дополнительные?ребования ““ Номенклатура “ Т ребование “ Важно Рис. 1.30. Структура документа «ЗаказПокупателя» В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в форме доку- мента - ЗаказПокупателя приведен один из вариантов решения этой задачи. В форме документа расположена многостраничная группа с двумя заклад- ками - Состав и Дополнительные требования (рис. 1.31). Заказ покупателя 000000001 от 15.04.2010 22:34:11 Пронести и закрыть |q| Провести Создать на основании ’ Все действия » ? 1000000001 Номер: Контрагент: [Компания "Риона" Договор: Размещение: [Резерв 123/14К Дата: [l 5.04.2010 22:34:11 г Состав : Г ^Добавить i.^> X Требовании Все действия » Важно Мышь 2-кноп А4Т ech PS/2 'ТГ । Номенклатура N 1 Мышь 2-кноп А4Тech PS/2 Только черного цвета 2 Мышь 3D-Sencof | Т елесрон LG W7200 Рис. 1.31. Форма документа «ЗаказПокупателя» Поскольку для выполнения операций заполнения дополнительных требований пользователь сначала должен будет открыть соответствующую закладку, у многостраничной группы Страницы обработчик события смены страницы реализован в виде следующей процедуры (листинг 1.12).
46 Реализация прикладных задач в системе «ЮПредприятие 8.2» Листинг 1.12. Обработчик события «ПриСменеСтраницы» &НаКлиенте Процедура СтрзницыПриСменеСтраницы(Элемент ТекущаяСтраница) // Проверить, активизирована ли закладка "Дополнительные требования" Если ТекущаяСтраиица.Имя = ТруппаДополнительныеТребования" Тогда II Заполнить список выбора у колонки "Номенклатура" таблицы формы II "Дополнительные требования" // списком номенклатурных позиций, использованных в табличной части "Состав" ПолучитьСоставНоменклатуры(); КонецЕсли; КонецПроцедуры В процедуре обработки события ПриСменеСтраницы, если имя текущей страницы - ГруппаДополнительныеТребования, вызывается серверная проце- дура ПолучитьСоставНоменклатуры(), в которой происходит заполнение списка выбора у колонки Номенклатура таблицы формы ДополнительныеТребо- вания списком номенклатурных позиций, использованных в табличной части Состав (листинг 1.13). Листинг 1.13. Процедура «ПолучитьСоставНоменклатуры()» &НаСервере Процедура ПолучитьСоставНоменклатуры() II Очистить список выбора у колонки "Номенклатура" таблицы формы "Дополнительные требования" Элементы.ДополнительныеТребованияНоменклатура.СписокВыбора.Очистить(); II Выгрузить список номенклатурных позиций, использованных в табличной части "Состав", II в таблицу значений ТЗСоставНоменклатуры = Объект.Состав.Выгрузить(."Номенклатура"); Для Каждого СтрокаТЗ ИЗ ТЗСоставНоменклатуры Цикл Элементы .ДополнительныеТребованияНоменклатура .СписокВыбора.Добавить(СтрокаТЗ.Номенклатура); КонецЦикпа КэнецПооцедуры аким образом, возможности выбора номенклатурных позиций на стра- нице ДополнительныеТребования будут ограничены списком номенклатурных позиций, использованных в табличной части Состав. Для этого необхо- димо включить свойство РежимВыбораИзСписка у колонки Номенклатура таблицы формы ДополнительныеТребования (рис. 1.32).
Глава 1. Хранение информации & х Ф о ' Дата:) Состав I ‘ Дополнительные требования Добавить X ♦ ♦ Цена Количество Дополнительные!ребивэнияНоменклатург f X Номер: Контрагент: Договор: Размещение: [Авто MrowmnmtBjfc ш- ® Модуль Форма N Номенклатура ^Реквизиты j! 1 Рис. 1.32. Свойства колонки «Номенклатура» таблицы формы «ДополнительныеТребования» ии Командная панель > СоставНомерСтроки ", Объект. Состав. НомерСтроки' “ СоставКоличество “ СоставЦена “ СоставСумма А -«лJ ГруппаДополнительныеТребсвания 5 л 1-1 Дополнительные!ребования Командная панель “ Дополнительные! ребованияНомерГ троки jg Элементы J § Кси гандный । нтерФейс ПдоммйГМ v шкрып»? (| *, Провести * Реквизит OTjbeKf Все действия » ф ...Q Все действия Использовать Тип всегда (Д оку ментО бъект. ЗаказП окупате ля] РежимВ ыбораИ зСписка КнопкаВыбора КнопкаОчистки КнопкаРегулирования КнопкаОткрытия ВыбиратьТип СписокВыбора РежимВ ыбораН езаполненного Редактирование!екста АвтоОтметкаНезаполненного АвтоВыборН езаполненного ВыборГ руппИЭ леменгов СвязиПараметровВыбора ПараметрыВыбора БыстрыйВыбор Авто [Авто » ;Авто » В X; [ ; При нажатии Enter ж (Авто (Авто Г. [Авто Г ... х ' _ _ ’г-А xv Необходимо заметить, что в данном примере иерархических данных не реализована связь «один ко многим» в чистом виде. Ведь информация «номенклатурная позиция заказа покупателя» не относится к объектным данным. В общем случае одна и та же номенклатурная позиция может быть указана сколько угодно раз в табличном поле Состав. И значит, невозможно установить, к какой именно строке состава (с этой номенклатурной позицией) относятся пожелания покупателя, описанные в табличной части Дополнитель- ныеТребования. Однако в постановке задачи это и не требовалось. То есть либо такие ситуации не критичны для логики работы разрабатываемого решения, либо пользователь сам может описать, что имелось в виду, в строковом рекви- зите Требование. В ситуациях же, когда поддержание однозначности связей «один ко многим» критично, разработчику необходимо будет решать этот вопрос. Для этого следует либо дополнительно обеспечивать уникальность значений реквизитов или комбинаций значений реквизитов в самом объекте, либо «выносить» хранение этой информации в другие объекты, специально предназначенные для обеспечения уникальности комбинаций значений сущностей, - регистры сведений.
48 Реализация прикладных задач в системе «^Предприятие 8.2» Хранение иерархии данных разных сущностей Допустим, необходимо организовать хранение информации по предыдущей трудовой деятельности каждого сотрудника компании. Сами сотрудники признаны сущностями объектного типа, и для хранения их информации в рамках решения создан справочник Сотрудники. Как решить задачу? ( одной стороны, данная информация непосредственно связана с сотрудником и могла бы быть реализована посредством вклю- чения табличной части Трудовая Деятельность в состав объектов справочника Сотрудники. Но к выбору такого варианта нужно подходить осторожно. Как обсуждалось в разделе «Хранение подчиненных данных в составе объекта» (см. стр. 42), подчиненные табличные части предназначены для учета только необъектных сущностей. То есть при таком решении в других объектах системы невоз- можно будет использовать поля пли реквизиты, соответствующие понятию «место предыдущей работы конкретного сотрудника». Если же необходимость в такой объектной сущности есть или может появиться, то решение видится в использовании подчиненного справочника ТрудоваяДеятельность. В его элементах можно хранить информацию о долж- ности, месте работы, дате начала деятельности, дате окончания деятельности по каждому эпизоду предыдущей работы сотрудника. Впоследствии эта сущность может быть использована, например, цля орга- низации структуры регистра накопления СтажРаботы или для заполнения реквизитов соответствующих документов. Хранение подчиненных данных вне объекта Для хранения необъектных данных, соответствующих определенным комби- нациям значений измерений, предназначены регистры сведений. Более подробно устройство и функциональность регистров сведений рассмотрены в разделе «Хранение информации в регистрах сведений» на стр. 54. Сейчас же рассмотрим лишь один пример. В торговой компании покупатели закреплены за менеджерами, их обслужи- вающими. Сами менеджеры компании, в свою очередь, относятся к тому или иному департаменту. Необходимо иметь представление, кто за кем закреплен на каждый момент времени. В данном случае вариант хранения информации в регистре сведений пред- почтителен тем, что автоматически будет обеспечена уникальность значений измерений. То есть в регистре ЗакреплениеПокупателей невозможно будет создать две записи с одним и тем же покупателем (соответственно, невоз- можно одного покупателя закрепить за несколькими менеджерами). Аналогично в отношении регистра ЗакреплениеМенеджеров.
Глава 1. Хранение информации Кроме того, регистры сведений позволяют хранить не только статические варианты иерархических структур, но и изменяющиеся во времени. Если указанные регистры сведений сделать периодическими, то впоследствии можно будет легко хранить динамику картины отношений, то есть отражать в системе все изменения, касающиеся закреплений (например, менеджер со всей своей клиентской базой передан другому департаменту). И так же легко получать информацию о состоянии модели закреплений на любой момент времени. Также для ситуаций, когда в готовое (и эксплуатируемое) решение приходится вводить новые сущности, добавление новых измерений к регистру сведений позволяет легко решать задачи усложнения «взаимоотношений» данных. Например, начиная с какого-то момента, закрепление покупателей за менед- жерами продолжает оставаться однозначным, но только в рамках конкретных проектов. То есть в основном проекте Торговля за обслуживание некоего поку- пателя по-прежнему отвечает тот же менеджер, но в проекте Информационное сопровождение - совсем другой (да еще и из другого департамента). С точки зрения классификации ситуации хранения данных такое изменение «революционно», отдельные его части можно даже рассматривать как переход от схемы «один ко многим» к схеме «многие ко многим». Однако сама реали- зация подобного «поворота событий» очень проста. В состав регистра ЗакреплениеПокупателей достаточно добавить измерение Проект. И поскольку система обеспечивает в регистре сведений уникальность комбинаций значений измерений, задача уже фактически решена. Остается лишь согласовать с пользователями, будет ли в регистре сведений ЗакреплениеПокупателей пустая ссылка на проект (для старых данных) с прикладной точки зрения восприниматься проектом основной деятельности предприятия - Торговля, либо необходимо произвести соответствующую обра- ботку для заполнения этих данных. Так же легко в состав регистра сведений может быть введена дополнительная информация, характеризующая конкретные комбинации значений измерений. Это реализуется посредством добавления ресурсов. Например, для регистра ЗакреплениеПокупателей могут быть введены такие ресурсы, как Лояльность, Частота Контактов, СуммаКвотыПродаж и так далее. Для регистра ЗакреплениеМенеджеров могут быть введены такие ресурсы, как БазовыйОклад, ПроцентПремии, Эффективность и тому подобное.
Реализация прикладных задач в системе «ЮПредприятие 8.2» Хранение информации, имеющей привязку ко времени Практически все объекты, поддерживающие возможность добавления новых полей (значении, реквизитов), могут работать с данными типа Дата. Но зачастую предметом хранения является не информация о датах, а другая информация, которая просто должна храниться в привязке ко времени. Например, необходимо помнить, начиная с какого момента времени для таких-то номенклатурных позиций действуют такие то цены. Информацию, хранящуюся в привязке ко времени, чаще всего разделяют на содержащую: объектные данные, необъект ные данные. Использование документов В задачах хранения объектных данных, привязанных ко времени, речь обычно идет о регистрации неких событий и всего, что с ними связано, например, в хозяйственной жизни предприятия. Чаще всего для хранения такой инфор мации выбираются объекты Документ. В нашем примере (с хранением информации о ценах), если необходимо в привязке ко времени фиксировать, как ж вследствие какого события) произошло изменение цен, то для хранения этой информации можно исполь- зовать документ ИзменениеЦенКомпании (.рис. 1.33). Пленение. (1С:Прдериятие) м, ' 31, | т Изменение цен компании 000000001 от 16.04.2010 21:54. Провести и закрыть д| ' Провести Все действия ’ (000000001 16 04.2010 21.54 41 Номер: Дата: Отьеп твенныи [Семенов ^Добавить X ем _______ - Все действия IN Номенклатура . Тип цены Цене Щ Пульт РХ Оптовая 150. Г 2 Пульт РХ Мелкооптовая 170,00 3 Пульт РХ Розничная 200,00 4 Пульт VH Оптовая 100,00 5 Пульт VH Мелкооптовая 30,00 Рис. 1.33. Документ «ИзменениеЦенКомпании»
Глава 1. Хранение информации 51 В пользу такого решения говорит функциональность объектов документов, поддерживаемая на уровне платформы «ЮПредприятие»: н заполнение, запись, проведение, формирование движений по регистрам, расположение на оси времени, пометка на удаление, удаление. Кроме этого, положительным моментом является возможность решения (средствами платформы) вопросов отображения списков документов, груп- пирования разных видов документов в единой хронологии для общего отображения или для общей обработки и так далее. Подробно эти вопросы освещены в главе «Документы и последовательности» на стр. 139. Использование периодических регистров сведений Как рассуждали выше, в разделе «Задачи хранения информации» на стр. 9, для решения учетных и аналитических задач кроме учета событий важно, чтобы система в определенных ситуациях учитывала показатели, которые изменяются или при обработке вышеуказанных событий, или вследствие других действий пользователя. Возможно, в нашем примере будет необходимо быстро получить ответ, для какого товара в такой-то момент времени действует такая-то цена. Получение этой информации из документов может оказаться неудобным или длительным по времени, потому что данные разных документов могут противоречить друг другу и для определения истины разработчику придется прописать некие алгоритмы. Использование периодических регистров сведений позволяет в данной ситу- ации (и подобных ей) достаточно быстро создать решение, большую часть функциональности которого поддерживает сама платформа (рис. 1.34). ЦеныНомею narypti в Регистры сведений s S G 1_ Измерения L. Номенклатура L. ТипИены t' I Ресурсы Цена с- в Реквизиты “ Ответственный Рис. 1.34. Структура регистра накопления «ЦеныНоменклатуры»
52 Реализация прикладных задач в системе «1С:Предприятие 8.2» Например, получение информации об актуальных значениях цен на неко- торый момент времени (рис. 1.35). Комбинации значений измерений Срез последних актуальных Пульт VX - Оптовая Пульт VX - Розничная устанавливаемые значения цен Пульт VX - Мелкооптовая временная ось Дата получения среза ("КонецП ериод а") Рис. 1.35. Схема получения актуальных цен Подробно вопросы состава и функциональности регистров сведений рассмотрены ниже, в разделе «Хранение информации в регистрах сведений» на стр. 54. При этом хотелось бы заметить, что в рассмотренном нами примере оба варианта (и использование документов, и использование периодических регистров сведений) для хранения данных, имеющих привязку ко времени, не противоречат друг другу. Они могут «мирно уживаться» в одном решении и обеспечивать каждый свою функциональность. И даже более того, помогают друг другу. Данный пример полностью приведен в составе демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. Использование объекта «ХранилищеЗначения» При решении вопросов хранения информации желательно различать инфор мацию, обеспечивающую основную бизнес-логику решения и другую вспомогательную информацию. Данные основной бизнес-логики активно используются в учетных и анали- тических механизмах. Для них важны такие вопросы, как индексирование, упорядочивание в запросах и выборках, суммирование, поиск и т. п. Вопросам обеспечения хранения этих данных, по сути, посвящена большая часть данной главы. Данные же вспомогательной информации нужно просто хранить. Все возможное манипулирование это! информацией сводится к операциям записи
Глава 1. Хранение информации 53 и чтения. Вопросам организации хранения такой информации посвящен текущий раздел. Итак, платформа системы «1С:Предприятие» предоставляет возможность хранения некоторой вспомогательной информации в базе данных посредс- твом полей типа ХранилищеЗначения. Особенностью использования таких полей является то, что база данных «не обязана ничего знать» о природе хранимой там информации. Это могут быть картинки, файлы, таблицы, данные примитивных типов, да что угодно. База данных отвечает лишь за хранение этой информации, не обеспечивая больше никакой функциональ- ности. При этом еще говорят, что тип значения ХранилищеЗначения позволяет хранить значения различных типов в сериализованном виде, то есть в виде, который позволяет записывать данные и восстанавливать их. ПРИМЕЧАНИЕ Для всех объектов, чьи данные сериализуются, в описании встроенного языка данная возможность указывается отметкой «Сериализуется». Важной особенностью хранилища значений является возможность хранения данных в сжатом виде. Это позволяет существенно сократить размеры базы данных при необходимости хранения больших объемов информации. С прикладной точки зрения в полях типа ХранилищеЗначения можно хранить, например, значения каких-то вспомогательных настроек пользо- вателей, фотографии, изображения, образы файлов и так далее. Например, фотографии сотрудников или файлы с аудиозаписью важных переговоров (то есть данные типа Картинка или ДвоичныеДанные). При этом, хотя в системе не существует явного ограничения на размер данных, хранящихся в полях типа ХранилищеЗначения, следует все-таки осмотри- тельно подходить к решению, что именно требуется хранить в базе данных. Большой объем хранимой вспомогательной информации может привести к тому, что административные операции (например, создание резервной копии базы данных) выполняются медленно из-за большого объема базы данных. А большой объем обусловлен не требованиями обеспечения основной бизнес-логики, а тем, что кто-то из сотрудников решил хранить в базе данных любимые фильмы. Особенно аккуратно нужно относиться к возможности использования полей типа ХранилищеЗначения в составе объектов (например, справочников, документов), активно использующихся при реализации основной бизнес- логики. Ведь данные объектов считываются целиком при обращении к ним. Поэтому, например, вопрос хранения тех же фотографий лучше решать не в составе справочника Сотрудники, а в отдельном подчиненном справочнике или регистре сведений. Тогда будет сохранена возможность идентификации
54 Реализация прикладных задач в системе «ЮПредприятие 8.2» соответствия изображении сотрудникам, к которым они относятся. И в то же время при использовании объектов справочника Сотрудники для решения других задач выполняемые операции не будут замедляться из-за необходи- мости считывания из базы данных больших объемов информации. Хранение информации в регистрах сведений Удобным средством для реализации задач хранения информации необъек- тных данных, развернутой в некоторых разрезах, является использование регистров сведений. Для решения таких задач регистры сведений обладают функциональностью, которая включает в себя: уникальность записей в разрезах ключей записей; периодичность; подчинение записей регистратору. Разберем использование этой функциональности на примерах. Уникальность записей регистра сведений Одним из основных показании для использования именно регистров сведений для хранения данных является то, что регистры сведений обеспечивают уникальность хранимой информации для конкретных комбинации значений разрезов ее хранения. То есть набор значение разрезов является уникальным ключом каждой записи регистра. Сама информация в регистре хранится в виде значений ресурсов. А разрезы хранения информации реализуются посредством измерений регистра. Рассмотрим следующий пример. Для хранения значения метода списания себестоимости, действующего на автоматизируемом предприятии, может использоваться непериодический регистр сведений УчетнаяПолитикаПред- приятия. В случае отсутствия измерении (разрезов хранения информации) состав регистра будет выглядеть следующим образом (рис. 1.36). Ч четнаяП п литикаП редприягия 1_ Измерения © в Ресурсы 0 МетодСписан^яСебестоимости 1 Хранение информации реализуется в ресурсах регистра сведений Отсутствие измерений означает отсутствие разрезов хранения информации Рис. 1.36. Структура регистра «УчетнаяПолитикаПредприятия»
Глава 1. Хранение информации 55 В таком регистре можно хранить только одно значение метода списания себестоимости (табл. 1.3). Таблица 1.3. Значение, хранимое в регистре МетодСписанияСебестоимости FIFO Запись другого значения в данный регистр обязательно должна сопровож- даться замещением предыдущего (табл. 1.4). Два значения одновременно храниться не могут. Таблица 1.4. Значение, хранимое в регистре МетодСписанияСебестоимости Средневзвешенный Это соответствует требованиям прикладной области. Ведь действительно, если для решения ряда учетных задач потребуется получать значение исполь- зуемого на предприятии метода списания себестоимости, то важно, чтобы он был одним и тем же. Если же автоматизируемое предприятие, например, представляет собой ряд самостоятельных юридических лиц (организаций), то для хранения инфор- мации об учетной политике каждой организации в рассмотренный регистр сведений можно ввести измерение Организация (рис. 1.37). В результате данные в регистре смогут храниться в разрезе организаций. © Н УчетнаяПолитикаПредприятия 0 !_ Измерения Измерение - разрез Организация хранения информации © 4 Ресурсы t МетодСписанияСебестоимости Рис. 1.37. Структура регистра «УчетнаяПолитикаПредприятия» По каждой конкретной организации в регистре сможет присутствовать только одна запись. Значение метода списания себестоимости в этой записи будет «персональным» для этой организации. И ключом этой записи будет значение организации (табл. 1.5). Таблица 1.5. Пример хранения данных в регистре «УчетнаяПолитикаПредприятия» Организация МетодСписанияСебестоимости ООО «АвтоматикаСвязьПроект» FIFO ООО «Информационные системы» Средневзвешенный ООО «Мультимедиа Плюс» Средневзвешенный
56 Реализация прикладных задач в системе «Ю.Предприятие 8.2» Таким образом, важно понимать, что регистр сведений не является простой таблицей для хранения произвольной информации. Требование уникальности записей по ключевым полям обязательно. И оно отслеживается системой автоматически, при любых попытках модификации данных или модификации состава регистра сведений. Если в вышеприведенном примере после заполнения данных регистра информацией об организациях попытаться удалить измерение Организация из регистра как объекта конфигурации, то система не позволит внести эти изменения в конфигурацию базы данных (рис. 1.38). Изменения в структуре информации конфигурации ► Объект изменен: РегистрСведений УчетнаяПолигикаПредприятия ! Записи регистра сведений стали не уникальными: УчетнаяПолигикаПредприятия Принять Гргмен Рис. 1.38. Сообщения при реорганизации базы данных Количество используемых в составе регистра сведений измерений и ресурсов определяется задачами, которые решаются посредством этого регистра. Например, если стоит задача хранения информации о «персональных» для покупателей ценах на товары, она может быть решена посредством регистра сведении со следующим составом (рис. 1.39). П ерсониФицированныйП райе © L. Измерения Номенклатура L. Покупатель © 4 Ресурсы I Цена Рис. 1.39. Структура регистра сведений Однако впоследствии любые расширения этой задачи не приводят к необходи- мости серьезной структурной перестройки в вопросах организации хранения информации и достаточно легко реализуются. Например, если впоследс- твии необходимо будет ввести понятие «Договор», когда по одному договору с покупателем на товары одни цены, а по другому могут быть совсем другие. Или если по каждой поставляемой номенклатурной позиции понадобится хранить не просто информацию о ценах продажи, но и учет сезонной скидки, условия доставки, процент предоплаты, срок отсрочки платежа и т. д. Все эти требования могут быть реализованы в рамках все того же регистра за счет добавления соответствующих ресурсов и измерении (рис. 1.40).
Глава 1. Хранение информации 571 П ерсониФнцированныйП райе Ц Измерения L, Номенклатура L* Покупатель L, Договор - J Ресурсы I Цена I УчетСезоннойСкидки 1 СпособДоставки I ПроцентПредоплаты 3 СрокОтсрочкиПлатежа Рис. 1.40. Структура регистра сведений Важно лишь то, что в данном случае «ключом уникальности» записей регистра будет уже номенклатурная позиция конкретного договора с покупа- телем. ВНИМАНИЕ! Хотелось бы обратить внимание на то, что возможность расширения фун- кциональности регистра за счет добавления новых ресурсов не является обязательной к использованию. В некоторых случаях лучше добавлять не ресурсы, а новые регистры сведений. Подробно этот вопрос рассмат- ривается в разделе «Проектирование структуры регистров сведений» на стр. 107. Периодические регистры сведений Одной из возможностей регистра сведений является хранение данных не только в разрезе указанных измерений, но и в хронологическом разрезе. Разработчик может создавать периодические регистры сведений, указывая минимальную периодичность хранения данных. Например, для реализации хранения информации в регистре сведений Учет- наяПолитикаПредприятия не только в разрезе организаций, но и в разрезе лет (в действительности учетная политика предприятия принимается сроком на год), в состав объекта конфигурации можно внести следующее изменение - указать периодичность хранения информации регистра В пределах года (рис. 1.41). В результате в структуру хранения данных регистра будет добавлено поле Период. Причем оно будет включено в состав ключа записей регистра. То есть, по сути, является еще одним разрезом хранения информации. Теперь в регистре УчетнаяПолитикаПредприятия (см. рис. 1.37) смогут храниться, например, такие данные (табл. 1.6).
58 Реализация прикладных задач в системе «1С:Предприятие 8.2» Перечень возможных значений свойства "Периодичность" определяется типичными значениями, необходимыми для решения бизнес-задач Рис. 1.41. Периодичность регистра сведений Таблица 1.6. Пример хранения данных в регистре «УчетнаяПолитикаПредприятия» Период Организация МетодСписанияСебестоимости 2009 г. ООО «АвтоматикаСвязь Проект» ПРО 2009 г. ООО «Информационные системы» Средневзвешенный 2009 г. ООО «Мультимедиа Плюс» Средневзвешенный 2010 г. ООО «АвтоматикаСвязь Проект» Средневзвешенный 2010 г. ООО «Мультимедиа Плюс» LIFO Таким образом, в регистре сведении можно хранить не просто статические данные, но и историю изменений этих данных ри такой организации хранения информации появляются возможности: получения информации, актуальной на тот или иной временно i момент; получения информации о значениях данных, вступающих в силу после некоего временного момента; получения картины динамики изменения данных за некоторым период; решения других прикладных задач, связанных с хранением информации в привязке ко времени.
Глава 1. Хранение информации 59 Например, периодический регистр сведений ПерсонифицированныйПрайс сможет не только хранить информацию о том, какова цена на определенную номенклатуру сейчас (или была в прошлом), но и о том, как она будет изме- няться в будущем (если эти изменения будут заранее планироваться). Более подробно вопросы получения информации из периодического регистра рассмотрены в разделе «Получение данных из периодических регистров сведений» на стр. 93. Подчинение записей регистратору В ряде прикладных задач возникает необходимость обеспечения обоснования хранимой в регистрах сведений информации наличием документов, зарегист- рировавших изменения этой информации. Например, изменение отпускных цен компании может производиться только определенным кругом лиц, и каждое такое изменение должно сопровождаться оформлением соответствующего документа. То есть данные регистра сведений должны четко «помнить», в связи с каким именно документом они там оказались (рис. 1.42). Ключевые поля Все действия » г» Цены номенклатуры (н) С^Найги... | Период Регистратор 4г" Н омер строки Номенклатура Тил цены "А Цена итеетственныи А 16 04.2010 21:54:41 Изменение цен компании. /Т) Пульт FX Оптовая 150.00 Семенов га 16.04.2010 21:54:41 Изменение цен компании... 2 Пульт РХ Мелкооптовая 170.00 Семенов И 16 04.2010 21:54:41 Изменение цен компании. 3 Пульт РХ Розничная 200.00 Семенов га 16 04.2010 21 54:41 Изменение цен компании. 4 Пульт VH Оптовая 100.00 Семенов га 16.04.2010 21 54 41 Изменение цен компании. Пульт VH Мелкооптовая 90.00 Семенов га 18 04 2010 20:49:26 Изменение цен компании... 7 Пульт РХ Оптовая 170.00 Иванов га 18.04.2010 20:49:26 Изменение цен компании... 2 Пульт РХ Мелкооптовая 190,00 Иванов га 18.04.2010 20 49:26 Изменение цен компании... 1 Пульт РХ Розничная 220.00 Иванов — К ст 18 04 2010 20:49:26,. 41П«л,т,УН Wil ЯП тем ’ 10000! Иек к JLi ......... 1 > Набор записей, подчиненный регистратору Поле "НомерСтроки" содержит порядковый номер записи в наборе записей, подчиненных регистратору Рис. 1.42. Хранение данных в регистре сведений, подчиненном регистратору Чаще всего при этом необходимо обеспечивать гранулярность записи или модификации данных регистра сведений. В качестве такой «гранулы» исполь- зуется набор записей, подчиненных документу-регистратору. Например, при проведении документа-регистратора его набор записей целиком переза- писывается. Для того чтобы разработчику не пришлось решать массу вопросов обес- печения данной функциональности собственными силами, он может воспользоваться штатными возможностями платформы.
60 Реализация прикладных задач в системе «ЮПредприятие 8.2» Для этого достаточно установить значение Подчинение регистратору свойству Режим записи регистра сведений как объекта конфигурации (рис. 1.43). Периодичность при этом может быть любой включая значение "Непериодический Выбор данного режиме записи приводи* - к появлеь ию предопределенных полей: ' Регистратор”, "НомерСтроки" и "Активность” Рис. 1.43. Свойства регистра сведений «ЦеныНоменклатуры» С точки зрения хранения данных в регистре установка значения Подчи- нение регистратору свойства Режим записи приводит к включению в состав регистра полей Регистратор, НомерСтроки и Активность. ПРИМЕЧАНИЕ Обратите внимание на то, что поле Активность по умолчанию не включается в форму списка, сгенерированную платформой. Поэтому если вы захотите увидеть, какие новые ноля появились у регистра, и для этого откроете форму списка, то вы не увидите там поля Активность. Но при необходимости его можно добавить вручную в форму списка. Далее требуется указать, какие именно документы могут быть регистрато- рами записей регистра (рис. 1.44). Это можно сделать как при редактировании самого регистра как объекта конфигурации, так и при редактировании документа-регистратора как объекта конфигурации.
Глава 1. Хранение информации 61 [Разрешить Подсистемы Функциональные опции Данные Нумерация | ► Движения Последовательности Журналы Формы Команды Макеты Ввод на основании Права Обмен данными Прочее Оперативное проведение Разрешить Удалений движений: Удалять автоматически при отмен Регистры сведений ЦеныНоменк латуры И Регистры накопления Cjl?] ТоварыНаСк ладах "IQ| Конструкто[ движении ЦеныНоненклатуры Элемент коллекции свойства объекта документа "Движения" D X X Деис гвия Рис. 1.44. Регистраторы регистра сведений Благодаря этому облегчается труд разработчика, которому необходимо сфор- мировать» или модифицировать набор (наборы) записей регистра (регистров), подчиненных некоему документу. Подробно этот вопрос освещен в разделе «Создание, изменение, удаление записей регистра сведений» на стр. 69. Платформа во многих механизмах будет сама использовать обращение к данным свойствам объектов конфигурации. Поэтому при удалении доку- ментов или отмене проведения (если свойство Удаление движений установлено в значение, отличное от Не удалять) система производит поиск движений этого документа в таблицах всех регистров, для которых данный документ может быть регистратором, и удаляет их. Хотелось бы обратить внимание, что поле Регистратор обеспечивает привязку к документу, но не всегда входит в разряд ключевых полей.
62 Реализация прикладных задач в системе «ЮПредприятие 8.2» Для того чтобы поле Регистратор стало ключевым, необходимо для такого регистра сведени й (с режимом записи Подчинение регистратору) устано- вить для свойства Периодичность значение По позиции регистратора. С прикладной точки зрения это означает возможность хранения в регистре сведений данных с привязкой к временной оси с дробностью до момента времени. То есть фактически каждый регистратор может делать движения по любым комбинациям измерений (при этом не будет конфликтовать по поводу уникальности с другими документами). А значения ресурсов можно получать не только на определенный период, но и на момент времени документа (рис. 1.45). Рис. 1.45. Получение значений ресурсов на момент времени документа Однако необходимо понимать, что с точки зрения решения реальных бизнес- задач точность записи хронологии изменений информации больше секунды вряд ли требуется. Таким образом, исходя из области применения, если требуется поместить действия двух событий в определенном хронологическом порядке, то их нужно помещать в разные периоды. То есть если записи движений формиру- ются так, что поле Период заполняется значением Дата документа, то нужно менять дату документа (рис. 1.46). Хронология записей регистра сведений с периодичностью По позиции регистратора внутри секунды однозначна с точки зрения чтения инфор- мации, но не управляема разработчиком с точки зрения записи информации. Например, при отображении движенш регистра внутри секунды они упоря- дочиваются системой по ссылкам на регистраторы, то есть по внутренним идентификаторам документов. И такой порядок неизменен при любом обра- щении на чтение информации, однако нет возможности произвольно изменить его (внутри секунды).
Глава 1. Хранение информации Рис. 1.46. Запись движений документов с точностью до даты Структура регистра сведений В состав регистра сведений как объекта конфигурации включаются: я измерения, я ресурсы, я реквизиты. Как уже было рассмотрено выше, в разделе «Уникальность записей регистра сведений» на стр. 54: я ресурсы хранят данные регистра, то есть ту информацию, ради хранения которой регистр, собственно, создавался и с которой работает функцио- нальность регистра; я измерения используются для обеспечения разрезов хранения этой инфор- мации. Кроме того, для ситуаций, когда необходимо кроме данных хранить допол- нительную информацию собственно о записях регистра, возможно использование реквизитов. Хотелось бы особо отметить, что деление информации регистра на рекви- зиты и ресурсы - элемент общего подхода. И хотя технологически хранение информации ресурсов и реквизитов регистра сведений существенно не различается, правильное отнесение разработчиком данных к ресурсам или реквизитам позволяет впоследствии быстро отличить, что является «функцией» регистра, а что просто комментирует запись. Строго говоря, это один из ключевых моментов организации разработки в «1С:Предприятии» - деление структуры метаданных по ролям, испол- няемым конкретными объектами в прикладном решении, а не только по их технологическому устройству.
64 Реализация прикладных задач в системе «1С.Предприятие 8.2» Например, регистр сведений ЦеныНоменклатуры хранит информацию о ценах в разрезах номенклатурных позиций и типов цен Эта информация впоследс- твии используется для работы механизмов ценообразования. Но, кроме того, для вопросов контроля над изменением цен в составе регистра есть реквизит Ответственный, в котором для каждой записи регистра указывается ссылка на пользователя, ответственного за ввод данной записи (рис. 1.47). Рис. 1.47. Структура регистра сведений «ЦеныНоменклатуры» исто светаний Ценыб '~меиклатдци ► Основные Имя: Подсистемы Ртгистрашры Формы Команды Функциональные опции Данные 1 иноним I__Макеты Права I Обмен данными Прочее Комментарий: Периодичность. [ По позиции регистратора Основной отбор по периоду Представление записи: Представление списка: Пояснение: [Цены номенклатуры Далее» ] [ Закрыть Справь . Добавляет в состав регистра поле "Регистратор'' Любое значение, кроме "Непериодический*' добавляет в состав регистра поле "Период" еныН оменг лат чры Подчинение регистратору Расширенное представление записи: Расширенное представление списка: | Действия /Назад Рис. 1.48. Основные свойства регистра сведений «ЦеныНоменклатуры»
Глава 1. Хранение информации Далее, как было рассмотрено выше, регистры сведений могут иметь режим записи Подчинение регистратору, вследствие чего в состав таблиц регистра добавляется поле Регистратор. И регистр сведений может быть пери- одическим, вследствие чего в состав его таблиц добавляется поле Период (рис. 1.48). Данные каждого регистра сведений хранятся в отдельной таблице базы данных. Каждая такая таблица имеет следующий состав колонок: Период - дата записи. Определяет положение данной записи на временной оси. Это поле существует только для периодических регистров. Регистратор - содержит ссылку на документ, которому подчинена данная запись. Это поле существует только для регистров с режимом записи Подчинение регистратору. НомерСтроки - уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор. Это поле существует только для регистров с режимом записи Подчи- нение регистратору. Активность - имеет тип Булево. Содержит признак влияния записи на получение информации из регистра. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени. Это поле существует только для регистров с режимом записи Подчинение регистратору. Ключ - короткий ключ записи регистра. Поле присутствует у непериоди- ческих регистров, имеющих хотя бы одно измерение. <Измерение> - содержит значение измерения. Количество таких полей равно количеству измерений, определенных для регистра как объекта конфигурации. <Ресурс> - значение ресурса. Количество таких полей равно количеству ресурсов, определенных для регистра как объекта конфигурации. <Реквизит> - значение реквизита. Количество таких полей равно количеству реквизитов, определенных для регистра как объекта конфигурации. Таким образом, для регистра ЦеныНоменклатуры с режимом записи Подчи- нение регистратору и периодичностью По позиции регистратора пример заполнения таблицы базы данных будет следующим (темным фоном выделены ключевые поля записей), табл. 1.7.
Таблица 1.7. Пример заполнения регистра сведений «ЦеныНоменклатуры» Период Регистратор Номер строки Активность Номенклатура ТипЦены Цена Ответственный 16 04.2010 21:54:41 Изменение иен компании 000000001 от 16.04.2010 21:54:41 1 истина Пулы РХ Оптовая 150,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 2 истина Пульт РХ Мелкооптовая 170,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 3 истина Пульт РХ Розничная 200,00 Семенов 16.04.2010 21:54:41 Изменение цен ком- пании 000000001 от 16.04.2010 21:54:41 4 истина Пульт VH Оптовая 100,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 5 истина Пульт VH Мелкооптовая 90,00 Семенов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 истина Пульт РХ Оптовая 170,00 Иванов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 2 истина Пульт РХ • Мелкооптовая 190,00 Иванов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 3 истина Пулы РХ Розничная 220,00 Иванов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 4 истина Пульт VH Мелкооптовая 100,00 Иванов Реализация прикладных задач в системе «1С:Предприятие 8.2»
rwig г . 67 Глава 1. Хранение информации Теперь рассмотрим непериодический регистр сведений Сотрудники с незави- симым режимом записи (рис. 1.49). ДИ; - Ц Измерения Ц ц Ф изическоеЛ нцо Подразделение i Ресурсы J Должность Рис. 1.49. Структура регистра «Сотрудники» Таблица регистра Сотрудники, хранящая информацию в базе данных, может быть заполнена следующим образом (темным фоном выделены ключевые поля записей), табл. 1.8. Таблица 1.8. Пример заполнения регистра сведений «Сотрудники» Физическое лицо Подразделение Должность Иванов Иван Сергеевич Отдел продаж Руководитель Семенов Сергей Петрович Отдел продаж Менеджер Семенов Сергей Петрович Отдел закупок Руководитель Петровский Семен Иванович Руководство компании Руководитель Петровская Ирина Ивановна Бухгалтерия Бухгалтер Конечно же, функциональность регистра сведений с независимым режимом записи и регистра сведений с режимом записи Подчинение регистратору различается. Также различается функциональность использования периоди- ческих и непериодических регистров сведений. Поэтому для поддержания должного быстродействия при обращении к данным информационной базы для таблиц регистров сведений в зависи- мости от вида регистра создаются, например, следующие индексы: Для регистра сведений с периодичностью По позиции регистратора: □ Период + Регистратор + НомерСтроки. □ Регистратор + НомерСтроки. □ Измерение! + [Измерение2 + ...] + Период + Регистратор + НомерСтроки - если для данного регистра есть хоть одно измерение. В данный индекс включаются все измерения в том порядке, в котором они заданы в составе регистра как объекта конфигурации, поле Период, поле Регис- тратор и поле НомерСтроки.
68 Реализация прикладных задач в системе «ЮПредприятие 8.2» □ Измерение + Период + Регистратор + НомерСтроки - если для данного измерения свойство Индексировать установлено в значение Индек- сировать. □ Ресурс + Период + Регистратор + НомерСтроки — если для данного ресурса свойство Индексировать установлено в значение Индексировать. □ Реквизит + Период + Регистратор + НомерСтроки - если для данного реквизита свойство Индексировать установлено в значение Индек- сировать. Для непериодического регистра сведений: □ Измерение1 + [Измерение2 +...] - если для данного регистра есть хоть одно измерение. В данный индекс включаются все измерения в том порядке., в котором они заданы в составе регистра как объекта конфи- гурации. □ Измерением + Измерение! + [Измерение2 +...] - если для измерения Измерением задано свойство Индексировать или свойство Ведущее, и при этом это не первое и не единственное измерение. В данный индекс включаются Измерением и затем все остальные измерения в том порядке, в котором они заданы в составе регистра как объекта конфи- гурации. □ Реквизит + Измерение! + [Измерение2 +...]- если для данного реквизита свойство Индексировать установлено в значение Индексировать. В данный индекс включается поле Реквизит и затем все измерения в том порядке, в котором они заданы в составе регистра как объекта конфи- гурации. □ Ресурс + Измерение! + [Измерение2 +...] - если для данного ресурса свойство Индексировать установлено в значение Индексировать. В данный индекс включается поле Ресурс и затем все измерения в том порядке, в котором они заданы в составе регистра как объекта конфи- гурации. □ Ключ. Использование индексов позволяет сократить время выполнения операций с данными регистра. F ышеприведенное описание структуры индексов позволяет утверждать, что в общем случае порядок расстановки измерений регистра сведении имеет важное значение. Измерения, к значениям которых необходим быстрый доступ (например, при реализации отборов), следует располагать первыми, далее - в порядке убывания «популярности в отборах». Таким образом будет обеспечиваться возможность эффективного применения индексов при реализации задач чтения информации из таблицы регистра.
Глава 1. Хранение информации Также необходимо иметь в виду, что, например, SQL Server накладывает определенное ограничение - не более 16 полей в индексе. Поэтому работа с регистрами, имеющими очень большое количество измерений, может быть неэффективна по скорости из-за невозможности использования индексов. Более подробно об индексировании физических таблиц регистра сведений можно прочитать в разделе «Индексы таблиц базы данных» на стр. 697. Создание, изменение, удаление записей регистра сведений В общем случае в таблицу регистра сведений записи могут вводиться поль- зователем вручную, генерироваться в процессе выполнения обработок либо при поведении документов. Для понимания работы механизмов формирования или модификации записей в таблице регистра сведений необходимо прежде всего исходить из следу- ющих положений: все записи в регистрах уникальны с точки зрения комбинации значений в ключевых полях; добавление, изменение, удаление информации в регистрах производятся «гранулами», представляющими собой наборы записей. Поясним эти положения на примерах. Для регистра сведений ЦеныНоменкла- туры с режимом записи Подчинение регистратору ключевыми полями являются Период, Регистратор, Номенклатура, ТипЦены. Гранулой обмена информации с базой данных является набор записей, подчиненных одному регистратору (табл. 1.9). Разным фоном в таблице выделены наборы записей. Согласно постулату об уникальности записей по значениям ключевых полей невозможно, например, записать одновременно две записи с одинаковыми значениями полей Номенклатура, ТипЦены, Период, Регистратор (табл. 1.10). При подобной попытке система выдаст соответствующее предупреждение и не выполнит запись. Это обосновывается требованиями прикладной области, поскольку невозможно одновременно установить для одного и того же товара две разные оптовые цены. В то же время положение о «гранулярности» модификации информации регистра облегчает реализацию операций удаления или модификации данных. Потому что с прикладной точки зрения: м удаление документа Изменение цен компании № 1 должно повлечь за собой удаление всех записей регистра, подчиненных данному документу; изменение в данных документа при его перепроведении должно повлечь создание нового набора записей (движений документа), который должен полностью заместить старые записи регистра, подчиненные этому доку- менту.
Таблица 1.9. Пример заполнения регистра сведений «ЦеныНоменклатуры» Период Регистратор Номер строки Активность Номенклатура ТипЦены Цена Ответственный 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 1 истина Пульт РХ Оптовая 150,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 2 истина Пульт РХ Мелкооптовая 170.00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 3 истина Пульт РХ Розничная 200,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 4 истина Пульт VH Оптовая 100,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 5 истина Пульт VH Мелкооптовая 90,00 Семенов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 1 истина Пульт РХ Оптовая 170,00 Иванов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49-26 2 истина Пульт РХ Мелкооптовая 190,00 Иванов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 3 истина Пульт РХ Розничная 220,00 Иванов 18.04.2010 20:49:26 Изменение цен компании 000000002 от 18.04.2010 20:49:26 4 истина Пулы VH Мелкооптовая 100,00 Иванов Реализация прикладных задач в системе «1С:Предприятие 8.2»
Глава 1. Хранение информации 71 . Таблица 1.10. Пример заполнения регистра сведений «ЦеныНоменклатуры» Период Регистратор Номер строки Активность Номенклатура ТипЦены 1 Цена Ответственный 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 1 истина Пульт РХ Оптовая 150,00 Семенов 16.04.2010 21:54:41 Изменение цен компании 000000001 от 16.04.2010 21:54:41 2 истина Пульт РХ Оптовая 155,00 Петров Приемы добавления, удаления и модификации движений регистров с режимом записи Подчинение регистратору универсальны. То есть они одинаковы что для подчиненных регистров сведений, что для других видов регистров (накопления, бухгалтерии, расчетов). ПРИМЕЧАНИЕ Нужно помнить о различии ключей записей регистров накопления и регистров сведений. В регистре накопления номер строки входит в ключ записи, поэтому одним документом можно писать одинаковые значения в разные записи. В регистре сведений номер записи не входит в ключ, поэтому одинаковые значения измерений и даты одним документом писать нельзя! Подробно примеры подобных действий описаны в разделах «Свойство объекта документа «Движения»» и «Запись набора записей регистра без использования свойства «Движения»» главы «Реализация задач учета движения средств». В отношении регистров сведений с независимым режимом записи гранулами обмена с базой данных будут наборы записей с установленными отборами по значениям ключевых полей регистра. Кроме того, для некоторых прикладных задач может понадобиться реализация обмена информацией независимых регистров сведений в рамках распре- деленных баз данных. В таких ситуациях в гранулы обмена между базами данных будут включаться комбинации значений измерений с установленным свойством Основной отбор. Также в основной отбор может включаться поле Период для периодических регистров (рис. 1.50).
Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 1.50. Свойство «Основной отбор» Установка основного сПюра Например, в состав демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт- диске, входит ПерсонифицированныйПрайс - регистр сведений с независимым режимом записи и периодичностью В пределах дня (рис. 1.51). П ерсониФицированныйП райе !Э !_ Измерения 1_ Покупатель L. Номенклатура G J Ресурсы 4 Цена Рис. 1.51. Структура регистра сведений «ПерсонифицированныйПрайс» С прикладной точки зрения посредством этого регистра руководство ком- пании может указывать информацию об исключительных условиях цено- образования для отдельных покупателей. Причем режим редактирования позволяет заполнять данные этого регистра и вручную, и программно (например, посредством обработки РаспоряжениеНаУстановкуЦенПокупателя). Ключевыми полями для этого регистра будут Период, Покупатель, Номенкла- тура. Поэтому гранулой модификации может считаться любая комбинация значений этих полег1.
Глава 1. Хранение информации Например, если для решения некоей задачи нам необходимо устанавливать или менять на определенный период для определенного покупателя цены на все номенклатурные позиции сразу, гранулами модификации будут наборы записей, соответствующие комбинациям значений полей Период, Покупатель. Таким образом, данные, хранимые в регистре, можно представить следующим образом (серым фоном в таблице выделены ключевые поля), табл. 1.11. Таблица 1.11. Пример заполнения данными регистра сведений «ПерсонифицированныйПрайс» Период Покупатель Номенклатура Цена Гранула «10.04.2009- Компания "Риона”» 10.04.2009 Компания"Риона" Монитор 17’ Philips 107S20 300,00 Гранула «13.09.2009- ЦветМетМаш» 13.09.2009 ЦветМетМаш Пульт VH 120,00 Гранула «11.01.2010- Компания "Риона"» 11.01.2010 Компания"Риона" Монитор 17’ Philips 107S20 290,00 11.01.2010 Компания"Риона" Монитор 19’Hitachi СМ715ЕТ 290,00 11.01.2010 Компания"Риона" Монитор LCD 22’ M8537ZM/A 350,00 Гранула «10.04.2010 - Ялта-Лтд» 10.04.2010 Ялта-Лтд Мышь 3D-Sensor 4,00 В результате такого гранулирования данные каждой гранулы, то есть наборы записей, соответствующие каждой грануле, можно удалять или замещать целиком. <7 U Г ПС.Предп... Ж| Л М М+ М' ~ - - - > irftWwl L- П х Распоряжение на ус гановку цен покупателя Все действия Непосредственная запись Посредством формы набора записей покупателя: Компания "Риона' (Гдаты:11 01.2010 g Выбранный покупатель — Дата установки ^Добавить & X О ’О’ Все действия - "Номенклатура Монитор 17‘ Philips 107920 Монитор 15' LG Studio work' 575N ' Цена Л 295,00 300,00 ------ Товары — ! Непосредственная запись в регистр Рис. 1.52. Форма обработки «РаспоряжениеНаУстановкуЦенПокупателя»
74 Реализация прикладных задач в системе «1С:Предприятие 8.2» Именно это и реализуется посредством обработки РаспоряжениеНаУста- новкуЦенПокупателя, входящей в состав демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. В форме обработки посредством полей ввода пользователь заполняет рекви- зиты формы ВыбранныйПокупатель и ДатаУстановки. А посредством таблицы Товары, находящейся в форме обработки, можно ввести информацию о том, какие цены, для каких номенклатурных позиций нужно назначить выбран- ному покупателю на дату установки (рис. 1.52). Текст процедуры, вызываемой обработчиком нажатия кнопки Выполнить, представлен в листинге 1.14. Листинг 1.14. Обработчик события нажатия кнопки «Выполнить» &НаКлиенте Процедура ВыполнитьЗаписьВРегистр(Комакда) НепосредственнаяЗаписьВРегистр(); КонеиПроцедуры Из этого обработчика вызывается серверная процедура Непосредствен- наяЗаписьВРегистрО (листинг 1.15). Листинг 1.15. Процедура «НепосредственнаяЗаписьВРегистр» &НаСервере Процедура НепссредственнаяЗаписьВРегистрО /I Создать набор записей, соответствующий грануле "Период - Покупатель" НаборЗаписей = РегистрыСведений.ПерсонифицированныйПрайс.СоздатьНаборЗаписей(); НаборЗаписеи.Отбор Период.УстановитьЩатаУстановки); НаборЗаписей.Отбор.Покупатель.Установитв(ВыбранныйПокупатель); // Добавить записи в созданный набор записей Для Каждого СтрокаТовара Из Товары Цикл НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗаяись.Период = ДатаУстановки; НоваяЗапись.Покупатель = ВыбранныйПокупатель; НоваяЗапись.Номенклатура = СтрокаТовара.Номенклатура; НоваяЗапись. Цена = СтрокаТовара! [ена; КонецЦикла: II Записать набор записей с замещением старого, соответствующего той же грануле Набор3аписей.3аписать(); КонецПроцед/ры
Глава 1. Хранение информации 75 В процедуре сначала создается набор записей с установкой значений отбора по ключевым полям, то есть по полю Период и по измерению Покупатель. Далее в цикле перебора строк таблицы Товары происходит заполнение записей в созданном наборе записей. После этого сформированный набор записей записывается с замещением старого набора записей регистра, соот- ветствующего той же грануле (у параметра Замещать метода набора записей Записать () значение по умолчанию - Истина). В результате выполнения обработки (исходные данные см. рис. 1.52) таблица регистра будет содержать следующие данные (табл. 1.12). Таблица 1.12. Данные регистра сведений «ПерсонифицированныйПрайс» Период Покупатель Номенклатура Цена Гранула «10.04.2010 - Компания ’’Риона"» 10.04.2009 Компания "Риона" Монитор 17’Philips 107S20 300,00 Гранула «13.09.2009- ЦветМетМаш» 13.09.2009 ЦветМетМаш Пульт VH 120,00 Гранула «11.01.2010- Компания "Риона"» 11.01.2010 Компания"Риона" Монитор 17’Philips 107S20 295,00 11.01.2010 Компания"Риона" Монитор 15’LG Studioworks 575N 300,00 Гранула «10.04.2010- Ялта-Лтд» 10.04.2010 Ялта-Лтд Мышь 3 D-Sensor 4,00 Как видите, информация, соответствующая грануле «11.01.2010 - Компания "Риона”», заместилась согласно данным таблицы Товары формы обработки. Необходимо иметь в виду, что для независимого регистра сведений подобное «гранулирование» умозрительное, виртуальное. То есть посредством него можем получить совершенно любой набор записей (главное, чтобы отбор устанавливался по всем ключевым полям или ни по одному из них, и только на равенство). Но не всегда можно будет записать любой набор, т. к. если в отбор включены не все ключевые поля и выполняется добавление, то можно пересечься с существующими значениями ключевых полей. Конечно, выполнение записи набора записей с замещением просто очистит старые записи, с которыми пересекаемся. Но иногда на практике возни- кают задачи, когда необходимо запретить такое замещение. Допустим, в рассмотренном нами примере обработка РаспоряжениеНаУстановкуЦенПо- купателя не должна позволять устанавливать новые цены для покупателя на определенный период по тем номенклатурным позициям, по которым цены уже были установлены ранее.
76 Реализация прикладных задач в системе «1С:Предприятие 8.2» Такое требование достаточно легко реализуемо. Достаточно лишь в той же процедуре установить значение Ложь параметру Замещать метода Запи- сать () набора записей регистра (листинг 1.16). Листинг 1.16. Фрагмент кода I/ Записать набор записей с замещением старого, II соответствующего той же грануле чабооЗаписей.Записать(Ложь); При попытке выполнения обработки для условий, отображенных выше (см. рис. 1.52), система выдаст предупреждение о том, что запись с такими ключевыми полями уже существует (табл. 1.13), и запись нового набора записей не состоится. Таблица 1.13. Запись с дублирующими значениями ключевых полей Период Покупатель Номенклатура 11.01.2010 Компания "Риона” Монитор 17’ Philips 107S20 Для ситуаций, когда необходимо замещать все записи независимого регистра сведений новым набором записей, гранулой можно считать весь регистр. Для этого достаточно вообще не устанавливать отбор. То есть для этого в обработке, подобной вышеприведенной, не нужно указы- вать установки отборов (листинг 1.17). Листинг 1.17. Пример записи набора записей без установки отбора &РаСервере Процедура НепосредственнаяЗаписьВРегистрО II Создать набор записей НаборЗаписей = регистрыСведений. ПерсонифицированныйПрайс. СоздэтьНаборЗаписеи(); // Добавить записи в созданный набор записей Для Каждого СтрокаТовара Из Товаоы Цикл НоваяЗапись = НаборЗаписей.Добавить(): НоваяЗапись.Период = ДатаУстановки; НоваяЗапись. Покупатель = ВыбранныйПокупатель; НоваяЗапись. Номенклатура = СтрсжаТовара. Номенклатура; НоваяЗапись.Цена = СтрокаТовара.Цена; КочецЦикла // Записать набор записей с замещением старого, соответствующего гой же грануле НаборЗаписей.ЗаписатьО; КсчецПроцедурч
Глава 1. Хранение информации Тогда при записи нового набора записей с замещением будут замещены все записи регистра. Для некоторых задач необходимо, чтобы таблица независимого регистра сведений просто полностью очищалась. Такого результата легко добиться следующим образом (листинг 1.18). Листинг 1.18. Пример очистки регистра сведений ...•*> м *- ШИ №я. амаМН «Mi > ЙЙЙк МЯЖМШ * ИМ. VtaUMi - - м НаборЗапиоей = РегистрыСведени* ,ПбрсонифицированныйПрайс.СоздатьНаборЗаписей(); Набор3аписей.3аписать(); В некоторых задачах бывает необходимо модифицировать записи, соответс- твующие неким сложным условиям, причем модификации будут подвергаться и значения ключевых полей. Например, в регистре ПерсонифицированныйПрайс нужно повысить на 20 % цены на все номенклатурные позиции, входящие в группы, в названиях которых упоминаются слово «принтеры», если они стоят меньше 300, и пере- определить их на некоего выделенного покупателя. То есть для остальных покупателей таких цен больше быть не должно. Пример реализации такой задачи с использованием объекта МенеджерЗа- писи регистра сведений приведен в обработке ДействияСДаннымиРе- гистраСведений демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске (листинг 1.19). Листинг 1.19. Обработчик события нажатия кнопки «Переопределить на выбранного покупателя цены» Из обработчика события нажатия кнопки Переопределить на выбранного покупателя цены вызывается серверная процедура ПереопределитьЦе- ныВРегистреО (листинг 1.20). Краткий комментарий: сначала готовится объект манипулирования данными одной записи регистра сведений - менеджер записи. Далее посредством запроса из основной таблицы регистра получаются записи, соответствующие условиям. Обратите внимание: условие по наименованию позволяет получить значения, в которых в любом месте наименования встре- чается сочетание символов «принтер».
78 Реализация прикладных задач в системе «^Предприятие 8.2» Листинг 1.20. Процедура «ПереопределитьЦеныВРегистре» &НаСервереБезКонтекста Процедура ПереопределитьЦеныВРегистре(ВыделенныйПокупатель) // Подготовить менеджер записи Запись = РегистрыСведений.ПерсонифицированныйПрайс.СоздатьМенеджерЗаписи(); // Получить данные записей, соответствующих условиям Запрос = Новый Запрос; Запрос.Текст =" ВЫБРАТЬ ПерсонифицированныйПрайс.Период, ПерсонифицированныйПрайс.Покупатель, ПерсонифицированныйПрайс.Номенклатура, ПерсонифицированныйПрайс.Цена ИЗ РегистрСведений.ПерсонифицированныйПрайсКАК ПерсонифицированныйПрайс ГДЕ ПерсонифицированныйПрайс.Номенклатура.Наименование ПОДОБНО "”%принтер%" И ПерсонифицированныйПрайс.Цена < 300"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл II Установить ключевые поля менеджера записи Запись.Период = Выборка. Период; Запись.Покупатель = Выборка.Покупатель; Запись.Номенклатура = Выборка.Номенклатура; II Прочитать запись из базы данных Запись.Прочитать(); II Убедиться, что запись все еще есть в базе данных Если Запись.Выбран() Тогда // Переопределить покупателя Запись.Покупатель = ВыделенныйПокупатель; II Установить новую цену Запись.Цена = Выборка.Цена * 1.2; // Записать модифицированную запись в базу данных 3апись.3аписать(); КонецЕсли; КонецЦикла; КонецПроцедуры
Глава 1. Хранение информации 79 В цикле перебора выборки результата запроса устанавливаются значения ключевых полей менеджера записи и производится чтение записи из базы данных. Далее изменяется значение покупателя в записи, а цена в нее уста- навливается как увеличенное на 20 % значение цены из выборки. После этого методом Записать () менеджера записи производится непос- редственная запись в таблицу базы данных с замещением. Хотелось бы отметить, что в данном примере было рассмотрено использование менеджера записи для программной работы, но объект РегистрСведе- нийМенеджерЗаписи.<имя> предназначен еще и для обеспечения интерактивно!’ работы с записью регистра сведений. Обязательное условие - регистру сведений в конфигурации должен быть установлен режим записи Независимый (рис. 1.53). Рис. 1.53. Схема использования менеджера записи регистра сведений Обратите внимание: на схеме отображено, что непосредственные операции обмена информацией с базой данных менеджер записи реализует посредством все тех же объектов манипулирования данными - наборов записей регистра. Их два. Один набор записей - пустой. Он используется для удаления записи со старыми ключевыми значениями. А второй набор записей содержит одну запись - ту, которую нужно записать в регистр. При необходимости у разработчика есть возможность «вмешиваться» в процесс модификации данных регистра посредством использования обра- ботчиков событий.
Реализация прикладных задач в системе «1С:Предприятие 8.2» В случае записи новой записи (то есть записи с такими ключевыми полями еще не было) из формы записи регистра сведений последовательность, с которой задействованы обработчики событий, следующая (рис. 1.54). Запись набора записей в базу данных (количество = 1) Рис. 1.54. Последовательность событий, вызываемая при записи из формы новой записи регистра сведений Обратите внимание: ряд событий, выделенных темным фоном, выполняется в одной транзакции. Вследствие этого, если в рамках любого из обработчиков этих событий установить параметру Отказ значение Истина, транзакция будет отменена. То есть новая запись не запишется, да и любые другие изменения в базе данных не выполнятся (ведь в рамках этих обработчиков событий разработчик мог пытаться менять что-то еше). Это важно с точки зрения обеспечения непротиворечивости изменени. в информации объектов, связанных единой прикладной задачей. В случае модификации уже существующей записи регистра посредс- твом менеджера записи могут быть изменены значения ключевых полей. А значит, запись набора с новыми ключевыми полями сама по себе не заместит «старый» набор. Поэтому здесь система работает в два этапа: сначала удаляет «старый» набор записей (состоящий из одной «старой» записи), потом уже записывает «новый» (состоящий из «новой» записи), рис. 1.55.
Глава 1. Хранение информации Рис. 1.55. Последовательность событий, вызываемая при записи из формы существующей записи регистра сведений Как видно на схеме, удаление «старого» набора записей производится посредством записи пустого набора записей. При этом получается, что обра- ботчики событий (ПередЗаписью и ПриЗаписи) модуля набора записей будут вызываться дважды. Итак, подробно рассмотрены возможности работы посредством менеджера записи. Однако нужно заметить, что и с набором записей также возможна работа в интерактивном режиме (рис. 1.56). Пример организации интерактивного ввода приведен в обработке Распоря- жениеНаУстановкуЦенПокупателя, на закладке Посредством формы набора записей. Эта обработка входит в состав демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске.
Рис. 1.56. Схема использования набора записей регистра сведений Пользователь заполняет посредством соответствующих полей ввода рекви- зиты формы ВыбранныйПокупатель и ДатаУстановки. Далее по нажатию кнопки Открыть форму набора записей форма набора записей регистра сведений открывается с отбором по значениям этих реквизитов (листинг 1.21). Листинг 1.21. Обработчик события нажатия кнопки «Открыть форму набора записей» &НаКлиенте Процедура ОткрытьФормуНабораЗаписеи(Команда) // Огкрыть форму набора записей с отбором по покупателю и дате установки цен ЗначениеОтбора = Новый Структура("Покупатель, Период", ВыбранныйПокупатель, ДатаУстановки); ПараметрыФсрмы = Новый Структург("Отбор", ЗначениеСтбора); GгкpытьФopмy("PerиcтpCвeдeний.ПepcoнифициpoвaнныйПpaйc.Фopмa.ФopмaHaбopaЗaпиceй,’ . ПараметрыФормы) КонецПроцедуры Краткий комментарии: сначала создается структура отбора ЗначениеОт- бора со значениями реквизитов формы ВыбранныйПокупатель и ДатаУстановки, затем она добавляется в структуру параметров формы ПараметрыФормы. Эти параметры передаются в форму набора записей регистра сведений Персо- нифицированныйПрайс, и форма открывается с отбором по полям регистра Период и Покупатель, указанным в форме обработки РаспоряжениеНаУста- новкуЦенПокупателя. Заметим, что поскольку форма набора записей не является основной формой регистра сведении, она должна быть заранее создана в конфигураторе. Реализацию дальнейших действий пользователя можно доверить самой платформе, поскольку расширения формы набора записей реализуют всю основную функциональность, которая может потребоваться при модифи- кации данных регистра (рис. 1.57).
Глава 1. Хранение информации Свойства: Номе«члагчра [Номенклатура ^Предприятие Запрет незаполненных значение Ведущее Основной отбор "'Ж ” г Основные: Имя [Номенклатура Синоним Комментарий1 ------ Тип > СправочникСсылка.Номенклатура И спользование: Индексировать Н е индексировать Запрет незаполненных значений производится только при попытке записи Запись не верна! Значение поля "Номенклатура" не может быть пустым!: ПерсонифицированныйПрайс: 20.04.2010,, Компания "Риона" [Регистр сведений: Персонифицированный прайс) ОК Рис. 1.59. Свойства измерения «Номенклатура» П “рсонмФииироданны" щ тйсл [1С Предприятия! — .... .... ... .. . Персонифицированный прайс ♦ Период: Цена: Номенклатура: > Moi Покупатель: (Ког х Сообщения Е Поле "Период' не заполнено Записать и закрыть и>| Mj Все действия Ошибка: X Поле "Период" не заполнено k-Q Lol • гчрт“ i им/, им» Рис. 1.60. Сообщение об ошибке при попытке записи «пустого значения» поля «Период» Другая особенность связана с удалением информации из базы данных. Плат- форма «ЮПредприятие» допускает непосредственное удаление объектов без контроля ссылочной целостности. Если в результате такой операции будут удалены, например, элементы справочника Номенклатура, ссылки на которые использованы в записях регистра сведений, то информация регистра сведений с прикладной точки зрения может стать некорректной (табл. 1.15). Таблица 1.15. Пример ссылки на отсутствующий объект базы данных Период Покупатель Номенклатура Цена 20.04.20 Ю Компания "Риона" <Объект не найден> 300,00 Если разработчик хочет, чтобы подобные ситуации корректно отрабатывались средствами самой платформы, то достаточно для измерения Номенклатура при конфигурировании установить свойство Ведущее.
86 Реализация прикладных задач в системе «ЮПредприятие 8.2» В результате при удалении элемента справочника платформа автоматически удалит все записи регистра сведений, связанные с этим элементом. Кроме того, если для измерения регистра сведений установлено свойство Ведущее, то платформа автоматически поместит команду перехода к списку записей регистра в группу Перейти, в панель навигации формы объекта, соот- ветствующего типу измерения (рис. 1.61). Данная функциональность опять же облегчает быструю разработку прикладных решений. •, Монитор 17'Philips 107S20 (Номенклатура) (ЮПредприятие) и 17' Philips 107S2 Монитор 17 ; 107S20 (Номенклатура) Т1ерейги Персонифицированный прайс Цены номенклатуры J Записать и закрыть Все действия 000000015 Код Наименование. Родитель Монитор 17' Philips 107S.~ Рис. 1.61. Автоматическое формирование команды перехода к подчиненной информации в группе «Перейти» в панели навигации формы элемента справочника «Номенклатура» Получение данных из регистров сведений Только хранение информации как таковое вряд ли требуется при решении прикладных задач. Конечно же, при необходимости всегда подразумевается возможность получения хранимой информации. Можно выделить два больших круга задач, касающихся получения инфор- мации из регистров сведений: получение информации о записях регистра для технологических целей (обычно касающихся именно хранения этой информации); получение информации «функции» регистра (обычно для решения вопросов, ради которых регистр создавали). Таким образом, например, из рассмотренного выше регистра Персони- фицированныйПрайс, хранящего цены продажи в разрезах покупателей и номенклатурных позиций, может понадобиться получить информацию
Глава 1. Хранение информации 83 +, f *" » Распоряжение на установку цен покупателя Выполнить Все действия Непосредственная запись ^Посредством формы набора записей | Для покупателя: Компания “Риона" Выбранный покупатель С даты: 11,01,2010 _j£> Дата установки Открыть Фоому набора записей ! 11 01.2010 11 01 2010 -4-—--------------------------------- и . ,г П -.иФициров, (1С'Гк«дприягие) |я| .и:}-, .д| ИНЙ^ННИННИНМННИНННВННВМНВИнКвВВЯИмИКвИКмВмЯвВ Персонифицированный прайс Записать и закрыть тгй о] ^Добавить & X ♦ ' Период Номенклатура Покупатель Монитор 1Т Philips 107S20 Компания “Риона" Монитор 15' LG Studiowoiks 575N Компания "Риона" В се действия » Все действия > Цена 295,00 300 00j 1 w** г * Рис. 1.57. Использование формы обработки «РаспоряжениеНаУстановкуЦенПокупателя» Если разработчику необходимо изменить эту функциональность, то это возможно сделать за счет использования соответствующих обработчиков событий (рис. 1.58). Модуль формы набора записей клиент Модуль формы набора записей сервер Модуль набора записей сервер Запись набора записей в базу данных Рис. 1.58. Последовательность событий при записи в форме набора записей регистра сведений
84 Реализация прикладных задач в системе «ЮПредприятие 8.2» При работе с формот набора записей регистра сведений порядок, в котором задействованы обработчики событий, не различается для записи нового набора записей и для записи уже существовавшего, но модифицированного набора записей. Дополнительная функциональность при создании и удалении записей регистра сведений Кроме рассмотренных выше основных вопросов организации заполнения и модификации информации регистров сведений хотелось бы еще разо- брать ряд вспомогательных, но не менее важных вопросов для организации решения некоторых прикладных задач. Так, для ряда задач важно не допустить записи данных с пустыми значениями разрезов учета. В рассмотренном выше примере регистра сведений Персонифицирован ныйПрайс с прикладной точки зрения удивительна, например, следующая запись (табл. 1.14). Трактовать ее данные не предоставляется возможным. Таблица 1.14. Пример записи в регистре сведений «ПерсонифицированныйПрайс» Период Покупатель Номенклатура Цена 20.04.2010 Компания"Риона" 300,00 Для того чтобы не допустить записи подобной информации в регистр, можно, конечно, выполнять соответствующую проверку в обработчике события ПередЗаписью. Однако, поскольку подобная задача в практике может встре- чаться не раз, данная проверка добавлена к функциональности платформы. Для того чтобы задействовать ее автоматически, достаточно лишь установить свойство Запрет незаполненных значений у измерения Номенклатура (рис. 1.59). Хотелось бы обратить внимание, что данная проверка выполняется именно в момент попытки записи данных в регистр Если, например, сначала свойство установлено не было и регистр уже заполнился данными записей (среди которых встречаются и записи с пустыми значениями номенклатуры), а потом в конфигурации данное свойство установили, то при реструктури- зации базы данных это действие никак не отрабатывается. Запрет касается именно момента и только момента записи данных в регистр. В отношении поля Период для периодических регистров сведений и в отно- шении поля Регистратор регистра сведений с подчиненным режимом записи подобная проверка выполняется всегда (рис. 1.60).
Глава 1. Хранение информации для проведения операций манипулирования с этими ценами. Например, повысить на отдельные товары цены на определенный процент. А может понадобиться проведение сравнительного анализа: насколько персональные цены в среднем ниже общефирменных, и как это влияет на вал продаж по отдельным номенклатурным позициям. Получение данных из непериодических регистров сведений В случае работы с регистрами сведений, у которых отсутствует привязка данных ко времени (непериодические регистры), решение задач обоих типов выполняется непосредственным обращением к записям таблицы базы данных, отвечающей за хранение информации регистра. В зависимости от сложности условий отборов, применяемых при этом, от необходимости соединения информации регистра с информацией других источников, от необходимости использования механизма динамического чтения данных используют или объектную модель представления информации (чтение посредством методов объектов, отвечающих за манипулирование данных регистров), или табличную модель представления информации (обращение к данным посредством запросов, написанных на языке запросов «1 СПредприятия»). И тот и другой способ обращения выполняется впоследствии за счет одних и тех же запросов СУБД к таблице регистра сведений. Однако, исходя из функциональных возможностей, можно различить ситу- ации, когда уместнее применять работу с той или иной моделью: Объектная модель обычно применяется: в Для чтения данных с простейшими отборами (обязательно только на равенство значению; более того, применяя метод Выбрать(), отбор можно строить только по одному полю). в В случае необходимости применения механизма динамического чтения данных. Посредством этого механизма чтение данных осуществляется по блокам, а не целиком сразу всех. Табличная модель применима во всех случаях, когда не требуется использо- вание механизма динамического чтения данных. Таким образом, посредством запросов можно выбирать данные с отборами какой угодно сложности (как по измерениям, так и по любым другим полям или по подчиненным полям полей записей регистра). Кроме того, при необ- ходимости в том же запросе информацию регистра можно тут же соединять с информацией других источников и/или выполнять дополнительную обра- ботку полученных данных.
88 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рассмотрим несколько примеров, приведенных в обработке ДействияСДан- нымиРегистраСведений, в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. Для непериодического независимого регистра сведений Сотрудники, все поля которого - ссылки на элементы соответствующих справочников (рис. 1.62), задача перебора всех записей регистра может быть решена так, как показано в листинге 1.22. е в Измерения L. Физическое Лицо L Подразделение Q J Ресурсы J Должность Рис. 1.62. Структура регистра «Сотрудники» Листинг 1.22. Пример перебора всех записей регистра ВыборкаЗаписей = РегистрыСведений.Сотрудники.Выбрать(); Пока ВыборкаЗаписей.Следующий() Цикл // Выполнить действие с очередной записью //... КонецЦикла; Хотелось бы отметить, что по умолчанию дополнительное упорядочивание записей при работе с выборкой не производится (табл. 1.16). Таблица 1.16. Пример результата работы с выборкой Физическое лицо Подразделение Должность Иванов Иван Сергеевич Отдел продаж Руководитель Семенов Сергей Петрович Отдел продаж Менеджер Семенов Сергей Петрович Отдел закупок Руководитель Петровский Семен Иванович Руководство компании Руководитель Петровская Ирина Ивановна Бухгалтерия Бухгалтер На таблице выше по сотруднику «Семенов» видно, что ссылка на отдел продаж указана раньше ссылки на отдел закупок. Хотя порядок мог быть и каким-то другим. Теперь рассмотрим задачу получения должности определенного физичес- кого лица в определенном подразделении. Это пример задачи на функцию регистра сведений. В качестве параметров передаем значения физического
Глава 1. Хранение информации лица и подразделения, в качестве результата функции ожидаем значение должности (листинг 1.23). Листинг 1.23. Пример получения должности физического лица // Подготовить структуру отбора по измерениям СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("ФизическоеЛицо", ПроверяемоеЛицо); СтруктураОтбора.Вставить{”Подразделение", ВыбранноеПодразделение); // Получить структуру с данными ресурсов записи СтруктураРесурсов = РегдстрыСведени Сотрудники Лолучить(СтруктураОтбора); II/ Сообщить занимаемую должность Должность = СтруктураРесурсов.Должность; Сообщение = Новый СообщениеПользователю; Если Должность.Пустая() Тогда Сообщоние.Текст = "В этом подразделении не работает”; Иначе Сообщение.Текст = Должность.Наименование; КонецЕсли; Сообщенпе.СообщитьП; ь у Обратите внимание: для метода Получить () обязательна передача параметра, содержащего структуру отбора значений по всем измерениям непериодичес- кого регистра. Результатом применения метода является структура, в которой для каждого элемента ключом будет название ресурса регистра, а значением - значение ресурса из найденной записи регистра. Следующая задача - проверить, работает ли в компании определенное физи- ческое лицо. И если работает, выполнить некоторые действия с записью по этому сотруднику. Допустим, ссылка на проверяемое физическое лицо будет в переменной ПроверяемоеЛицо. Тогда решение можно реализовать следующим образом (листинг 1.24). Листинг 1.24. Пример проверки наличия записи по физическому лицу в регистре сведений
90 Реализация прикладных задач в системе «ЮПредприятие 8.2» В данном примере применялся отбор по значению измерения регистра. Вообще в качестве полей для отбора могут использоваться измерения или реквизиты регистра, для которых в конфигураторе установлен признак индек- сирования в значение Индексировать или установлен признак Ведущее. Но необходимо помнить, что отбор при этом возможен только на равенство и только по одному полю. Рассмотренные задачи также могпи быть решены и посредством соответству- ющих запросов. Рассмотрим ряд задач, когда применение запросов более уместно, нежели применение объектной модели. Доступ к информации таблицы регистра в базе данных осуществляется посредством основной таблицы регистра сведений. Состав ее полей соот- ветствует составу полей таблицы регистра сведений в базе данных (можно посмотреть в разделе «Структура регистра сведений» на стр. 63). Допустим, требуется сообщить наименования физических лиц, упомянутых в записях ретистра сведении Сотрудники. Условие - в наименовании долж ностей этих лип должно быть слово «Руководитель». Эта задача может быть решена следующим образом (листинг 1.25). Листинг 1.25. Пример получения физических лиц, в наименовании должностей которых присутствует слово «Руководитель» II Получить перечень нужных физических лиц Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Сотрудники .ФизическоеЛицо.Наименование КАК ФизЛицо ИЗ РегистрСведений.Сс!рудники КАК Сотрудники ГДЕ Сотрудники.Должность Наименование ПОДОБНО "н%Руководитель%,,,ш; II Перебрать и сообщить полученный список Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пека Выборка.СледующийО Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Выборка.ФизЛицо; Сообщение. СообцитьО; КонецЦикпа; Краткий комментарий: в запросе выбираем неповторяющиеся наименования всех физических лиц из таблицы регистра, если наименования должностей в этих записях содержат набор символов «Руководитель» (в любом месте наименования). Далее выборка результата запроса перебирается, и в цикле сообщается полученная информация.
Глава 1. Хранение информации 91 j Попытка решения этой задачи посредством выборки была бы грубой методи- ческой ошибкой: Во-первых, выборка не может строиться с отбором по значениям ресурсов. То есть перебирать пришлось бы все записи регистра. Во-вторых, условие отбора устанавливается не по значению поля Долж- ность, а по наличию в наименовании этой должности сочетания символов «Руководитель». То есть такая проверка в цикле перебора записей регистра привела бы к необходимости применения запроса СУБД к таблице данных справочника Должности. И это на каждом шаге цикла! В-третьих, сообщать нужно наименования физических лиц. То есть при выполнении условия проверки для каждой подходящей записи регистра системе пришлось бы еще обращаться посредством запроса СУБД к таблице справочника ФизическиеЛица для считывания наимено- вания элемента, соответствующего нужной ссылке. Таким образом, решение посредством объектной модели привело бы к много- численным обращениям к таблицам базы данных (на каждом шаге цикла перебора всех записей регистра). Решение же посредством запроса будет реализовано системой за счет левых соединений таблиц регистра и двух справочников, но за одно обращение к базе данных. Не говоря уже о том, что выборка результата запроса будет меньше выборки всех записей регистра. Следующая задача - сообщить, сколько подразделений компании задейс- твовано в регистре Сотрудники. Эта задача может быть решена посредством следующего запроса (листинг 1.26). Листинг 1.26. Пример получения количества задействованных подразделений Н /' I fbVfl/l , LJf Мпт / Wh, 'flfflitUb. Ш UJH W rfiW W* II Установить исходно, что подразделений нет КоличествоПодразделений = 0; II Посчитать количество "непустых” подразделений в записях регистра Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сотрудники.Подразделение) КАК КоличествоПодразделений ИЗ РегистрСведений.Сотрудники КАК Сотрудники ГДЕ Сотрудники.Подразделение <> &ПустсеПодразделение"; Запрос.УстановитьПараметр(нПустоеПодразделениеи, Справочники.Подразделения.ПустаяСсылка()); Результат = Запрос. Вылолнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда КоличествоПодразделений = Выборка.Количес.воПодраздегений; КбнецЕсли;
92 Реализация прикладных задач в системе «ЮПредприятие 8.2» II Сообщить полученные результаты Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Стоока(КоличествоПодразделени'); Сообщение.Сообщить(); В данном случае применен запрос, вычисляющий количество упоминаний различных подразделений в соответствующем поле записей регистра. При этом записи с незаполненным полем Подразделение не учитываются. Если выборка запроса будет непустой (есть записи), то исходное нулевое количество подразделений заменяется на определенное в запросе. В данном случае продемонстрирована возможность применения агрегатных функций (КОЛИЧЕСТВО()) при чтении информации регистра запросом. ( ледующая задача - получить список «внутренних совместителей» с предоставлением информации, в каких отделах, на каких должностях они работают. Внутренними совместителями называются физические лица, зани- мающие несколько должностей или в одном, или в различных подразделениях предприятия. Данная задача может быть решена посредством применения запроса со следу- ющим текстом (листинг 1.27). Листинг 1.27. Пример получения списка внутренних совместителей Запрос = Новый Запрос; Запрос.Текст = "ВЫБРА ГЬ Сотрудники.ФизическоеЛицо.Наименование КАК ФизЛицо, Сотрудники Подразделение КАК Подразделение, Сотрудники.Должность КАК Должность ИЗ РегистрСведений.Сотрудники КАК Сотрудники ГДЕ Сотрудники.ФизическоеЛицо В (ВЫБРАТЬ Сотрудники.ФизическоеЛицо КАК ФизЛицо ИЗ РегистрСведений.Сотрудники КАК Сотрудники СГРУППИРОВАТЬ ПО Сотрудники ФизическоеЛицо ИМЕЮЩИЕ КОЛИЧЕСТВО(Сотрудники.ФизическоеЛицо) > 1)"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Выборка.ФизЛицо +"" + Выборка.Подразделение + + ВыборкаДолжность; Сообщение.Сообщить(); КонецЦикпа;
Глава 1. Хранение информации 93 В запросе выбирается информация по всем записям регистра, где упоми- наются физические лица, соответствующие условию. Условие проверяет вхождения физических лиц в перечень, полученный вложенным запросом. Во вложенном запросе применяется группирование с применением агре- гатной функции КОЛИЧЕСТВО () по полю ФизическоеЛицо, при этом условием будут отсечены те физлица, которые упоминались только один раз. Получение данных из периодических регистров сведений Для периодических регистров сведений задачи получения информации для технологических вопросов решаются так же, как и было рассмотрено выше для непериодических регистров. Поэтому все примеры, рассмотренные в разделе «Получение данных из непериодических регистров сведений» (см. стр. 87), будут уместны и в этом случае. Единственное отличие в том, что к перечню ключевых полей добавляется поле Период, которое можно использовать в отборах. Так, метод Выбрать () для случая периодического регистра позволяет работать не только с отбором по значению измерения, но и с отбором по временному интервалу, в который могут попадать значения поля Период. Рассмотрим примеры получения информации из периодического (периодичность - В пределах дня) независимого регистра сведений Персо- нифицированныйПрайс (рис. 1.63). Пер' онифицирОЕ-анныиПрийс Г. Измерения L, Покупатель L. Номенклатура ? J Ресурсы I Цена Рис. 1.63. Структура регистра «ПерсонифицированныйПрайс» Для получения выборки всех записей регистра в интервале дат между значениями, содержащимися в переменных НачалоИнтервала и КонецИн- тервала, с отбором по номенклатурной позиции (содержится в переменной ВыбранныйТовар) можно использовать следующий фрагмент кода (листинг 1.28). Листинг 1.28. Пример получения записей периодического регистра сведений II Подготовить структуру отбора по измерению "Номенклатура" СтруктураОтбора = Новый Структура("Номенклатура", ВыбранныйТовар); II Получить выборку записей ВыборкаЗаписей = РегистрыСведений.ПерсонифицированныйПрайс.Выбрать(НачалоИнтервала, КонецИнтервала, СтруктураОтбооа);
94 Реализация прикладных задач в системе «ЮПредприятие 8.2» Пока ВыборкаЗаписей.Следующий() Цикл II Выполнить действие с очередной записью IL. КонецЦикпа; Необходимо помнить, что отбор при этом возможен только по одному полю и в качестве полей для отбора могут использоваться измерения или реквизиты регистра, для которых в конфигураторе установлен признак индексирования в значение Индексировать или установлен признак Ведущее. Кроме того, для реализации необходимости включения/выключения записей «граничных периодов» нужно иметь в виду следующее: В параметр Начал ©Интервал а передается начало интервала, в котором будут выбираться записи периодического регистра. Он может задаваться значениями типа Дата, МоментВремени, Граница. Если значение данного параметра не указано, то будут выбираться записи с самой ранней включительно. В параметр КонецИнтервала передается конец интервала, в котором будут выбираться записи периодического регистра. Он также может задаваться значениями типа Дата, МоментВремени, Граница. Если значение данного параметра не указано, то будут выбираться записи по самую последнюю включительно. В результате при передаче значений типа Дата или МоментВремени в выборку получим записи, включая значения НачалоИнтервала и КонецИнтервала (рис. 1.64). Н ачалоИ нтервала КонецИ нтервала 1.4 значения поля "Период" записей Временная ось Интервал выборки Рис. 1.64. Получение записей, включая граничные значения Если же требуется получить записи, исключая граничные, то необходимо использовать объект Граница. Например, получение выборки в интер вале дат, исключая границы, может быть выполнено следующим образом (листинг 1.29).
Глава 1. Хранение информации 95 Листинг 1.29. Пример получения записей регистра сведений а // Установить значения границ Граница Начата Интервала = Новый Граница(НачалоИнтервала, ВидГраницы.Исключая); ГраницаКонцаИнтеовала = Новьи Граница(КонецИнтервала, ВидГраницы.Исключая); // Подготовить структуру отбора по измерению "Номенклатура" СтруктураОтбора = Новый Структура("Номенклатура", ВыбранныйТовар); // Получить выборку записей ВыборкаЗаписей = РегистрыСведений.ПерсонифицированныйПрайс.Выбрать(ГраницаНачалаИнтервала, ГраницаКонцаИнтервала, СтруктураОтбора); Пока ВыборкаЗаписей.Следующий() Цикл // Выполнить действие с очередной записью /А.. КонецЦикла; • ’ унт. ‘"«да Получение данных в этом случае можно проиллюстрировать следующей схемой (рис. 1.65). КонецИ нтервала Н ачалоИ нтервала поля Интервал выборки “Период” записей Временная ось Рис. 1.65. Получение записей, исключая граничные значения Кроме того, если периодичность регистра меньше чем день (В пределах секунды или По позиции регистратора), то необходимо помнить, что дата в системе «ЮПредприятие» включает в себя и время. Даже если время не указано явно, оно принимает значение 00:00:00. То есть если в качестве параметра НачалоИнтервала передать значение «I декабря 2009 года» (данное значение может быть получено так: '20091201'), а в качестве параметра КонецИнтервала передать «31 декабря 2009 года» ('20091231'), то в результате выборка будет пост- роена с даты «01.12.2009 00:00:00» по дату «31.12.2009 00:00:00». То есть в результат, по сути, не войдут данные 31 декабря (рис. 1.66). Для предотвращения возможных недоразумений по этому поводу удобно использовать функцию КонецДня(). Эта функция возвращает значение последней секунды дня указанной в качестве параметра даты (листинг 1.30).
96 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 1.66. Пример получения данных регистра сведений, когда интервал задан без явного указания времени Листинг 1.30. Пример использования функции «КонецДня()» II Определить конец дня "правой” границы КонецДняИнтервала = КонецДня(КонецИнтервала); II Получить выборку записей ВыборкаЗаписей = РегистрыСведений.ЦеныНоменклатуры.Выбрать(НачалоИнтервала, КонецДняИнтервала); Пока ВыборкаЗаписей.СледующийО Цикл II Выполнить действие с очередной записью II... КонецЦикла; В результате будут получены записи с даты «01.12.2009 00:00:00» по дату «31.12.2009 23:59:59» включительно. При использовании запроса можно реализовывать не только перечисленные выше, но и гораздо более сложные условия, в том числе и по полю Период. Например, задача получения выборки данных всех записей регистра Персо- нифицированныйПрайс, которые датированы выходными днями (субботами и воскресениями), может быть решена посредством следующего запроса (листинг 1.31). Листинг 1.31. Пример запроса ВЫБРАТЬ ПерсонифицированныйПрайс.Период, ПерсонифицированныйПрайс.Покупатель, ПерсонифицированныйПрайс.Номенклатура, ПерсонифицированныйПрайс.Цена ИЗ РегистрСведений.ПерсонифицированныйПрайс КАК ПерсонифицированныйПрайс ГДЕ ДЕНЬНЕДЕЛИ(ПерсонифицированныйПрайс.Период) > 5
Глава 1. Хранение информации В запросе было применено условие с использованием функции работы с датами языка запросов - ДЕНЬНЕДЕЛИО. Данная функция возвращает порядковые номера дней недели по переданному параметру. Рассмотрим примеры задач получения информации из периодического регистра сведений не в технологических целях, а для обслуживания задач учетных или аналитических механизмов. Если необходимо получить информацию значений ресурсов одной записи регистра, соответствующей указанным в параметрах значениям всех изме- рений и периода, объектная модель получения информации также позволяет использовать метод Получить (). Например, нужно сообщить, какую цену установили для покупателя Покупатель по номенклатурной позиции Товар, начиная с ДатаУстановки (листинг 1.32). Листинг 1.32. Пример получения цен по номенклатурной позиции 1, ъЩ 11 уУ’ iuiili.ii , lU.utMsInjlKi влит • |>и>и'- ш'»и.ътгчл»-1ллиа<в1» < // Подготовить структуру отбора по измерениям СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("Покупатель", Покупатель); 2труктураОтбора.Вставить("Номенклатура", Товар); ' •* <' V* ’’А* II Получить струкг. уру с данными ресурсов записи СтруктураРесурсов = РегистрыСведений.Персонифиц «рованныйПрайс Получить(ДатаУстановки, СтруктураОтбора) // Сообщить цену j Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(СтруктуоаРесурсов.Цена); I Сообщение.Сообщить(); "V i raft. ягЯМЬ-гЛМ Ч‘ч I,' »,Ч Часто встречаются задачи, в которых каждая запись периодического регистра сведений используется не как средство для хранения данных, а как средство для хранения информации истории изменения данных. Ведь в рассмотренном выше примере, если цена на товар для этого покупателя была установлена не на эту дату, а на какую-то другую, метод Получить () вернет структуру с пустыми значениями (рис. 1.67). С прикладной точки зрения в ситуации, отображенной на схеме, при обра- щении к данным регистра пользователь, скорее всего, хотел получить актуальное для 12.10.2009 значение цены, а не установленное 12.10.2009. То есть в логике пользователя как само собой разумеющееся может лежать правило: «пока цена не сменилась, действует прежняя». И при обращении к данным регистра пользователь желает получить цену, установленную на некую дату, а если не установлена, то прежнюю, в общем случае - последнюю установленную.
Реализация прикладных задач в системе «ЮПредприятие 8.2» Записи периодического регистра (периодичное гь - "В пределах дня”) Рис. 1.67. Пример использования метода «Получить()» для периодического регистра сведений Для реализации подобной логики в функциональноеги периодического регистра сведений существует метод ПолучитьПоследнее(). Для тех же переменных получение последних актуальных данных может быть таким (листинг 1.33). Листинг 1.33. Пример использования метода «ПолучитьПоследнееО» II Подготовить структуру отбора по измерениям СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить( "Покупатель", Покупатель); СтруктураОтбора.ВставитоС'Номенклатура", Товар); II Получить структуру с данными актуальных значений ресурсов СтруктураРосурсов = РегистрыСведений.ПерсонифицированныйПрайс .ПолучитьПоследнееЩатаУстановки, СтруктураОтбора); I* 1 Сообщить "последнюю" цену Сообщение = Новый СообщениеПользователю, Сообщение.Текст = Стпока(СтруктураРесурсов.Цена); C0061 цение.Сообщить(); В результате получим желаемый результат (рис. 1.68). Может встретиться задача, когда пользователь заранее не знает, для каких комбинаций значений измерений ему требуемся получить данные последних актуальных (на дату КонецПериода) значений ресурсов регистра. То есть хочет получить все значения для всех комбинаций измерении (или для неко- торых, соответствующих условиям отбора), рис. 1.69.
Глава 1. Хранение информации 99 Записи периодического регистра (периодичность - “В пределах дня") Рис. 1.68. Пример использования метода «ПолучитьПоследнееО» Комбинации значений измерений ООО Сигма • Пультах Срез последних актуальных 120 110 218 200 215 ООО Сигма - Пульт PW устанавливаемые значения цен Ялта-Лтд - Пульт VX временная ось Дата получения среза ("КонецП ериода") Рис. 1.69. Задача получения последних значений по комбинации значений измерений Для решения подобных задач можно использовать метод СрезПоследних(), возвращающий таблицу значений, заполненную данными записей, наиболее поздних, ближайших к дате среза (КонецПериода), табл. 1.17. Таблица 1.17. Результат получения среза последних Покупатель Номенклатура Цена ООО «Сигма» Пульт VX 120,00 ООО «Сигма» Пульт PW 218,00 Ялта-ЛТД Пульт VX 135,00
100 Реализация прикладных задач в системе «1С:Предприятие 8.2» В ходе выполнения метода СрезПоследнихО платформа «1- Предпри- ятие» фактически выполняет запрос к базе данных. Данный запрос реализует следующий алгоритм: Выбрать записи таблицы регистра, соответствующие условиям отбора по значениям измерений, у которых значение поля Период меньше или равно значению параметра КонецПериода. По выбранным записям получить максимальные значения поля Период для каждой комбинации значений полей измерений Это будут данные вложенного запроса. Получается, что в нем известны ключи последних актуальных записей, то есть наиболее близких к дате среза. Соединить таблицу вложенного запроса с основной таблицей регистра по равенству значений1 полет измерений и поля Период. Из полученной таблицы получить интересующие данные последних акту альных записей. Подобную функциональность можно реализовать запросом по основной таблице периодического регистра сведений (листинг 1.34). Листинг 1.34. Пример получения среза последних запросом ВЫБРАТЬ ПерсонифицированныйПраисЛокупатель, ПерсонифицированныйПрайс.Номенклатура, ПерсонифицированныйПрайс.Цена ИЗ (ВЫБРАТЬ ПерсонифицированныйПрайс.Покупатель КАК Покупатель, ПерсонифицированныйПрайс.Номенкпатура КАК Номенклатура МАКСИМУМ(ПерсонифицированныйПрайс.Период) КАК Период ИЗ РегистрСведений .ПерсонифицированныйПрайс КАК ПерсонифицированныиГI райе ГДЕ ПерсонифицированныйПрайсЛериод <= &КонецПериода II Указать другие условия отбора при необходимости СГРУППИРОВАТЬ ПО ПерсонифицированныйПрайс.Покупатель, ПерсонифицированныйПрайс.Номенклатура) КАК ВложенныйЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ РогистрСведенийЛерсонифицированныйПрайс КАК ПерсонифицированныйПрайс ПО ВложенныйЗанросЛокупатель = ПерсонифицированныйПрайсЛокупа'гель И ВложенныйЗапрос.Номенклатура = ПерсонифицированныйПрайс.Номенкпатура И ВложенныйЗапрос Период = ПерсонифицированныйПрайсЛериод Поскольку задачи получения среза последних встречаются достаточно часто, система «1 С:Предприятие» позволяет использовать виртуальную таблицу получения среза последних, которая реализует описанный выше алгоритм.
Глава 1. Хранение информации 101 То есть вместо использования запроса по основной таблице регистра разра- ботчик для получения среза может воспользоваться запросом, например, следующего вида (листинг 1.35). Как видите, текст запроса значительно проще. Листинг 1.35. Пример использования виртуальной таблицы «СрезПоследних» ВЫБРАТЬ СрезЦен.Покупатель, СрезЦен.Номенклатура, СрезЦен Цена ИЗ «•««к • «мат амйл :•» РегисфСведений.ПерсониФициоованныйПрайс.СрезПоследних(&КонецПериоца,) КАК СрезЦен Таким образом, за счет использования виртуальных таблиц разработчик рабо- тает сразу с производными данными, необходимыми для решения прикладных задач. А тонкости организации оптимального получения этих данных обеспе- чиваются системой. Что же за данные можно получить посредством виртуальной таблицы среза последних? Практически все, которые касаются записей. Виртуальная таблица СрезПоследних содержит следующие поля: Период - это поле имеет тип Дата. Содержит период, к которому отно- сится запись регистра. Регистратор - это поле имеет тип ДокументСсылка.<имя>. Существует только в случаях, если периодичность регистра — По позиции регис- тратора. Данное поле содержит ссылку на документ-регистратор, к которому относится запись регистра. НомерСтроки - это поле имеет тип Число. Существует только в случаях, если периодичность регистра - По позиции регистратора. Содержит значение поля НомерСтроки записи движения регистра. и Активность - это поле имеет тип Булево. Существует только в случаях, если периодичность регистра - По позиции регистратора. Содержит признак активности записи, то есть влияния на получение среза последних (или среза первых). <Измерение> - тип значения этого поля определяется типом измерения. Каждое из таких полей содержит значение измерения регистра. Имена полей совпадают с именами измерений, заданными для объекта конфигу- рации. <Ресурс> - тип значения этого поля определяется типом ресурса. Каждое из таких полей содержит значение ресурса регистра. Имена полей совпа- дают с именами ресурсов, заданными для объекта конфигурации.
102 Реализация прикладных задач в системе «ЮПредприятие 8.2» <Реквизит> - тип значения этого поля определяется типом реквизита. Каждое из таких полей содержит значение реквизита регистра. Имена полей совпадают с именами реквизитов, заданными для объекта конфи- гурации. Виртуальная таблица среза последних не хранится в базе данных, а стро- ится в момент обращения к ней. Поэтому при использовании ее в запросах поддерживается весьма гибкая функциональность за счет использования параметров: Дата - имеет тип Дата, МоментВремени или Граница. Если параметр не задан, будут выбираться наиболее поздние записи, го есть без ограни- чения по времени Условие - содержит конструкцию языка запросов - условие. Стро- ится по любым полям регистра сведений (или подчиненным им полям). Используется для ограничения состава исходных записей, по которым при построении виртуальной таблицы будет выполняться срез. Если параметр не указан, будут использоваться все активные записи регистра. Например, соответствующее применение условий в запросах с использова- нием виртуальных таблиц позволяет легко решать задачи отбора информации так, как это потребуется. Рассмотрим несколько примеров для периодического регистра сведений ЦеныНоменклатуры (рис. 1.70). Ц еныН оменк натуры в Н © L. Измерения Ц Номенклатура 1_ ТипЦены © J Ресурсы J Цена © “ Реквизиты “ Ответственный Рис. 1.70. Структура регистра «ЦеныНоменклатуры» Рассмотрим следующую задачу: требуется получить информацию о том, по каким товарам на текущий момент есть цены ниже 100, кто за это ответс- твенен, и когда он установил такую цену. Задача может быть решена следующим образом (листинг 1.36).
Глава 1. Хранение информации 103 Листинг 1.36. Пример получения данных из периодического регистра сведений ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Период, ЦеныНоменклатурыСрезПоследних.Номенклатура] ЦеныНоменклатурыСрезПоследних.ТипЦены, ЦеныНоменклатурыСрезПоследних.Цена, ЦеныНоменклатурыСрезПоследних.Ответственный ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАКЦеныНоменклатурыСрезПоследни) ГДЕ ЦеныНоменклатурыСрезПоследних.Цена < 100 Обратите внимание: в постановке задачи акцент ставился на текущие цены. Поэтому в запросе сначала выполняется срез последних, а потом в таблице среза определяются записи, в которых цена ниже 100. То есть если когда-то на какой-то товар была низкая цена, но на текущий момент положение исправ- лено (установлена цена выше 100), то «никого за это наказывать не будем». Рассмотрим другую задачу: требуется получить информацию, по каким товарам вообще когда-нибудь устанавливались цены ниже 100, кто ответс- твенен за последние назначения таких цен, и когда они выполнялись. Возможно следующее решение (листинг 1.37). Листинг 1.37. Пример получения данных из регистра сведений ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.Период, ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.ТипЦены, ЦеныНоменклатурыСрезПоследних.Цена, ЦеныНоменклатурыСрезПоследних.Ответственный ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(; Ценя < 100) КАКЦеныНоменклатурыСре^Последних В данном случае акцент сделан на записях регистра, в которых цена ниже 100. А вот уже для записей, соответствующих этому условию, будет произ- веден срез последних. То есть в данном случае отвечать будет последний, кто устанавливал низкие цены, даже если на текущий момент цена на этот товар уже совсем другая. Рассмотренная выше функциональность получения среза последних для периодического регистра, но только уже «с другим знаком», легко получа- ется за счет применения методов ПолучитьПервое(), СрезПервыхО и виртуальной таблицы СрезПервых. Для таких задач важны данные записей, соответствующих точке среза, или первых следующих после нее в истории изменения информации регистра.
104 Реализация прикладных задач в системе «ЮПредприятие 8.2» Например, для ситуации, когда нужны данные по конкретной комбинации значений измерений (рис. 1.71). Рис. 1.71. Получение первых данных по комбинации значений измерений Также возможна ситуация, когда нужны данные среза всех первых следу- ющих записей регистра (рис. 1.72). Комбинации значений измерений ООО Сигма - Пульт VX 120 Срез первых следующих 110 200 ----- 215 ООО Сигма - Пульт PW 218 Ялта-Лтд - Пульт VX устанавливаемые значения цен 135 временная ось Дата получения среза Рис. 1.72. Получение среза первых По аналогии с работой в отношении получения последних актуальных приемы получения первых следующих абсолютно те же, только меняются название методов и виртуальной таблицы. Задача получения первых следующих записей заключается в том, чтобы найти записи с минимальным периодом среди тех записей, период которых равен или больше, чем указываемый параметр среза. Соответственно, если пара- метр среза (НачалоПериода или Дата) не указан, срез будет производиться по значению даты по умолчанию, то есть «01.01.01 00:00:00». А значит, в срез попадут самые первые по хронологии записи таблицы регистра.
Й Л- к-.', 105 Глава 1. Хранение информации Особенности получения данных из регистров сведений с режимом записи «Подчинение регистратору» Установка режима записи Подчинение регистратору означает добавление к физической таблице регистра сведений в базе данных ряда предопреде- ленных полей: и Регистратор, НомерСтроки, Активность. Кроме того, как было рассмотрено выше, для таких регистров невозможно наличие записей без ссылки на документ-регистратор. Данные особенности играют свою роль при получении информации из регистра. Для быстрого получения информации наборов записей, подчиненных некоему регистратору, имеются возможности использования объектной модели пред- ставления данных - метод ВыбратьПоРегистратору (). Например, если ссылка на нужный документ хранится в переменной Доку- ментРегистратор, то получить записи регистра можно с помощью следующего кода (листинг 1.38). Листинг 1.38. Пример получения данных из регистра сведений, подчиненного регистратору ВыборкаДвиженийДокумента = РегистрыСведений.ЦеныНоменклатуры .ВыбратьПоРегистратору(ДокументРегистоатор); Пока ВыборкаДвиженийДо;{умента.Следующий() Цикл II Выполнить действие с очередной записью движения //... КонецЦикла; Аналогичного результата можно добиться, используя соответствующий отбор в запросе (листинг 1.39). Листинг 1.39. Пример получения данных регистра сведений запросом
106 Реализация прикладных задач в системе «ЮПредприятие 8.2» Выборка = Результат.Выбрать()' Пока Выборка.Следующий() Цикл II Выполнить действие с очередной записью движения II... КонецЦикпа; В ряде задач может оказаться полезным использование полей Активность и НомерСтроки. Например, рассмотрим задачу получения перечня «длинных» документов (которым, например, подчинено более 100 записей в движениях по регистру). Данная задача может быть решена посредством применения следующего запроса (листинг 1.40). Листинг 1.40. Пример получения данных из регистра сведений ВЫБРАТЬ РАЗЛИЧНЫЕ ЦеныНоменклатуры.Регистратор ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ НеныНоменклатуры-НомерСтроки > 100 Рассмотрим другую задачу: требуется получить перечень документов с неак- тивными записями. Эта задача может быть решена посредством следующего запроса (листинг 1.41). Листинг 1.41. Пример получения данных регистра сведений ВЫБРАТЬ РАЗЛИЧНЫЕ ЦеныНоменклатуры.Регистратор ИЗ РегистрСпедений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ (НЕ ЦеныНоменклатуры.Активность'. Важно помнить, что для получения срезов первых и срезов последних система использует только те записи, поле Активность которых имеет значение Истина. ( нять или установить активность можно только для всех записей набора записей, подчиненных некоему регистратору. Таким образом, реализуется прикладная задача: при необходимости можно сделать доку- мент «неиграющим» без удаления его движений. Но поскольку документ с прикладной точки зрения - это регистрация события, то отключение влияния события может выполняться только полностью для всех записей, принадле- жащих данному документу.
Глава 1. Хранение информации 107 В остальном примеры и возможности получения данных из регистра сведений, описанные в разделах «Получение данных из непериодических регистров сведений» (см. стр. 87) и «Получение данных из периодических регистров сведений» (см. стр. 93), вполне применимы и для регистров сведений, подчи- ненных регистратору. Проектирование структуры регистров сведений Как было рассмотрено ранее, регистр сведений может содержать несколько измерений, ресурсов и реквизитов. Зачастую у разработчиков при проектировании прикладных решений возникает вопрос: «Что лучше? Создать несколько регистров с большим количеством ресурсов или, наоборот, создать много регистров, но с меньшим количеством ресурсов?». В общем случае единого ответа на этот вопрос нет. Для того чтобы облегчить принятие решения в каждой конкретной ситуации, приведем несколько моментов, на которые следует обращать внимание при проектировании регистров сведений. Структурный подход. Каждая запись в регистре сведений содержит инфор- мацию о том, что для данной комбинации ключевых полей установлены некоторые значения ресурсов. В том числе и в периодическом регистре сведений. То есть если запись добавляется или модифицируется, это выпол- няется для всех значений ресурсов. Нельзя отметить, что, начиная с такого-то момента, значение такого-то ресурса не меняется, а меняются только значения других ресурсов. Восприятие пользователем. При проектировании регистра важно проанали- зировать, как реально меняются значения данных, которые будут храниться в регистре, и выработать определенную модель отражения этих изменений в базе данных. Важно, чтобы отражение предметной области в регистре правильно воспринималось пользователем. Например, при хранении информации о курсах валют приходится иметь дело с информацией о курсе и кратности каждой валюты (24 рубля за 100 япон- ских йен - курс 24, кратность 100). Курс Центробанка меняется ежедневно, кратность... ну, наверное, один раз в несколько десятков лет. То есть если исходить из «накладных затрат» на выполнение операций с этой информацией в регистре, то напрашивается решение о разделении ее на два регистра: КурсыВалют и КратностиВалют. Однако с точки зрения восприятия информации пользователем, данные о курсе отдельно от данных о кратности - это нонсенс. Ну а поскольку работать с курсом и кратностью всегда придется одновременно, то проще реализовать задачу одним регистром с двумя ресурсами.
108 Реализация прикладных задач в системе «1С:Предприятие 8.2» Учет потенциальных модификаций состава регистра. Как обсуждалось выше, состав существующего регистра сведений всегда можно расширить. Одним из направлений расширения является ввод новых разрезов инфор- мации, то есть измерений. Например, принимая решение по добавлению ресурса ПредпочитаемыйЦвет, в котором будет содержаться информация о том, какого цвета товары пред- почитает покупатель, для регистра ПерсонифицированныйПрайс (рис. 1.73) желательно заранее уточнить, а не потребуется ли впоследствии добавить к такому регистру измерение Договор для более детального учета обещанных покупателю отпускных цен, П ерсонифицированныиП райе © 1_ Измерения 1_ Покупатель 1_ Номенклатура & i Ресурсы I Цена Рис. 1.73. Структура регистра «ПерсонифицированныйПрайс» Если потребуется, то лучше будет все же разделить информацию между несколькими регистрами. В одном будет храниться информация о каких- то качественных пожеланиях покупателей, в другом - информация о ценах с другим уровнем детализации. Время получения данных, необходимых для работы механизмов решения. Например, при работе некоторого механизма важно получать данные объекта и данные, связанные с данным объектом. Очевидно, что получение этих связанных данных из нескольких ресурсов одного регистра (одной таблицы) будет происходить в общем случае быстрее, нежели получение этих данных из нескольких регистров (нескольких таблиц). Время записи информации в базу данных. Запись в несколько регистров сведений в общем случае будет выполняться медленнее, нежели запись одной записи с несколькими ресурсами. «Слабое звено». Если данные одного из ресурсов нужно модифициро- вать очень часто, то объем базы будет расти существеннее, если в составе регистра много ресурсов. Особенно, если какой-нибудь из ресурсов будет являться хранилищем значений, в котором будет храниться картинка или бинарные данные. Такие данные вообще целесообразнее выделять в отде- льный регистр.
Глава 1. Хранение информации Хранение дополнительных характеристик Один из часто встречающихся вопросов хранения информации - это вопрос организации хранения значений характеристик, набор которых заранее неиз- вестен. Таким образом, при разработке прикладного решения нет возможности создать заранее набор реквизитов объекта. Кроме этого, велика вероятность, что конкретные характеристики будут использоваться не для всех объектов, а только для некоторого ограниченного их количества. Например, для некоторых элементов справочника Номенклатура может потребоваться хранить информацию об их цвете, мощности, габаритах (для бытовой техники); для других же - о размере, росте, материале и опять же о цвете (одежда); для третьих подобная информация вообще не имеет смысла (услуги). При этом не исключена вероятность, что автоматизиру- емая компания станет попутно торговать еще мобильными телефонами, что потребует наличия ряда специфичных характеристик номенклатуры, таких как поддерживаемые стандарты обмена информацией, наличие цифровой камеры, тип батареи и т. д. Классическая реляционная модель предполагает, что для хранения какой-либо информации в базе данных в таблице заводится колонка (поле) с опреде- ленным типом и именем. То есть введение реквизитов является естественным способом решения подобной задачи. Однако в рассматриваемом случае подобное решение является неэффек- тивным и зачастую неприемлемым с точки зрения требований, предъявляемых заказчиком. Неэффективность решения «в лоб» заключается в том, что подавляющее боль- шинство характеристик используются лишь для небольшого, ограниченного количества элементов справочника Номенклатура. Это означает, что, вводя для каждой характеристики отдельный реквизит, мы тем самым необоснованно увеличиваем объем хранимой информации. В самом деле, создав реквизит Размер (тип Число), мы добавили в физическую таблицу справочника Номен- клатура новую колонку. Но эта колонка будет хранить «содержательные» данные только для элементов справочника из группы Одежда (которых, например, 100-150 штук). Если при этом общее количество элементов в спра- вочнике Номенклатура будет равняться 10-15 тысячам, значит, практически для всех элементов справочника в этой колонке будет содержаться значение 0, т. к. данная характеристика для них не имеет смысла. С практической точки зрения создание реквизитов для хранения значений характеристик в большинстве случаев может быть неприемлемо потому, что добавление нового реквизита возможно только в режиме работы Конфигуратор. В реальной ситуации, как правило, необходимо создавать новые характеристики непосредственно в процессе работы, в режиме 1С:Предприятие.
110 Реализация прикладных задач в системе «^Предприятие 8.2» Таким образом, путь ввода новых реквизитов может оказаться слишком «затратным» во всех смыслах. В данном разделе мы рассмотрим возможные варианты решения задач дина- мического дополнения состава информации, характеризующей объекты. Хранение дополнительных характеристик определенного типа Рассмотрение задачи хранения дополнительных характеристик начнем с простого примера, когда все дополнительные характеристики, вводимые пользователем, имеют один и тот же тип значения. Допустим, необходимо организовать хранение дополнительное информации о контрагентах: кго из них относится к нерезидентам (зарубежные контрагенты); с кем из них можно торговать в кредит; кто относится к категории постоянных покупателей; и так далее. Другими словами, необходимо обеспечить возможность ввода и хранения следующих характеристик контрагентов: Резидент (тип Булево - Истина, Ложь); ПостоянныйПокупатель (тип Булево - Истина, Ложь); <новая характеристик (тип Булево - Истина, Ложь). Как было рассмотрено выше, вариант с булевыми реквизитами Резидент, ПостоянныйПокупатель и т. п. слишком «затратен» и неудобен. Один из вариантов решения этой задачи приведен в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. Это использование справочника Категории для хранения видов характеристик и регистра сведений Катего- рииКонтрагентов для хранения соответствия конкретной характеристики конкретному контрагенту (рис. 1.74). Кэтег up:iwK пнтрагентор £> 1_ Измерения Контрагент^ . Тип значения "СправочникСсылка.Контрагенты" 1_ Категория-^ J Ресурсы^ =• Реквизиты Тип значения "СправочникСсылка.Категории” Ресурсов нет Рис. 1.74. Структура регистра «КатегорииКонтрагентов»
Глава 1. Хранение информации 111 Тип значения измерения Контрагент — СправочникСсылка.Контрагенты. Тип значения измерения Категория - СправочникСсылка.Категории. Использование справочника Категории как объекта для хранения класси- фикатора категорий позволяет предоставить пользователям возможности динамической модификации этой информации. То есть ввод новой характе- ристики (категории) не требует помощи разработчика. Далее обратите внимание: в составе регистра нет ресурсов. Хотя, как описано в разделе «Хранение информации в регистрах сведений» на стр. 54, именно посредством ресурсов организуется хранение информации в регистрах сведений. Дело в том, что комбинации значений измерений обеспечивают уникальность каждой записи регистра, а наличие самой записи, по сути, и является инфор- мацией. Ведь по каждой комбинации Контрагент - Категория необходимо обеспечить хранение информации булевого типа. Если Истина, значит, конт- рагент относится к этой категории. Это в нашем случае реализовано просто наличием записи. Ну а значение Ложь в нашем случае будет реализовано отсутствием записи. Итак, общую схему хранения дополнительных характеристик контрагентов можно представить следующим образом (рис. 1.75). Рис. 1.75. Общая схема хранения дополнительных характеристик Дальнейшее использование этой информации в учетных или аналитических механизмах прикладного решения можно будет реализовывать посредством, например, соединени й с информацией регистра. Так, в составе демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, есть отчет ПродажиКонтрагентовИмеющихКатегорию, в котором пользователь может применять отборы по категориям контрагентов (рис. 1.76).
112 Реализация прикладных задач в системе «ЮПредприятие 8.2» Продажи контрагентов имеющих категорию Выбрать вариант..^ I Ч; М М+ М В ариант отчета: 10 сновной > Сформировать 11^ Настройка.. Начало периода W Конец периода 01.12.2009 Начало этого дня Все действия Равно Постоянный покупатель 9 В В е в в S Параметры данных: Отбор: Начало периода = 01.12.2009 Конец периода = 21.06.2010 Категория Равно "Постоянный покупатель Номенклатура Контрагент Количество Оборот - - - в Сумма Оборот 1С Аспект 7.7 5,00 450 Компания "Риона" 2.00 180| 1 Магазин"Гpvминский вал" 3,00 270} 1С Бухгалтерия 7.7 Базовая версия 6,00 420 Компания "Риона" 4,00 2801 Магазин "Грузинский вал" 2,00 140 1 С: Бухгалтерия 7 7 Стандартная i ерсия 4,00 560 Компания "Риона" 4,00 560I Wndows ХР Home Edition Russian CD 3,004 510 Компания "Риона" 2,00 340I Радоне» | ООО 1,00 170' Windows ХР Ноте Edition Russian UPG CD 7г00 595 Компания "Риона" 2,00 170 Магазин "Грузинский вал" 5,00^ 425| Windows ХР Professional Russian CD з,оо" 705 Компания "Риона" 2,00 470? Магазин "Грузинский вал" 1,00 235 ► -вдда/ —' Рис. 1.76. Отчет продажи контрагентов, имеющих категорию Сам отчет формируется при помощи системы компоновки данных. В схеме компоновки данных отчета создан набор данных - запрос, которому переда- ется следующий текст запроса (листинг 1.42). Листинг 1.42. Пример запроса, используемого при формировании отчета ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, ПродэжиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КопииествоОборот КАК КоличествоОборот, ПрлдажиОбороты.СуммаОборот КАК СуммаОборот ИЗ (BblBPAib РАЗЛИЧНЫЕ КатегорииКонтрагентов.Кочтрагент КАК Контрагент ИЗ РетистоСведений.КатегорииК.онтраген гов КАК КатегорииКонтоагонтов {ГДЕ КатегорииКонтрагентов.Категооия *}) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления Продажи.Оборотьк&НачалоПерпода, &КонецПериода,,) КАК ПродажиОборогы ПО ВложенныйЗэпрэс.Контрагент = ПроцажиОбороты Контрагент
Глава 1. Хранение информации 113 Краткий комментарий: условие отбора контрагентов по категориям реали- зуется во вложенном запросе по регистру сведений за счет использования языка запросов системой компоновки данных (инструкции, заключенные в {...}). Благодаря этому, вопрос организации отбора по категории берет на себя система компоновки данных. То есть пользователь сможет при необхо- димости обойтись вообще без отбора (тогда в отчет попадут все контрагенты из регистра сведений КатегорииКонтрагентов), организовать отбор по одной категории, по списку категорий, по всем категориям, кроме выбранных, и так далее. Реализация этой функциональности не требует усилий разработчика. Далее таблица неповторяющихся контрагентов, полученных во вложенном запросе, соединяется с таблицей оборотов регистра Продажи. Затем средс- твами системы компоновки данных, в соответствии с настройками и структурой отчета, заданными разработчиком в схеме компоновки данных, отчет компонуется и выводится пользователю. В форме отчета пользователь может изменить отчетный период, настроить отбор, сортировку и условное оформление отчета по своему желанию и переформировать отчет. Здесь мы рассмотрели вариант отображения и отбора контрагентов с уста- новленными категориями в отчете. От разработчика требовалось по крайней мере сформировать текст запроса. Но ряд функциональных вопросов в таком решении платформа может взять на себя полностью. Так, если установить для измерений регистра Кате- горииКонтрагентов свойство Ведущее, то пользователь при необходимости сможет быстро получать форму списка регистра с отбором по соответству- ющим значениям из форм справочников (рис. 1.77). v J ansa [контрагентJ (1С:Предприятие) T1J Q 'Л. '1k Ганза (Контрагент) Ганза (Контрагент) I ' Перейти__________________ I Договоры контрагентов Категории контрагентов Персонифицированный прайс ? писать и такрьпъ Все действия ’ Код: ;000000008 Наименование: 4ff.SE Родитель: I Поставщики «. 1 ан >а (Контрагент) ш Поодприя;ие) ах Ганза (Контрагент) Перейти Договоры контрагентов Категории контрагентов Персонифицированный прайс Открытие формы списка регистра с отбором по текущему контрагенгу также реализуется платформой Категории контрагентов «^Создать X Q, Найти... Все действия Контрагент Категория j А [гая Ганза Постоянный покупатель -&• Г анза Ганза ая Ганза Зарубежный Участник программы ‘ЭКО" Т орговля в кредит У Q1 Рис. 1.77. Использование команды перехода к списку регистра «Категории контрагентов» в панели навигации формы элемента справочника «Контрагенты»
114 Реализация прикладных задач в системе «ЮПредприятие 8.2» Кроме того, при удалении объектов, с которыми связаны записи регистра, система будет автоматически удалять такие записи. Это описано в разделе «Дополнительная функциональность при создании и удалении записей регистра сведений» на стр. 84. Хранение дополнительных характеристик произвольного типа Рассмотрим теперь более сложную и более распространенную задачу, когда все дополнительные характеристики, вводимые пользователем, имеют произ- вольный тип значения. Допустим, необходимо организовать хранение дополнительных характе- ристик номенклатурных позиций. При этом для ряда товаров необходимо организовать хранение информации о весе, для некоторых товаров - о цвете, для некоторых - об области применения и так далее. Пример решения данной задачи с использованием регистра сведении имеет право на жизнь. Однако, в отличие от рассмотренной в предыдущем разделе («Хранение дополнительных характеристик определенного типа») ситуации, здесь будем иметь дело с информацией уже не булевого, а произвольного, заранее неизвестного типа. То есть в регистре потребуется использование поля ресурса ЗначениеХарактеристики, При попытке реализации данного регистра в конфигурации встанет один существенный вопрос: какой тип значения должен быть у ресурса Значе- ниеХарактеристики? Действительно, характеристики будут иметь не только разный смысл, но и различные типы значений. Получается, что для ввода произвольных данных в поле ресурса тип значения последнего должен быть составным и включать в себя все возможные типы значений. Но для каждой характеристики тип значения должен быть персональным, чтобы не получилось, чго пользователь может ввести цвет «01.01.2010 г.», а потом пытаться понять, как с этим работать. Использование плана видов характеристик для хранения видов характеристик Для решения задачи хранения информации о соответствии видов характе- ристик и типов их значениг в составе конфигурации следует использовать объект План видов характеристик. План видов характеристик по своему устройству очень похож на справочник. Он поддерживает работу пользователей с видами характеристик («элемен-
Глава 1. Хранение информации 115 тами») и списками видов характеристик, может поддерживать иерархию, может включать в состав своих объектов реквизиты и табличные части, возможно использование предопределенных видов характеристик, заданных разработчиком. Однако самой важной особенностью объектов планов видов характеристик, отличающей их от других объектов, является использование свойства Тип значения. Это свойство позволяет определить список возможных типов данных, используемых для отдельных видов характеристик (то есть для каждого элемента плана видов характеристик), рис. 1.78. Возможно указание примитивных, ссылочных и составных типов данных । Рис. 1.78. Тип значения вида характеристики То есть для вида характеристики Цвет можно определить тип значения СправочникСсылка.Цвета, для вида характеристики Год выпуска - тип значения Дата, для Уровня шума - Число и так далее. Кроме этого, возможно использование составных типов значений, в состав которых могут входить как примитивные типы (Дата, Число, Строка, Булево), так и ссылочные типы данных (ДокументСсылка.<имя>, СправочникСсылка.<имя> и так далее, включая ПланВидовХарактеристикСсылка.<имя>). Пример создания и использования плана видов характеристик ВидыХарак- теристик приведен в составе демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске.
Реализация прикладных задач в системе «1С:Предприятие 8.2» Для того чтобы при описании типов значений для новых видов характеристик (элементов этого плана видов характеристик) пользователь мог выбирать значения только из определенного разработчиком списка, при конфигуриро- вании используется свойство Тип значения характеристик (рис. 1.79). Пользователи Физические Лица ДокументСсылка Указание типов значении, которые будут впоследствии - доступны при создании видов характеристик 0JLJ Рис. 1.79. Свойство «Тип значения характеристик» Обратите внимание: на рисунке видно, что в состав типов значений харак- теристик плана ВидыХарактеристик включено использование справочника ЗначенияХарактеристик. Введение подобного справочника в состав решения помогает обеспечить самостоятельный ввод новых возможных значений новых характеристик самим пользователем в тех ситуациях, когда в составе конфигурации нет объектов для отображения новой сущности. Например, в процессе эксплуатации программы возникла необходимость создания новых видов характеристик Область применения, Вариант оплетки, Формат бумаги и так далее. Вместо того чтобы под каждую сущность создавать свой справочник или перечисление, все значения таких дополни- тельных характеристик можно хранить в справочнике ЗначенияХарактеристик (рис. 1.80).
Глава 1. Хранение информации Значения характеристик ^Создать [ф & ;Х| Найти.. Все действия ” ^?) ^Наименование S. Код - АЗ А4 “ Белый Медицин^ Обучение * Охранные системы Пониженная важность Связь ™ Серебристый Спецхран 000000001 000000002 000000003 000000006 000000007 000000008 000000009 000000005 000000004 000000010 Значения вида характеристики "Формат бумаги" Значения вида характеристики Область применения Значения вида характеристики "Цвет" Рис. 1.80. Справочник «Значения характеристик» 1Ш Справочник ЗначенияХарактеристик ап ( мшвяв, шаътяшштмп, .• чши .. ишвп Основные г~ Подсистемы Функциональные опции I Список владельцев справочника: W. ------- —---- ---------------------р- • ПланВидов! Характеристик. В иДыХарактеристик Иерархия ' ► Владельцы Данные ВЛ ившшшш, & К Указание плана видов характеристик t— в качестве владельца справочника •шлишякмв! шш вл гшин/twm ~ шипит мшизит мъ плат ешш. итяш/икавиам Ш План видов характеристик ВидыХарактеристик Нумерация Формы Команды Макеты Ввод на основании Права Обмен данными Прочее rz ' [ Деистви? i ► Основные Подсистемы Функциональные опции Иерархия Имя. Синоним: Комментарий. Данные у ип значения характеристик: Нумерация СправочникСсылка.Контрагенты, ПланВидовХа| Формы Команды Макеты Ввод на основании Права / Обмен данными / Прочее / i / t Указание способа хранения по умолчанию для значений дополнительных характеристик Дополнительные значения характеристик: ........ / Представление объекта: Значения^ Характеристик Зод характеристики Расширенное представление объекта ( . Представление списка: I________________________J Расширенное представление списка: 1 I t Пояснение: I । ! I Действия ” | Далее> Закрыть ' Справка , Рис. 1.81. Свойство «Дополнительные значения характеристик»
118 Реализация прикладных задач в системе «ЮПредприятие 8.2» Однако для того чтобы при выборе значений характеристик из этого справоч- ника информация разных видов характеристик не перемешивалась, нужно подчинить элементы справочника элементам плана вида характеристик. Это реализуется следующим образом: устанавливается владелец справочника ЗначенияХарактеристик - план видов характеристик ВидыХарактеристик; свойство Дополнительные значения характеристик объекта конфигурации плана вида характеристик заполняется указанием справоч- ника ЗначенияХарактеристик (рис. 1.81). Этого достаточно, например, для того, чтобы платформа взяла на себя вопросы реализации основной функциональности, касающейся заполнения, хранения и отображения связей между видом характеристики и возможными ее значениями (рис. 1.82). Область применеии Перейти___________ Значения характеристик Область применения (Виды характе... Записать и закрыть В се действия Код: йбласть применения Наименование Тип значения [Значение характеристики Область применения {Виды . (ЮПредприятие} ,й| Й а, м ,м+м- щ^х Значение i характеристик Область ппимененм Oi крытие форме1 списка подчиненною справочника с отбором по владельцу также реализуется платформой Рис. 1.82. Использование команды перехода к списку значений характеристик в панели навигации формы плана видов характеристик Таким образом, создав план видов характеристик, разработчик определяет возможности хранения в базе данных перечня видов характеристик и опреде- ляет область допустимых значений этих характеристик.
Глава 1. Хранение информации 119 Описание дополнительных характеристик объектов конфигурации Естественно, характеристики объектов создаются не просто так, а для полу- чения данных в разрезе этих характеристик. Но сначала нужно описать, где и как хранятся характеристики объектов конфигурации. Платформа предоставляет возможность сделать это прямо в дереве объектов конфи- гурации. Удобство такого решения очевидно: описав один раз связь между объектом конфигурации и его характеристиками, разработчику больше не придется в каждом отчете, использующем характеристики объекта, указы- вать, где и каким образом хранятся его характеристики. В результате все отчеты и динамические списки, в которых участвует объект конфигурации, будут «подхватывать» его характеристики. Описание характеристик объектов конфигурации содержится в свойстве Характеристики. Диалог для описания характеристик можно вызвать, нажав кнопку Характе- ристики на закладке Данные в окне редактирования объекта конфигурации, например, Справочник Номенклатура (рис. 1.83). Свойство Характерис- тики можно задать для таких объектов конфигурации, как Справочник, Документ, Перечисление, План видов характеристик, План счетов, План видов расчета, План обмена, Задача, Бизнес-процесс. Команда Характеристики также доступна в контекстном меню дерева объектов конфи- гурации и в палитре свойств этих объектов. Рис. 1.83. Вызов диалога описания характеристик справочника «Номенклатура»
120 Реализация прикладных задач в системе «ЮПредприятие 8.2» В диалоге описания дополнительных характеристик объекта конфигурации нужно указать, где хранятся виды характеристик и значения этих характе- ристик. В реальной практике часто требуется хранить дополнительные характерис- тики не одного, а сразу нескольких объектов конфигурации - например, справочников номенклатуры, контрагентов, различных документов и т.д. И хранить их можно по-разному. Это зависит от специфики конкретной задачи, предпочтений разработчика, пожеланий заказчика и т.п. Ниже мы рассмотрим по мере усложнения следующие варианты хранения дополнительных характеристик объектов конфигурации и их значений: 1. В качестве источника характеристик указывается план видов харак- теристик, а значения характеристик находятся в регистре сведений При этом один план видов характеристик хранит виды характеристик только для одного объекта конфигурации. 2. План видов характеристик хранит виды характеристик для разных объектов конфигурации, а значения характеристик находятся так же, как и в предыдущем варианте, в регистре сведений. 3. Значения характеристик хранятся не в регистре сведений, а в справочнике, например, или в таблично)' части справочника. 4. В качестве источника характеристик указывается не план видов характе- ристик, а табличная часть справочника, которая хранит ссылки на виды характеристик. Варианты описания дополнительных характеристик Первый вариант Рассмотрим самый простой случай, когда в качестве источника характеристик указывается план видов характеристик, а значения характеристик находятся в регистре сведений. При этом один план видов характеристик хранит виды характеристик только для одного объекта конфигурации. Допустим, необходимо организовать хранение значений дополнительных характеристик номенклатурных позиций в регистре сведений. В составе демонстрационной конфигурации «Хранение информации и учет движения средства, которая находится на прилагаемом компакт-диске, для этого исполь- зуется регистр сведений ДополнительныеХарактеристики (рис. 1.84).
Глава 1. Хранение информации 121 Дополнительный ,арактеоисти> и 1_» Измерения 1_ Объект L, ВидХарактеристики^ I Ресурсы J ЗначениеХарактеристики «=» Реквизиты । Тип значения 'СправочникСсылка.Номенклатура" Тип значения "ПланВидовХарактеристикСсылка. ВидыХарактеристик" Тип значения "Характеристика.ВидыХарактеристик" Рис. 1.84. Структура регистра сведений «ДополнительныеХарактеристики» Измерение Объект имеет тип значения СправочникСсылка.Номенкла- тура, свойство - Ведущее. Тип значения измерения ВидХарактеристики - ПланВидовХарактеристикСсылка.ВидыХарактеристик, свойство — Ведущее. Тип значения ресурса ЗначениеХарактеристики - Характерис- тика .ВидыХарактеристик. В результате регистром сведений будет поддерживаться уникальность записей по набору значений измерений Объект - ВидХарактеристики, а для значений ресурса ЗначениеХарактеристики тип значения будет определяться теми значениями, которые указаны в составе соответствующего плана видов характеристик. Однако необходимо понимать, что мы описали все необходимое для хранения характеристик, но не для организации заполнения. С точки зрения системы измерения Объект и ВидХарактеристики никак не связаны между собой. А при вводе значений в поле ресурса по умолчанию никак не учитывается выбранный в поле измерения вид характеристики - система будет предлагать заполнять поле любым из типов, описанных в плане видов характеристик. В описании структуры регистра никак не задается информация о логической связи полей, в которых хранятся виды характеристик и значения характе- ристик. Более того, зачастую это сделать было бы просто невозможно. Дело в том, что в реальном решении такая связь может быть очень сложной. И хранение соответствия номенклатурных позиций и видов их характе- ристик может выполняться в других объектах конфигурации (например, в отдельном регистре сведений, хранящем связи «многие ко многим» между номенклатурными группами и видами характеристик, между отдельными номенклатурными позициями и группами видов характеристик и т.д.). А данные связи могут влиять на связи между видами характеристик и возмож- ными их значениями. Поэтому реализация всех этих связей выполняется разработчиком конфигурации в рамках специфики поставленной задачи.
122 Реализация прикладных задач в системе «ЮПредприятие 8.2» Допустим, необходимо реализовать достаточно простой вариант, когда для любой номенклатурной позиции можно использовать любой вид характерис- тики, и нужно лишь обеспечить удобство редактирования записей регистра в отношениях между видом характеристики и возможными значениями. В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, пример реали- зации этот задачи сделан с использованием свойств Связь по типу и Связи параметров выбора ресурса ЗначениеХарактеристики регистра сведений ДополнительныеХарактеристики. Для ограничения типов значений характеристики типами конкретного выбран- ного вида характ еристики у ресурса ЗначениеХарактеристики в качестве значения свойства Связь по типу выбрано измерение регистра ВидХарактеристики, а также свойство Связи параметров выбора ресурса ЗначениеХарак- теристики установлено как Отбор. Владелец (ВидХарактеристики). Для этого при нажатии кнопки выбора из списка возможных реквизитов регистра измерение ВидХарактеристики перенесено в список параметров выбора (рис. 1.85). Рис. 1.85. Свойства «Связь по типу» и «Связи параметров выбора» ресурса «ЗначениеХарактеристики»
- 123 Глава 1. Хранение информации В результате значения, вводимые в поле Значение характеристики, будут соот- ветствовать типу вида характеристики, выбранной в поле Вид характеристики. Кроме того, при выборе значений характеристики, содержащихся в спра- вочнике Значения характеристик, для выбора будут предлагаться только те значения, которые относятся к выбранному виду характеристики (рис. 1.86). Г Все действия ’ (т елефон LG W7200 Объект: [Сереб, истый Виа характеристики: Цвет Значение характеристики: Дополнительные характеристики (Соз... записал. и з акрыгь jjs чЛ й! Рис. 1.86. Соответствие вида характеристики и ее значений Остальная функциональность вопросов ввода, модификации, удаления данных посредством менеджера записи регистра реализуется системой и описана в разделе «Создание, изменение, удаление записей регистра сведений» на стр. 69. Таким образом, схему организации хранения дополнительных характеристик номенклатуры в рассмотренном решении в общем виде можно представить так (рис. 1.87). Рис. 1.87. Общая схема хранения дополнительных характеристик одного объекта конфигурации
124 Реализация прикладных задач в системе «ЮПредприятие 8.2» В этом случае описание характеристик номенклатуры примет следующий вид (рис. 1.88). Дополнительные характеристики объекта метаданных Рис. 1.88. Описание дополнительных характеристик справочника «Номенклатура» После описания характеристик в свойствах объектов конфигурации в настройках отчетов и динамических списков объектов конфигурации можно использовать их характеристики. Например, в отчете, отражающем остатки номенклатуры на складах, можно настроить отбор по характерис- тикам номенклатуры (рис. 1.89). нт ”пснрвнои'* атч та ''Откатки на складах" Хранение инфо^к иции и учет движения средгп |1 С Предприятие 1 Вариант "Основной" отчета "Остатки на складах" Добавить » j [tg | X | ть !3 Структура отчета 0 !*?tj Таблица О Строки Номенклатура Отччт Колонки iT?lПараметры Пользовател . Группируемы... ..^Поля [fiffiОтбор j , Сортировку /^|Услррноеоф... Дополнигель Текущий элемент имеет собственный стоор (для Фильтрации записей, выводимых в элементе) ^Добавить новый элемент I Сгруппировать условия | X ¥ % I Выбрать Все действия До< тупные поля Виа сравнения Значение Отбор Равно т< на 30 Белый Полное наименование Пометка удаления П редопреде ленный Режим пульсации Режим хранения Родитель Самовывоз Т олько по предоплате Т олько спецтранспортом Услуга Формат бумаги Номенк латура Цвет Все действия Рис. 1.89. Настройка отбора в отчете с использованием характеристик номенклатуры
Глава 1. Хранение информации 125. В результате отчет примет следующий вид (рис. 1.90). Рис. 1.90. Отчет «Остатки на складах» с отбором по характеристике номенклатуры «Цвет» Второй вариант Усложним задачу. Пусть план видов характеристик хранит виды характе- ристик для разных объектов конфигурации, например для справочников номенклатуры, контрагентов и организаций. При этом значения характе- ристик находятся так же, как и в предыдущем варианте, в регистре сведений. В этом варианте в план видов характеристик необходимо ввести реквизит, позволяющий отделять характеристики одного объекта конфигурации от другого, а при описании характеристик каждого объекта указывать данный реквизит и его значение в полях Поле отбора видов и Значение отбора видов, чтобы отбирались характеристики именно этого объекта. Для реализации данного решения в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, создано перечисление ВидыОбъектов (рис. 1.91). - Перечисления {.J В иды Договоров + {..} ВидыКонграгенгов + {,} ВидыОпераций *• {. J МетодыСписанияСебестоимости + bJ РазмещениеЗаказовПокупателей ВидыОбъек? “ Значения sss Справочники оменклатура СправочникКонграгенгы “» СправочникОрганизации Рис. 1.91. Перечисление «ВидыОбъектов»
126 Реализация прикладных задач в системе «^Предприятие 8.2» В план видов характеристик ВидыХарактеристик добавпен реквизит ВидОбъектов типа ПеречислениеСсылка. ВидыОбъектов (рис. 1.92). Рис. 1.92. Реквизит «ВидОбъектов» плана видов характеристик В регистре сведении ДополнительныеХарактеристики, хранящем значения характеристик, указывается, что тип измерения Объект будет составным и будет включать ссылки на справочники номенклатуры, контрагентов и организаций — СправочникСсылка. Номенклатура, Справоч- никСсылка. Контрагенты, СправочникСсылка.Организации (рис. 1.93). Схему организации хранения дополнительных характеристик различных объектов конфигурации в рассмотренном решении в общем виде можно пред- ставить, как на рис. 1.94. В этом случае описание характеристик одного из справочников, например, справочника контрагентов, примет вид, как на рис. 1.95. То есть при описании характеристик для справочника Контрагенты в Поле отбора видов указывается реквизит ВидОбъектов плана видов характеристик ВидыХарактеристик, а в поле Значение отбора видов указывается значение пере- числения ВидыОбъектов - СправочникКонтрагенты. Для справочников Номенклатура и Организации значение поля Поле отбора видов будет таким же, а в поле Значение отбора видов нужно указать соответствующее значение перечисления ВидыОбъектов - СправочникНоменклатура или Справоч- никОрганизации.
Глава 1. Хранение информации 127 Основные Подсистемы Измерения Функциональные опции ► Данные Макеты Прочее Объект г I Я [Регистр сведений ДополнительныеХарактеристики Регистраторы Формы Команды Права Обмен данными - L 1_ ВидХаракт^ристики ч Ресурсы \ S i ЗначениеХаракт^ристики Реквизиты ''’Основные: Имя Синоним Комментарий [Объект Объект Стандартны' [Действия 'J । <Назед Ведущее Основной отбор Запрет незаполненных з» И спользование: Индексировать F , j Полнотекстовый поиск [I П редставление: Редактирование типа данных X <₽ (J$ Пользователи Склады СпецификацииДоговоров ТипыЦен I OK j I Отмена | ънтшил L_______________J Рис. 1.93. Тип измерения «Объект» регистра сведений «ДополнительныеХарактеристики» Рис. 1.94. Общая схема хранения дополнительных характеристик различных объектов конфигурации
128 Реализация прикладных задач в системе «^Предприятие 8.2» Рис. 1.95. Описание дополнительных характеристик справочника «Контрагенты» Теперь в режиме 1 С:Предприятие останется только заполнить реквизит ВидОбъектов плана видов характеристик соответствующими значениями (рис. 1.96). Виды характеристик Все действия » | ^Создать | Q. Гф । QH зйти Код Hani teHGE зние Тип значения Вид объектов SuJ 000000011 Ограничения по отгрузке usa 000000005 Вес Число Справочник "Номенклатура" eSB 000000010 Время работы Строка Справочник "Организации" 000000007 Г абаригы Строка Справочник "Номеы латура' Категория ® 1 Категория Справочник "Контрагенты" oa 000000003 , Область применения , Значение характеристики . , Справочник "Номенклатчра" >1 |ик "Номенклатура" Категория (Вид характеристики) Категория (Вид хзракте... Перг ₽тм Значения хараь геристик Записать и закрыл. Тик "Номенклатура" Код: *000000016 1 ||ик "Номенклатура" Наименование Гхатегория Родитель: Т ип значения: (Категория .. Q Справочник "Организации1 Спрэы чник "Кинг, at енты' Справочни» "Контрагенты' Вид объектов: Д I Справочник "Номенклатура" Рис. 1.96. Заполнение реквизита «ВидОбъектов» плана видов характеристик После этого при настройке списка контрагентов по команде Все действия ► Настроить список в списке доступных полей будут доступны дополнительные характеристики, относящиеся к справочнику контрагентов (ВидОбъектов - Справочник "Контрагенты"), в данном случае - Категория (рис. 1.97).
' ЧНШЛ 129, Глава 1. Хранение информации Рис. 1.97. Настройка динамического списка с использованием характеристик контрагентов Например, при условии, что в регистре ДополнительныеХарактеристики присутствуют записи о контрагентах с выбранной категорией, список контра- гентов примет следующий вид (рис. 1.98). Контрагенты Создать i С? *1 | Q Найти... | Все действия ’ j 1 Наименование А 1 Г.од рид Тип цен ^П..*0.. * R I. J Покупатели 000000001 1Т-. Г+1 U ЧастныеЛица 000000002 h [И Я Компания "Риона" mull 000000004 ' Организация МглкцзоПТОВЯЯ 1 “• Магазин "Грузинский вал" । ‘ 000000014 Мелкооптовая jc зм"анир "Рю^" ГКоугграгент) (1С .,ЪЛ’ >< зиятее) j 3. м рл 1 Компания "Риона" [Конграге... 11ерейти ____ ______ Договоры контрагентов Дополнительные характеристики Категории контрагентов Персонифицированный прайс Дополнительные характеристики Все действия » | @ ^Создать I & X I Ц,Найти... | ; Объект 1 цц характеристики ! Значение характеристики А S3 компания "Риона" 1 Категпри- Пос. гоянный покупатель д г V Рис. 1.98. Список контрагентов с отбором по характеристике «Категория» В рассмотренном примере Категория - это дополнительная характеристика справочника контрагентов, имеющая тип СправочникСсылка. Категории. Для того чтобы при вводе значений в регистр ДополнительныеХарактеристики пользователь мог выбирать из справочника Категории, нужно указать этот справочник в составе свойства Тип значения характеристик плана видов характеристик ВидыХарактеристик (рис. 1.99).
130 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 1.99. Тип значения характеристик В заключение отметим, что если для справочника Организации реализовать первый вариант описания характеристик (без указания полей Поле отбора видов и Значение отбора видов), то даже при условии заполнения реквизита ВидОбъектов в плане видов характеристик при настройке списков и отчетов, в которых участвует данный справочник, все дополни тельные характеристики будут представлены «общей кучей», без разбивки на виды объектов конфигу- рации. Третий вариант Теперь рассмотрим случаи, когда значения характеристик хранятся не в регистре сведений, а в табличной части справочника. Виды характеристик будут храниться по-прежнему в плане видов характеристик. В процессе работы прикладного решения для одного объекта (например, элемента справочника) может потребоваться указывать сразу несколько значений одной и той же характеристики. Так, для некоторых номенклатурных позиций может понадобиться указать сразу несколько значений характеристики Область применения: Связь, Меди- цина, Обучение и т.д. Это значит, чго элемент справочника относится сразу к нескольким областям применения. В этом случае уже не получится хранить значения характеристик, как раньше, в регистре сведений, потому что регистр сведений не позволит сделать запись
Глава 1. Хранение информации 131 с неуникальными значениями измерений (один и тот же объект и одна и та же характеристика). И значит, их можно хранить, например, прямо в табличной части этого самого элемента справочника. Как в этом случае для справочника будут описываться характеристики, мы сейчас и рассмотрим. В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, к справоч- нику Номенклатура добавлена табличная часть ДополнительнаяИнформация, включающая в себя реквизиты ДополнительноеСвойство (тип значения ПланВидовХарактеристикСсылка. ВидыХарактеристик) и Значе- ниеСвойства (тип значения Характеристика. ВидыХарактеристик), рис. 1.100. Номенклатчоа © ПИ ® “ Реквизиты 0 Ш Т абличные части © ЙЗ ДополнительнаяИнформация “ ДополнительноеСвойство -< “ Значен^гСвойства Тип значения - "ПланВидовХарактеристикСсылка. ВидыХарактеристик" Тип значения "Характеристика.ВидыХарактеристик" Рис. 1.100. Структура справочника «Номенклатура» В результате в самом объекте справочника можно указывать сразу несколько значений для одной и той же характеристики (рис. 1.101). к Стзнцю А-359 (Номенклатура) (ТС: Предприятие) Станция А-359 (Номенклату... Станция А-359 (Номенклатура) Перейти _________________ Дополнительные характеристики Персонифицированный прайс Цены номенклатуры Записать и закрыть1 У П00РП0020 Наименование! Станция А-359 Код: Все действия ” | (?) Основные свойства , Дополнительные свойства | Добавить , X I > О Ы Все действия Дополнительное свойство ; Значение свойства Охранные системы Связь СпецХран Пониженная влажность 120СГ70СГ500 МП Область применения 2 Область применения 3 Режим хранения 4 Режим хранения 5 Габариты •Жг- Рис. 1.101. Форма элемента справочника «Номенклатура» Для обеспечения того, чтобы данные в табличной части вводились корректно, выполнены доработки, аналогичные рассмотренным в разделе «Первый
132 Реализация прикладных задач в системе «1С:Предприятие 8.2» вариант» на стр. 120. То есть задействованы свойства Связь по типу и Связи параметров выбора для реквизита ЗначениеСвойства табличной части ДополнительнаяИнформация. В целом схему организации хранения произвольных дополнительных харак- теристик номенклатуры в самом объекте можно представить так (рис. 1.102). Рис. 1.102. Схема хранения значений дополнительных характеристик В этом случае описание характеристик номенклагуры примет следующий вид (рис. 1.103). Дополнительные характеристики объекта метаданных U Lb X Виды характеристик Значения характеристик AM Пола ключа Поле отбора видов Значение отбора видов Поле объекте. Поле вида Поле значения —*4 . П ланВ идовХарактеристик. В идьХарактеристик : Справочник. И or генклатур 1. Г абличнаяЧасть. ДополнительнаяИнформация Ссылка ВидОбъектов Справочники оменк латура Ссылка Дополните льноеСвойгтвп ЗначениеСвойства 4 г Рис. 1.103. Описание дополнительных характеристик справочника «Номенклатура» В отличие от предыдущих вариантов, где все поля мы создавали самостоя- тельно, тут в табличной части справочника используется поле Ссылка, которое мы не создавали. Это поле создает сама платформа, когда мы указываем, что у справочника будет табличная часть. Несмотря на то, что это «служебное» поле, мы можем его использовать (и используем) при описании того, где хранятся значения характеристик. Т.к. для каждой табличной части справоч- ника существует отдельная таблица в базе данных, то записи этой табличной части всех элементов справочника хранятся в этой таблице. И именно по значению поля Ссылка можно определить, к какому же именно элементу
Глава 1. Хранение информации 133 справочника относятся эти записи. Поэтому при описании места хранения значений характеристик в качестве поля объекта мы указываем поле Ссылка, чтобы система отбирала из таблицы только те записи, которые относятся именно к этому элементу. Таким образом, табличная часть ДополнительнаяИнформация будет хранить значения характеристик номенклатуры так же, как и регистр сведений. Виды характеристик будут храниться по-прежнему в плане видов характеристик ВидыХарактеристик (рис. 1.104). Рис. 1.104. Хранение дополнительных характеристик в табличной части справочника «Номенклатура» В результате в отчете по остаткам номенклатуры на складах можно вывести значения дополнительных полей - характеристик, введенные в табличной части элементов номенклатуры (рис. 1.105). Остатки на Рис. 1.105. Отчет «Остатки на складах» с дополнительными полями-характеристиками номенклатуры «Цвет», «Вес» Остатки на складах
134 Реализация прикладных задач в системе «1С:Предприятие 8.2» Четвертый вариант В заключение рассмотрим случай, когда в качестве источника характеристик указывается не план видов характеристик, а табличная часть справочника, которая хранит ссылки на виды характеристик. А значения характеристик содержатся в регистре сведений. На практике одна и та же характеристика может испочьзоват ъся одновременно для нескольких объектов конфигурации (например, как для справочника Номенклатура, так и для справочника Контрагенты). А такого рассмотренные выше способы описания характеристик не позволяют сделать. При использовании одного плана видов характеристик для всех объектов конфигурации (вариант 2) в его специальном реквизите мы указывали единс- твенный объект конфигурации, к которому применяется эта характеристика. Значит, если есть необходимость применять эту характеристику и к другому объекту конфигурации, придется дублировать вид характеристики и в ней указывать другой объект конфигурации. Если для каждого объекта конфигурации использовать собственный план видов характеристик, то тоже придется дублировать вид характеристики, но уже в другом плане видов характеристик. Чтобы избежать такого дублирования, характеристики объединены в наборы характеристик, свойственные каждому объекту конфигурации. Эти наборы хранятся в отдельном справочнике, табличная часть которого и содержит описание характеристик каждого набора. Для реализации данного решения в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, создан справочник НаборыДополнительныхХа- рактеристик с табличной частью ДополнительныеСведения, включающей в себя реквизит Свойство (тип значения ПланВидовХарактеристикСсылка.Ви- дыХарактеристик), рис. 1.106. НаборыДопилнтельныуХарактеристик “ Реквизиты в ЦЗ Т абличные части ш ДополнителныеСведения Свойство ♦ Тип значения "ПланВидовХарактеристикСсылка. ВидыХарактеристик" Рис. 1.106. Структура справочника «НаборыДополнительныхХарактеристик»
Глава 1. Хранение информации 135 Справочник НаборыДополнительныхХарактеристик содержит предопре- деленные элементы, ссылки на которые позволяют создавать наборы характеристик, в которых одна и та же характеристика может применяться к различным объектам конфигурации (рис. 1.107). Ы Справочник НаборыДополмительныхХ...: Предопределенные элементы справочника О х Действия ’ 0 Kb X Имя Код Гнаименование е И -}лемт-ггы °® Документ_ПоступлениеТоваров Документ "Поступление товаров" “ Справочник_Контрагенты Справочник "Контрагенты" “ Справочник_Номенклатура Справочник "Номенклатура" Рис. 1.107. Предопределенные элементы справочника «НаборыДополнительныхХарактеристик» Схему организации хранения дополнительных характеристик различных объектов конфигурации в рассмотренном решении в общем виде можно пред- ставить так (рис. 1.108). Рис. 1.108. Схема хранения значений дополнительных характеристик В этом случае описание характеристик одного из справочников, например, справочника номенклатуры, примет вид, как на рис. 1.109. При описании табличной части справочника НаборыДополнительныхХарактеристик в качестве источника характеристик в Поле ключа указывается поле
136 Реализация прикладных задач в системе «1С:Предприятие 8.2» Свойство табличной части, в Поле отбора видов - иоле Ссылка справочника, в поле Значение отбора видов — значение ссылки на предопределенный элемент справочника НаборыДополнительныхХарактеристик. Д<.г»<днительиьи 1 акт нти объекта метаданных М [у х х I Вид» харогл пристиг “ -т-1* ~ ’ 1 1 Значения характеристик Поле ключа Поле отбора видов Значение отбора видов ' Поле объекта Поле вида Поле значения П ланВидовХарактеристик. В идьКарактеристик Ссылка ВидОсъ 1 Справочник. Номенклатура. Т обличнаяЧ асть. Дополните льнаяИ нформация Ссылка ДряппнительнреСвоистьо ЗначениеСвойства В идХарактеристики 1 Справочник_Но1ленклатура Ссылка '-войствг авочник На- р: г<олнитёльньыХарактеристикЛабличнаяЧасть.Д_ополнигелнь1еСведения РегисгрС. Л' ний ДополнительныеХарактеристики Объект ВиоХарактеристики Знтчениь арактеристиги X-J Рис. 1.109. Описание дополнительных характеристик справочника «Номенклатура» Спрасочни» "Ноченклстура'[Набор, доп [1С:Предлриятио[ yi М М+М” 0 X Справочник "Номенклатура" (Набор дополнительных характ... I Записать и закрыть Все действия » | > Н аименование: [Справочник' 'Н оменклатура'' ^Добавить , Гф X I “Sr ГЙ[Свойство 1 2 Режим хранения Все действия Область применения i..Q । Рис. 1.110. Набор дополнительных характеристик справочника «Номенклатура»
Глава 1. Хранение информации 137 На приведенном выше рисунке важна только вторая запись. Именно о ней мы и говорим. А первая запись осталась от предыдущего примера. Но в принципе этот рисунок показывает и то, что характеристики объекта конфигурации могут находиться в разных местах, по-разному храниться, и все это можно описать в диалоге описания характеристик объекта конфигурации, в одном месте, с помощью нескольких записей. Таким образом, для каждого предопределенного элемента справочника Набо- рыДополнительныхХарактеристик в режиме 1С:Предприятие можно ввести свойственные ему наборы характеристик (рис. 1.110). Как видно из рисунка, сами характеристики содержатся в плане видов харак- теристик, а табличная часть элементов справочника хранит только ссылки на него. После этого при настройке динамических списков и отчетов, в которых учас- твует данный объект конфигурации, будут доступны его характеристики, указанные в табличной части справочника НаборыДополнительныхХаракте- ристик.
138 | Реализация прикладных задач в системе «ЮПредприятие 8.2»
Глава 2. Документы и последовательности Место документов в концепции системы «1 С:Предприятие» При создании бизнес-приложений для решения задач учета, планирования, принятия решений, управления и т.д., как правило, используются опреде- ленные информационные модели. И, как правило, одно из центральных мест любой подобной модели занимает понятие события. Например, один из наиболее активно используемых вариантов исторически сложившейся информационной модели учетных решений можно представить в виде следующей схемы (рис. 2.1). Рис. 2.1. Информационная модель учетного решения
Реализация прикладных задач в системе «1С:Предприятие 8.2» 140 -I. » -It.-!., » . Основа учета - регистрация событий, происходящих с учитываемыми пока- зателями. Она может выполняться посредством внесения записей в журналы, записью проводок и т.д. В общем, посредством документирования. Причем документирование должно производиться не в «вольной» форме, а согласуясь с заранее разработанными и стандартизованными обозначе- ниями, зачастую сведенными в виде неких классификаторов. Конечно же, документирование нужно не как самоцель, а для обоснования информации, предоставляемой о состоянии учитываемых показателей. Так называемой отчетной информации. При выдаче же отчетной информации большое значение придается наглядности, удобству и быстроте ее получения. Для того чтобы обеспечить максимальную быстроту получения отчетной информации, идеально было бы получать ее сразу, минуя этап длительного перебора записей событий и подсчета их влияния на показатели. Поэтому отражение результата влияния зарегистрированных событие на показатели обычно производится заранее. То есть не в момент, когда потребуется отчет, а в момент, когда событие только регистрируется Для запоминания же состо- яния учитываемых таким образом показателей используются специальные регистры учета. Например, для классического бухгалтерского учета посредс- твом двойной записи итоги хозяйственной деятельности в виде сальдо «оседают» на бухгалтерских счетах. Рассмотрим, что предлагает платформа «ЮПредприятие 8» для реализации информационных моделей бизнес-приложений. Платформа «ЮПредприятие» позволяет строить прикладные решения, оперируя совокупностями объектов: соответствующими прикладным сущностям; выбираемыми из набора жестко определенных в платформе классов объектов. Обшую схему возможных вариантов взаимодействия прикладных объектов системы для решения той или иной задачи можно представить следующим образом (рис. 2.2). Можно отметить, что данная схема позволяет полностью реализовать функ- циональность предыдущей и при этом может обеспечить существенное расширение и дополнение ее. Фактически она позволяет строить модели на более высоком уровне абстра- гирования. Например, справочники, планы видов характеристик, перечисления, конс- танты, планы счетов и планы видов расчетов могут использоваться не только для обеспечения заполнения документов, но и цля заполнения некоторых видов регистров напрямую. А вообще - для хранения информации, не привя- занной ко времени.
Глава 2. Документы и последовательности 141 Рис. 2.2.. Варианты взаимодействия прикладных объектов Документы предназначены для ввода первичной информации, связанной с регистрацией событий, воздействующих на учитываемые в системе показа- тели. Если посмотреть на прикладные решения, то подавляющее большинство документов используют привязку ко времени - поле Дата, которое есть у всех документов. То есть можно говорить, что документы - это объекты для регис- трации информации, для которой важна привязка ко времени. Для облегчения обеспечения действий, связанных с вводом, отображением, логикой учета документов, при необходимости используются такие объекты, как нумера- торы, журналы документов, последовательности. Отчеты и обработки могут обеспечивать не только вывод информации в удобном для пользователя виде, но и ввод. То есть могут использоваться для обеспечения интерфейса выполнения воздействий на объекты, отвеча- ющие за хранение информации. Однако сами для хранения информации не используются. Регистры же можно воспринимать как объекты, предназначенные для хранения «вторичной» информации о состоянии показателей со слож- ными привязками к моментам времени и периодам. Обычно эта информация получается в процессе переработки исходной информации, вводимой документами. Например, факт болезни нужно регистрировать посредством документа Боль- ничный. Информация документа при его проведении будет отражена в регистре расчета зарплаты с тем, чтобы впоследствии, после проведения расчетных
142 Реализация прикладных задач в системе «ЮПредприятие 8.2» операций (включающих, например, вытеснение оклада за период болезни), из регистра можно было взять информацию о начисленном по болезни пособии и о начисленной заработной плате вообще. Однако опять же можно смотреть на использование регистров шире. Есть возможность использования регистров сведений (периодических или непериодических) с независимым режимом записи. То есть если это оправ- дано с точки зрения решения прикладной задачи, для таких регистров данные могут вводиться непосредственно, минуя этап работы с документом. Итак, подведем краткий итог: документирование событш - основа практи- чески любой модели бизнес-приложений. Без документирования информация, получаемая из системы, была бы необоснованной, а значит, возможно, недос- товерно-;. Таким образом, основное назначение документов - регистрация информации о происходящих событиях с привязкой ко времени. Документы Функциональность документов Для выполнения задач своего предназначения документы имеют соответству- ющий состав и обеспечивают возможность следующих основных действий: заполнение, запись, проведение, формирование движений по регистрам, расположение на оси времени, пометка на удаление, удаление. Такой набор функциональности заложен в систему и обеспечивает быструю разработку и удобст во использования документов. Разбеоем эти возможные действия подробнее. Заполнение документов Заполнение документа может производиться разными способами в зависимости от прикладной задачи и необходимого уровня сервиса для пользователя.
Глава 2. Документы и последовательности из Самый простой вариант заполнения - ручной ввод документа (рис. 2.3). Данный вариант обеспечивается чаще всего посредством формы, имеющей в качестве основного реквизита объект документа. Тогда ряд элементов формы обеспечивают отображение и ввод значений в реквизиты формы, а ряд - инициацию процесса записи документа, когда данные реквизитов формы записываются в сами объекты. Формы, основным реквизитом которых назначен объект документа, и элементы этих форм обладают расширениями, позволяющими реализовывать специфичное поведение системы для облег- чения работы разработчика с документами. Рис. 2.3. Ручной ввод документа Копирование. Вариант, когда новый документ создается копированием существующего, причем его данные заполняются данными существующего документа (рис. 2.4). Может инициироваться интерактивными действиями пользователя или программно - методом Скопировать (). Оба действия приводят к одному событию ПриКопировании и могут быть перехвачены обработчиком события, располагаемым в модуле документа. В самом обработчике может быть реализовано заполнение нового документа в зависимости от требуемого алгоритма (не обязательно только данными исходного документа).
] 44 Реализация прикладных задач в системе «^Предприятие 8.2» Рис. 2.4. Создание документа копированием Заполнение. Вариант создания нового документа, который инициируется в следующих случаях: командой Создать в панели действий приложения или в форме списка документов (см. рис. 2.3); командой ввода на основании СоздатьНаОсновании (рис. 2.5); при программном вызове методов глобального контекста ОткрытьФор- му() и ПолучитьФорму (); при программном вызове метода Заполнить (). Заказь (Покупателей ^Создать J X, (♦+) Найти Л Создать на осноь >нии ~ Все действия ’ ? f ~ ~ I п ... м Реализация товаров I Дата хг. . Номер Контрагент h- — -------.С— Л------J| 1 Л 000000001 Компания "Риона” 12Э/14К Пользователь Редактир! *вание F 15 04 2010 22.3411 Все действия .=. ! Номер Дата г~ I Открытие формы нпвт документа, заполнение реььисИ|ОВ в обработчике "ОбработкаЗаполнения" Реализация товаров ^Создать f л (++) Q Найти.. Запись докумеша Новый документ "Реализация товаров" Рис. 2.5. Создание документа вводом на основании
Глава 2. Документы и последовательности 145 Поскольку можно заполнять документ на основании данных любого объекта, то говорить об однозначном соответствии данных источника и документа- получателя не приходится. Поэтому само заполнение данных документа осуществляется в рамках обработчика события ОбработкаЗаполнения. Процедура обработчика располагается в модуле документа и содержит в качестве параметра объект-источник. Также в механизме заполнения участвуют свойства реквизитов объектов конфигурации Значение заполнения и Заполнять из данных запол- нения. Если свойство реквизита Заполнять из данных заполнения установлено в значение Истина, то процедура стандартной обработки запол- нения будет заполнять реквизит из данных заполнения (например, платформа автоматически будет заполнять реквизиты документов, по которым уста- новлен отбор в форме списка). Если в данных заполнения нет данных для заполнения этого реквизита или свойство имеет значение Ложь, то реквизит будет заполнен из свойства Значение заполнения, если оно установлено. Программное заполнение документов. Может выполняться за счет операций присвоения значений реквизитам документа (рис. 2.6). В данном случае выбор элементов формы и событий, при обработке которых будут производиться эти действия, предоставлен разработчику конфигурации. Создание нового документа при этом может производиться посредством метода СоздатьДо- кумент() на сервере или ОткрытьФорму () на клиенте. К данному способу прибегают обычно в случаях, когда создание нового доку- мента должно производиться не вручную, не копированием-заполнением, а в результате выполнения каких-либо программных алгоритмов. Рис. 2.6. Программное заполнение документа
146 Реализация прикладных задач в системе «ЮПредприятие 8.2» Расположение на оси времени Поскольку документ является регистратором события, одной из важных задач документа является фиксация времени, когда событие имело место. Поэтому все документы имеют поле Дата. И, более того, система не позволяет записать документы с неустановленной датой (равной значению даты по умолчанию). Согласно значениям этого поля все записанные документы могут быть распо- ложены на единой временной оси в хронологическом порядке (рис. 2.7). 12:30:45 12:30:47 12:30:48 Рис. 2.7. Расположение документов на оси времени Причем даже если ряд документов имеет одинаковое значение поля Дата, система «1С:Предприятие» имеет средства для обеспечения однозначного хронологического порядка — объект МоментВремени, содержащий дату и ссылку на документ (рис. 2.8). РеализацияТоваров №4 Дата 23.03.2010 12:30:45 РеализацияТоваров №2. Дата 23.03.2010 12:30:46 РеализацияТоваров №3 Дата 23.03.201012:30:46 Реали зция)оваров №1 Дата 23.03 2010 12:30:47 23.03.201012:30:45 23.03.2010 12:30:47 23.03.201012:30:46 Момент времени: Дата: 23.03.2010 12:30:46 Ссылка: РеализацияТоваров№2 Момент воемени: Дата: 23.03.2010 12:30:46 Ссылка: РеализацияТоваров№3 Рис. 2.8. Использование момента ^семени Объект МоментВремени используется системой автоматически при решении задачи отображения списков документов в хронологическом порядке. Также его используют, когда требуется получить данные из регистров именно на момент времени документа. Однако необходимо заметить, что за счет использования момента времени можно только получить хронологию расположения документов, изменить же ее в пределах одной секунды невозможно. Хронологический порядок доку- ментов определяется системой при обращении к данным - по датам, а для одинаковых дат - по ссылкам документов. И для документов с одинаковым
V-* 147 Глава 2. Документы и последовательности временем не зависит ни от порядка создания документов, ни от номера доку- мента, ни от чего-то подобного. Если необходимо изменить хронологию документов, нужно менять значения поля Дата документов, «разводя» их в разные секунды. Кроме того, в случаях, когда требуется обеспечить ввод и проведение доку- ментов реальным временем, можно воспользоваться возможностями механизма оперативного проведения документов и оперативной отметки времени. Это позволяет распределять документы на временной оси автомати- чески с соблюдением как минимум секундного интервала. О работе данного механизма подробно рассказывается в разделе «Проведение документов» на стр. 177. Запись документов Запись объекта документа - физический процесс, заключающийся в сохра- нении значений реквизитов документов в базе данных. Может инициироваться интерактивными действиями пользователя или программно - методом Записать (). Запись документа имеет несколько возможных режимов (просто - запись, проведение, отмена проведения). О происходящих при этих режимах записи процессах будет рассказано ниже. Общий же смысл использования этих режимов - обеспечение логических процессов бизнес-решения с использованием определенных «сценариев», заложенных в систему (удаление существующих движений, формирование новых, установка значения поля Проведен и прочее). Разработчик вправе принимать решения о необходимости применения того или иного сценария или механизма (рис. 2.9). Рис. 2.9. Запись документа
Реализация прикладных задач в системе «ЮПредприятие 8.2» Проведение документов Обсуждая это действие, необходимо разделять два понятия: «Проведен» - состояние документа; «Проведение» - как процесс. Проведенность как состояние может быть установлена различными спосо- бами. Может классически - в результате выполнения процесса проведения, а может просто присвоением значения Истина свойству документа Проведен. С прикладной точки зрения проведенным считается документ, если обра- ботка данного документа полностью завершена и принято решение, что данный документ должен участвовать в учете. То есть событие, регистриру- емое документом, полностью описано и учтено в информационной модели. Для отражения этого состояния документа используется системное поле Проведен. Процесс проведения документа в системе является частным случаем записи документа. Если состояние проведения было достигнуто в процессе проведения доку- мента, то, значит, были обработаны все события, связанные с записью документа в режиме проведения. А именно в обработчиках этих событии обычно и содержатся указания, что, где и как должно измениться в объектах информационной базы для реализации бизнес-логики, заложенной в решение (рис. 2.10). Рис. 2.10. Проведение документа Кроме того, зачастую используется процесс, обратный проведению, - отмена проведения. Выполнение этого процесса приводит к записи документа
Глава 2. Документы и последовательности 149 с отменой проведения. При этом выполняются обработчики, связанные с ним (рис. 2.11). Рис. 2.11. Отмена проведения документа Если же свойство Проведен просто установлено или снято для документа и документ был записан, то в результате для такого документа был выполнен процесс обычной записи документа. То есть часть событий не произошла для такого документа, а значит, не были обработаны соответствующим образом обработчики этих событий (рис. 2.12). Рис. 2.12. Использование свойства «Проведен» Однако для каких-нибудь регламентных или вспомогательных обработок может оказаться важной такая возможность: получить проведенные доку- менты без процесса проведения или непроведенные документы без процесса отмены проведения.
150 Реализация прикладных задач в системе «ЮПредприятие 8 2» Формирование движений по регистрам По своему назначению регистры служат для запоминания и переработки информации, внесенной в систему, как правило, документами. Поэтому для записей любых регистров (за исключением регистров сведений с установ- ленным режимом записи Независимый) обязательно наличие заполненного поля Регистратор. В этом поле должна находиться ссылка на документ, кото- рому подчинен этот набор записей. Такие наборы записей называют движениями (рис. 2.13). Реализация то. Перейти ______ Г оьары на ( кладах Продажи Реализация товаров ОриОоООЗЗ от 20.05 201019:50:11 -хранение ин.. (ЮПредприятие^ W, м W • .1 № Номер-|000000033 Контрагент: (Магазин "Грузинский в л Договор:, №05 2010 19:50111 ,.СЬ Дата поставки Q Вид операции Все действия - ^Реализация товаров 000000033 от 20.05.20t0 19:50:11^) Прогести ч закрыть rt Л Привести । Создать на основании * Провести неоперативно _______________________________i_________1 Склад: [Фили-2 Все действия ©Добавить X * ,N t 1 Номенклатура * J Количество Цена Сумма 1 С. Аспект 7 7 * * 3.00 90.00 270 00 2 ЮБухгалтерия 7.7 Базовая в< рсия 2.00 70 00 140.00 3 Windows ХР Home Е diti >rjRu ;sian UPG CD , 5,00 85,00 425.00 4 Windows XP Professional Russian CD t i i i i r l 1 00 235.00 235,00 Товары на складах (н) Найти... Все действия Период A - - — г . ... . - ... . ... _ ... Регистратор J *, Но.. Номенклатура Склад количе-- В. [По... + 20.05.201014:30.55 Поступление г « ас .*000000007 от 20.05.201. • 9 Сист. блок Hcwlett-Pac.. Глав... 10,00 Кро. + 20.05.201014:30:55 Поступление roL~porj000000007 от 20.05.201 । 10 Сист блок Hewlett-Pac Г лав.. 3.00 Кро. + 20 05.201014 J0:55 П оступление товаров 000000007 от 20.05.201 11 Сист. блок IBM NetVist, Глав... 5,00 Крс + Я] 05 2010 ,4 эи 55 Поступление титр# 000000007 от 20.05.201... 1 12 Сист блок 'EM NetV'st Г язв. К пп . Крс F 20.05.201019.50:11 ; Реализация тм т o4-i ЗОиОООЗЗ от 20 05.2010. ’ 1 Windows ХР Home Е dii Фи г 5.00 - 20.05.201019:50:11 Реализация товаров 000000033 от 20.05.2010. » 2 Windows ХР Profession Фили-2 1,00 - 20.05.201019:50:11 РеализацияТоваров 000000033от 20.05.2010.. 1 3 1 С:Аспект 7.7 Фили-2 3.00 20 05.20101950:11 РеализацияТоваров000000033от20.05.2010.. « 4 1 СБухгалтерия 7.7 Б. Фили-2 2.00 I + 20.05.2010 20:46:31 - 23.05.201017:27:34 - 23.05.201017:27:34 Продажи W Найти.. *4 Период А Регистратор Номер. Номе г», лат ура 9 Сист. блок IBM NetVista М41 10 Мышь Ice Mouse MUS-2 11 Мышь 2-кноп А4Т Dch PS/2 Все действия •• ф Ц Контрагент Крона Крона Крона 12 Мышь 2-кнеп АДТесИ Р$/2 Крина ’ 20.05.201019:50:11 1 Windows XF Ноте ЕсЙю*. Магазин'Т *инский 16.05.2010 18:25:20 Реализация тоьороь ОО00{1О032 от 16.05.2010. 16.05.201018:25:20 Реализация товаров ООООЙОП32 от 16.05.2010.. 16.05.2010 18:25:20 Реализация товаров 0000Ср032 от 16.05.2010 16.05.201018:25:20 Реализация товара 1IIIIII I or IК115 ’1,1 f1 Реализация товариз 000008РЗЗ от 20 05 2010. • 20.05.2010 19:50:11 РеализацияТоваров 000000033 от 20.05.2010.. • 20.05.2010 19:50:11 Реализация товаров 000000033 от 20.05.2010.. * 20.05.2010 19:50:11 Реализация товара 000000033 от 20.05.2010.. • 23.05.201017:27:34 Реализация товаров 000000034 от 23.05.2010. • 23.05.201017:27:34 Реализация товаров 000000034 от 23.05.2010. • 23.05.201017:27:34 РеализацияТоваров 100000034 от 23.05.2010.. 2 ЮБухгалтерия 7 7 Базов Магазин "Грузинские- Магазин "Грузинский .. Магазин "Грусингдии Компания "Риона" I 2 ЮБухгалтерия 7.7 Базов Компания "Риона" J 3 ЮБухгалтерия 7.7 Стенд. Компания "Риона" 3 Windows ХР Professional R. 4 1С:Аспект7.7 1 Установка lJU. Рис. 2.13. Движения документа
Глава 2. Документы и последовательности 151 Поведение системы во многом определяется наличием связи документов и подчиненных им движений. Например, движения отдельно от своих регис- траторов существовать не могут. Поэтому при удалении документов или отмене проведения (если свойство Удаление движений установлено в значение, отличное от Не удалять) система производит поиск движений этого документа в таблицах всех регистров, для которых данный документ может быть регистратором, и удаляет их. Именно поэтому, например, не рекомендуется «про запас» указывать регистры, для которых документ может быть регистратором. Нужно указывать только те, которые действительно требуются для обеспечения бизнес-логики, зало- женной в решение. Сами же движения могут: создаваться при проведении документов; создаваться при записи документов; формироваться в виде набора записей регистра (обязательно с отбором по регистратору); формироваться интерактивно (например, документом РучнаяОперация). То есть и непроведенные документы могут иметь движения по регистрам. Это обеспечивает возможность достаточно гибкого отражения ситуаций, возникающих в автоматизируемых задачах, и может быть использовано, когда обработка документа пользователем еще не завершена, но документ уже должен изменить некие учетные данные. Например, так может выглядеть задача последовательной обработки доку- мента ЗаказПокупателя различными подразделениями компании. Для отслеживания различных стадий обработки этого документа использу- ется регистр сведений ОперативноеУправлениеЗаказами (рис. 2.14). Рис. 2.14. Регистр сведений «ОперативноеУправлениеЗаказами»
152 Реализация прикладных задач в системе «Ю.Предприятие 8.2» Заполнение регистра производится при реализации промежуточных операций обработки документа (рис. 2.15). 3. Отдел запасов 1. Менеджер Рис. 2.15. Промежуточные операции обработки документа Сначала документ выписывается менеджером и записывается. При этом в регистре сведений ОперативноеУправлениеЗаказами формируется запись, указывающая, что данный заказ находится в стадии КФинансовомуКонт- ролю. Далее ответственный сотрудник финансового отдела проверяет возмож- ность удовлетворения данного заказа с точки зрения допустимости долга покупателя и соблюдения ценовых порогов. В случае положительного решения выставляется флажок Отпуск разрешен. При записи документа с этим установленным флажком модифицируется запись в регистре сведений ОперативноеУправлениеЗаказами. Теперь для данного документа актуально состояние КРазмещению. Далее обработку документа выполняет менеджер отдела запасов. Он рабо- тает со всеми заказами, имеющими статус КРазмещению. Если принимается решение об отгрузке из наличных свободных остатков, устанавливается флажок Отгрузка из свободных остатков, и заказ вписывается. При записи такого заказа его статус меняется на значение КРезервированию. Если же будет принято решение о выборе варианта Размещение в заказе поставщику, выполняется проведение документа с формированием движение по регистру ЗаказыПоставщикам.
Глава 2. Документы и последовательности azs № Заказы покупателей, перечисленные в регистре сведений ОперативноеУп- равлениеЗаказами и имеющие статус КРезервированию, проверяются и окончательно проводятся уже товароведом на складе. В таких случаях формируются движения по регистру Резервы (табл. 2.1). Таблица 2.1. Промежуточные операции обработки документа № Пользователь Стадия обработки Движения по регистрам Комментарий 1 Менеджер Заполнение Регистр сведений Оперативное управление заказами Формирование записи по заказу: статус К финансовому контролю 2 Финансовый отдел Контроль кредитной линии Регистр сведений Оперативное управление заказами Модификация записи по заказу: статус К размещению 3 Отдел запасов Решение об отгрузке из свободных остатков или заказе поставщику Регистр сведений Оперативное управление заказами Модификация записи по заказу: статус К резервированию, если принято решение об отгрузке из свободных остатков Регистр остатков Заказы поставщикам Проведение документа с формированием движений по регистру Заказы поставщикам (движения по регистру Оперативное управление заказами автоматически удаляются) 4 Склад Отметка о постановке в очередь на отгрузку Регистр остатков Резервы Проведение документа с формированием движений по регистру Резервы (движения по регистру Оперативное управление заказами автоматически удаляются) Обратите внимание: хотя движения по регистрам для обрабатываемого заказа формируются на каждой стадии обработки, «финальное проведение» выполняется только на последней стадии. Причем разработчик может выпол- нять его в рамках обработчика события ОбработкаПроведения, а может и самостоятельно, очищая старые движения, формируя новые и устанавливая свойство Проведен данного документа.
154 Реализация прикладных задач в системе «1С:Предприятие 8.2» Пометка на удаление документа Так же как и при работе с проведением, необходимо различать: состояние документа «ПометкаУдаления»; процесс «ПометкаУдаления». Документ считается помеченным на удаление в том случае, если в системное поле документа ПометкаУдаления записано значение Истина. Поведение документа, помеченного на удаление, имеет свои особенности. Например, такой документ не может быть проведен (рис. 2.16). Рис. 2.16. Проведение документа, помеченного на удаление Сам же процесс «ПометкаУдаления» обычно инициируется интерактивно или методом объекта документа УстановитьПометкуУдаления (ИСТИНА) и приводит к тому, что документ записывается с соответствующим значением поля ПометкаУдаления. При этом если документ был проведен, инициируется еще отмена проведения документа и удаление движений данного документа (рис. 2.17). Обратите внимание: отмена проведения и удаление движений произво- дятся при установке пометки удаления, только если документ был проведен. Если документ не был проведен, но имел движения, то при установке пометки удаления удаление движений не будет произведено. Если же для помеченного на удаление документа интерактивно снимается пометка удаления или применяется метод УстановитьПометкуУдале- ния (ЛОЖЬ), то инициируется запись документа с изменением значения на Ложь в поле ПометкаУдаления (рис. 2.18). Кроме того, значение свойства ПометкаУдаления объекта документа можно устанавливать программно и просто записывать документ. В таких случаях инициация события ОбработкаУдаленияПроведения не происходит. И если при этом документ был изначально не проведен, он записывается помеченным на удаление. Если же подобные действия выполняются для прове- денного документа, то система выдает предупреждение о невозможности записи документа и проведенного, и помеченного на удаление (рис. 2.19).
Глава 2. Документы и последовательности 155 Пометка на удаление Рис. 2.17. Установка пометки на удаление Рис. 2.18. Снятие пометки удаления Рис. 2.19. Использование свойства «ПометкаУдаления»
156 Реализация прикладных задач в системе «1С:Предприятие 8.2» А вот возможность помеченного на удаление документа иметь движения может быть полезной, если по какой-то причине необходимо отражать в учете данные документа, готовящегося к удалению. Например, пока не будет проведен документ, его заменяющий. Сами события «Установка помет ки на удаление» и «Снятие пометки удаления» с точки зрения документа выделенными процессами не являются. Поскольку в любом случае идет речь о записи помеченного на удаление документа (или со снятой пометкой), то все необходимые действия можно выполнить в обра- ботчиках событий, связанных с записью документа. Например, если для документа ПоступлениеТоваров требуется «перехватить» изменение значения свойства ПометкаУдаления для уже записанного доку- мента, можно поступить следующим образом (листинг 2.1). Листинг 2.1. Обработчик события «ПередЗаписью» Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) II Ограничить действия: только для записанных документов Если Не ЭтоНовый() Тогда // Получить пометку удаления текущего документа из базы данных Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Посту плениеТоваров.ПометкаУдаления ИЗ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров ГДЕ ПоступлениеТоваров.Ссылка = &ТекущийДокументг Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Выборка.Следующий(); II Сравнить текущее значение пометки удаления II и взятое из базы данных Если ПометкаУдаления <> Выборка.ПометкаУдаления Тогда Если ПометкаУдаления Тогда // Выполнить действия при установке пометки удаления II... Иначе II Выполнить действия при снятии пометки удаления //... КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры
Глава 2. Документы и последовательности 157 Удаление документов Удаление документов может производиться в составе механизма контроля ссылочной целостности. А может иметь место и непосредственное удаление объектов. Использование механизма контроля ссылочной целостности при удалении объектов или неиспользование определяется разработчиком и администратором конфигурации. Если документ имеет движения по регистрам, то при непосредственном удалении документа система автоматически удалит их. Событие ПередУдалением может обрабатываться в модуле объекта документа. Например, если требуется позволить непосредственное удаление только тех документов, которые не имеют движений, достаточно сделать следующее (листинг 2.2). Листинг 2.2. Обработчик события «ПередУдалением» Состэез документов Что в себя включают документы? Рассмотрим этот вопрос, учитывая области абстрагирования, использую- щиеся для работы с объектами в системе. Потому что в каждой области абстрагирования документ описывается по-разному. Можно говорить о составе документа как прикладного объекта, исполь- зуемого для организации прикладного решения. Можно как об объекте
158 Реализация прикладных задач в системе «1С:Предприятие 8.2» конфигурации, позволяющем организовать работу в отношении реализации прикладной задачи в рамках конфигурации. Можно о составе таблиц, полей, индексов, посредством которых организовано непосредственное хранение данных документов (рис. 2.20). Рис. 2.20. Понятие «Документ» Поскольку основной задачей документов как объектов прикладной области является регистрация событий, структура документов определяется именно этой задачей. Тогда что за информацию можно отражать в системе при регистрации события? Прежде всего, сам факт того, что событие произошло и когда оно произошло. Поэтому, как правило, для каждого события необходимо регистрировать порядковый номер этого события и дату происхождения. Соответственно, в состав любого документа включаются поля Номер и Дата. Это минимально возможный состав регистратора события. Действительно, могут иметь место ситуации, когда больше никако*- информации относительно данных доку- мента и не требуется. Например, для документов, отражающих регламентные операции («завершение периода», «снятие итогов» и т. п.). Для ситуаций, когда при регистрации события необходимо запоминать информацию, имеющую единичные значения для одного события, должны использовагься реквизиты документов. Например, Поставщик при регист- рации факта поставки товаров. Для ситуации, когда при регистрации события необходимо запоминать информацию, имеющую множественные значения, необходимо использовать табличные части документов. Например, табличная часть Товары при регист- рации факта поставки множества товаров.
Глава 2. Документы и последовательности 159 Как объект конфигурации для обеспечения решения задач прикладной области документ обладает свойствами (автонумерация, проведение и т.д.) и имеет в своем составе подчиненные объекты: Реквизиты документов - объекты, используемые для запоминания инфор- мации об объекте (документе), имеющей единичные значения для каждого экземпляра документа. Табличные части документов - объекты, используемые для запоминания дополнительной информации об объекте, представляемой в виде таблиц. Формы - объекты, используемые для обеспечения интерактивного ввода, просмотра и редактирования информации. Команды - объекты, используемые для разработки командного интерфейса документа. В модулях команд находятся обработчики для их выполнения. в Макеты - объекты (например, табличные документы), обычно использу- емые при формировании печатных форм объекта. Для обеспечения возможности манипулирования данными при написании алгоритмов обработки информации документов используются соответству- ющие объекты встроенного языка. На самом нижнем уровне абстрагирования используются объекты информационной базы, обеспечивающие выполнение задач вышестоящих уровней. Структура таблиц базы данных На уровне объектов базы данных информация о документах хранится в следу- ющих таблицах: в основная таблица документа, для каждого объекта конфигурации Документ; в таблица табличной части документа, для каждой табличной части каждого объекта конфигурации Документ. Структура полей этих таблиц следующая. Основная таблица документа: Ссылка - уникальный идентификатор, позволяющий однозначно опреде- лить данную запись. ВерсияДанных - версия записи (изменяется после каждого обновления данной записи). ПометкаУдаления — Булево. Проведен - Булево. Дата - дата/время регистрируемого документа.
160 Реализация прикладных задач в системе «^Предприятие 8.2» Номер - номер регистрируемого документа (поле существует, если доку- мент как объект конфигурации имеет длину номера, отличную от нуля). м ПрефиксНомера - начало периода уникальности номера. Поле определено, если в конфигурации для документа задана поддержка уникальности номера в пределах периода. Реквизит1 - тип значения поля определяется типом значения реквизита. Реквизиты-... Таблица табличной части документа: Ссылка - ссылка на документ, которому подчинена данная запись. Содержит то же значение, что и поле Ссылка основной таблицы доку- ментов. Ключ - ключ записи табличной части в рамках одного объекта базы данных; НомерСтроки - предопределенный реквизит табличной части, тип значения Число. Реквизит1 - тип значения поля определяется типом значения реквизита. Реквизиты-... Допустим, в конфигурации для регистрации контактов - деловых встреч, звонков, писем - используется документ Событие (рис. 2.21). Событие G в Реквизиты ВидСобытия «“ Контрагент “ ОписаниеСобытия и Ответственный Э L3 Т абличные части 0 nJ Сторонние Лица “ Контрагент “ Лицо Рис. 2.21. Документ «Событие» В базе было записано 4 документа. 01.03.2010 был оформлен документ с номером Т-001, в котором зафикси- ровано проведение переговоров с контрагентом КомбиТранс и сторонней организацией Баязет. Далее 02.03.2010 был зафиксирован телефонный звонок Баязет документом Т-002.
Глава 2. Документы и последовательности 161 Затем задним числом был введен документ Т-003, в котором зафиксирован выезд к заказчику Коринф. Последним документом с номером Т-004 был зафиксирован случайный звонок в офис. Данные этого документа в информационной базе будут храниться в таблице документа и таблице табличной части документа. Таблица документа будет иметь следующий вид (табл. 2.2). Таблица 2.2. Таблица документа «Событие» (левая часть) Ссылка Пометка Удаления Проведен Дата Номер Док! Ложь Истина 01.03.2010 10:00:00 Т-001 Док2 Ложь Истина 02.03.2010 11:00:00 Т-002 ДокЗ Ложь Истина 01.03.2010 13:00:30 Т-003 Док4 Истина Ложь 02.03.2010 15:00:00 Т-004 Таблица 2.2. Таблица документа «Событие» (правая часть) Вид События Контрагент Описание События Ответственный Переговоры КомбиТранс Переговоры Иванов Телефонный звонок Баязет Выяснение реквизитов Петров Выезд к заказчику Коринф Переговоры Иванов Телефонный звонок Ошиблись номером Иванов Обратите внимание: записи в самой таблице упорядочены согласно хроно- логии ввода информации. Таблица табличной части документа будет содержать записи только для тех документов, у которых она была заполнена (табл. 2.3). Таблица 2.3. Таблица табличной части документа «Событие» Ссылка Номер строки Контрагент Лицо Док1 1 Баязет Семенов Док1 2 Баязет Горбунков Если к реквизитам документа добавить еще реквизит, система при изменении конфигурации базы данных добавит к таблице документа еще одну колонку. Причем для «старых» записей значения этого поля будут заполнены соответс- твующими типу значения реквизита значениями по умолчанию. Аналогичные действия в отношении таблицы табличной части документа будут произведены, если к реквизитам табличной части документа добавить еще один реквизит.
162 Реализация прикладных задач в системе «ЮПредприятие 8.2» Чтобы обеспечить должное быстродействие при обращении к данным инфор- мационной базы, для таблиц хранения информации документов создаются следующие индексы: Ссылка; Дата + Ссылка; Номер + Ссылка - если для данного документа длина номера не равна нулю; Реквизит + Ссылка - если для данного реквизита свойство Индексиро- вать установлено в значение Индексировать; Реквизит + Дата + Ссылка - если для данного реквизита свойство Индексировать установлено в значение Индексировать с доп. упорядочиванием; Реквизит - если документ включен в критерий отбора через данный реквизит; ПрефиксНомера + Номер + Ссылка - если для данного документа длина номера не равна нулю. Табличная модель обращения к данным (посредством запросов) дает возмож- ность получения информации из этих таблиц в виде таблицы документа (табл. 2.4). Отдельные вопросы типового использования документов Нумерация документов Для решения бизнес-задач зачастую серьезным вопросом является нумерация документов. Например, существует даже такое понятие, как «документы строгой учетности», предъявляющие определенные требования к порядку ведения нумерации документов. Для обеспечения этого и других вопросов в системе созданы следующие возможности: На уровне объекта конфигурации Документ можно управлять свойствами: Длина номера - определяет разрядность поля, отводимого под номер документа. Контроль уникальности - определяет необходимость контроля непов торяемости номеров средствами системы перед записью объекта. Автонумерация - определяет необходимость формирования новых номеров средствами системы при попытке создания новых объектов.
Таблица 2.4. Состав таблицы документа Поле Тип Назначение Г' ITflZQ V U1J 1 1Х.1Л ДокументСсы.пка .<Имя> Содержит ссылку на документ ВерсияДанных Строка Содержит версию данных документа ПометкаУдаления Булево Содержит признак пометки на удаление Номер Число, Строка Содержит номер документа Дата Дата Содержит дату документа Проведен Булево Содержит признак проведенности документа Представление Строка Виртуальное поле, не хранится в базе данных. Строковое представление, содер- жащее имя документа, его номер и дату. Не может использоваться для операций сравнения в тексте запроса МоментВремени МоментВремени Виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ссылку на документ) <Реквизиты> Произвольный, определя- ется типом реквизита Каждое из полей содержит значения реквизитов документа. Имена полей совпа- дают с названиями реквизитов, заданными для объекта конфигурации <Табличные части> РезультатЗапроса Каждое из полей содержит табличные части документа. Имена полей совпадают с названиями табличных частей, заданными для объекта конфигурации. Сами значения полей содержат результаты запросов по табличным частям документа. Результат запроса к табличной части состоит из колонок с именами, соответству- ющими именам реквизитов табличной части документа и колонки НомерСтроки Глава 2. Документы и последовательности ] 63
164 Реализация прикладных задач в системе «^Предприятие 8.2» Периодичность (Непериодический, В пределах года, В пределах квартала, В пределах месяца, В пределах дня) - определяет границы периодов контроля уникальности и повторяемости номеров автонумерации. Тип номера (Строка, Число) - определяет тип поля Номер. Нумератор - используется для возможности организации сквозной нуме- рации документов разных видов. Автоматическая нумерация Автоматическая нумерация позволяет создавать новые документы с заве- домо уникальными номерами в пределах указанно-1 периодичности. Для включения этой возможности достаточно установить флажок Автонуме- рация. Тогда система будет присваивать каждому новому документу номер, на единицу больший самого большого номера среди документов данного вида в пространстве префикса документа, в том периоде, к которому отно- сится дата документа. Причем независимо от того, создается этот новый документ интерактивно или программным способом. Механизм автонумерации позволяет работать в двух режимах: в режиме с возвратом неиспользованных номеров и в режиме без возврата неисполь- зованных номеров. Режим устанавливается свойством объекта метаданных Конфигурация РежимАвтонумерацииОбъектов. Режим автонумерации прикладных объектов конфигурации определяет, использовать или нет автоматически полученные номера объектов, если они не записаны в базу данных. Для документов, требующих непре- рывной нумерации, которая будет реализована при записи, свойство РежимАвтонумерацииОбъектов необходимо установить в значение НеОсвобождать Автоматически (этот режим устанавливается стан- дартно), а значение ОсвобождатьАвтоматически можно использовать для обеспечения механизма нумерации, аналогичного версии пла!формы «1С:Предприятие 8.0». За выдачу номеров отвечает специальный менеджер автонумерации. Его использование позволяет существенно повысить параллельность работы за счет отсутствия блокировок базы данных. Механизм автонумерации выдает номера в разрезе пространств номеров и префиксов. Пространство номера в зависимости от типа объекта может содержать метаданные, владельца, период и др. В пределах пространства номеров номер выдается в разрезе префиксов.
Глава 2. Документы и последовательности ] Префикс документа определяется системой путем приведения строковых номеров к числу. Причем к числовому формату цифры номеров приводятся от последней к первой, пока процесс не дойдет до символа, который невозможно распознать как число. После этого символы левой части номера считаются префиксами. По каждому префиксу хранится максимальный выданный номер, на осно- вании которого выдается следующий номер. Один и тот же максимальный номер может соответствовать нескольким префиксам. Для получения максимального номера по пустому префиксу система опре- деляет наибольший префикс по порядку алфавитного возрастания. Далее определяется самый большой номер с данным префиксом. Именно он впос- ледствии будет инкрементироваться для определения следующего номера. Приведем пример работы данного алгоритма. Допустим, в таблице доку- ментов содержатся записи со следующими номерами (табл. 2.5). Таблица 2.5. Номера документов Номер АТ0001 МП 0009 АТР-3 Ф002 Наибольший по алфавиту префикс - Ф. Поскольку самый старший номер с таким префиксом Ф002, то автонумерацией будет создан следующий номер: Ф003. При первом получении номера по определенному пространству номеров и префиксу выполняется неблокирующее чтение максимального номера из базы данных, т. е. механизм автонумерации использует базу данных для получения максимального номера по определенному пространству номеров и префиксу только один раз. При последующих попытках получить очередной номер механизм автонуме- рации использует максимальный номер по данному пространству номеров и префиксу, как было описано ранее. Ниже на схемах показаны возможные варианты использования автонуме- рации. Если у свойства Периодичность документа установлено значение Непе- риодический, то в результате автонумерации будем видеть такую картину (рис. 2.22).
166 Реализация прикладных задач в системе «1С:Предприятие 8.2» Номера документов: 00118 00119 00120 00121 .12.2009 Г. 01.01.2010 г. Рис. 2.22. Непериодическая автонумерация Если у свойства Периодичность документа установлено значение В пределах года, то в результате автонумерации будем видеть такую картину (рис. 2.23). Номера документов: 00118 00119 00001 00002 Дата: 31.12.2009 г. 01.01.2010 г. Рис. 2.23. Автонумерация в пределах года Однако нельзя забывать о том, что при автонумерации следующий номер, выдаваемый системой, всегда на единицу больше самого старшего. Например, если в последнем примере (с периодичностью год) изменить дату «прошло- годнего документа», то можно получить такую картину: дата документа с номером 00118 была изменена на 01.01.2010. В результате последующие номера, формируемые автонумерацией, начинаются от 00119 (рис. 2.24). Номера документов: 00119 00001 00118 00119 Дата: 31.12.2009 г. 01 01.2010 г. Рис. 2.24. Работа автонумерации при изменении даты документа Использование лидирующих нулей Если авгонумерация применяется для номеров строкового типа, то в этом случае используются лидирующие нули в составе номера. Все пробелы перед самим номером замещаются нулями. Например, 00031. Это необходимо для обеспечения корректности поиска и сортировки по номеру. Иначе документ с номером 31 располагался бы раньше документа с номером 7 (рис. 2.25). Сортировка по возрастанию (алфавитная) Сортировка по возрастанию (алфавитная) 118 31 7 00007 00031 00118 Рис. 2.25. Использование лидирующих нулей
Глава 2. Документы и последовательности Параллельное ведение нумераций документов одного вида Например, выписываемые от разных юридических лиц накладные должны иметь нумерации, сквозные в пределах каждого отдельного юридичес- кого лица. Для решения этой проблемы устанавливается строковый тип номеров документа и автонумерация. Далее необходимо программно назна- чать префиксы автонумерации в обработчиках соответствующих событий. В результате система формирует новый номер по вышеописанным правилам, но только еще в пределах назначенного префикса автонумерации. Для назначения префикса автонумерации можно использовать обработчик события ПриУстановкеНовогоНомера или метод объекта документа УстановитьНовыйНомер (). Например, если необходимо установить новый номер в пределах префикса автонумерации, значение которого хранится в реквизите Префикс органи- зации, указанной в реквизите документа Организация, тогда можно поступить следующим образом (листинг 2.3). Листинг 2.3. Установка нового номера в пределах префикса автонумерации Процедура ПриУстановкеНовогоНомера(СтандартнаяОбрНоотка, Префикс) Префикс = Организация.Префикс; КонецПроцедуры ЗГ ' И№ *- Vn 'i ft**,» Сервер Модуль объекта Событие ПриУстановкеНовогоНомера вызывается при записи документа, только если для данного документа назначена автонумерация и только в транзакции записи, между событиями ПередЗаписью и ПриЗаписи объекта Документ (рис. 2.26). Если в процедуре-обработчике этого события параметру Префикс назначить значение, то именно это значение и будет использо- вано в качестве префикса автонумерации для установки нового номера. Если же, кроме того, номер документа необходимо менять в ответ на изменение значения реквизита Организация, то в соответствующем обработчике события можно приме- нить метод объекта документа УстановитьНовыйНомер(). Он устанавливает новый номер документа в пределах периода, в соответствии с установленной датой документа для заданного префикса автонумерации (листинг 2.4). Рис. 2.26. Установка нового номера документа в транзакции записи документа
168 Реализация прикладных задач в системе «ЮПредприятие 8.2» Листинг 2.4. Обработчик события «ПриИзменении» элемента формы документа «Организация» &НаКлиенте Процедура ОрганизацияПриИзменении(Элемент) II Установить новый номер согласно префиксу организации УстановитьНовыйНомерНаСервере(); КонецПроцедуры Из обработчика события, возникающего при изменении элемента формы Организация, вызывается метод объекта документа УстановитьНовыйНо- мерНаСервере () (листинг 2.5). Листинг 2.5. Использование метода документа «УстановитьНовыйНомерНаСервере()» &НаСервере Процедура УстановитьНовыйНомерНаСервере() Документ = РеквизитФормыВЗначение("Объект"); Документ .УстановитьНовыйНомер(Объект.Организация.Префикс); ЗначениеВРеквизитФормы(Документ, "Объект”); КонецПроцедуры ПРИМЕЧАНИЕ Эти примеры приведены в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, для документа ПриходныйКассовыйОрдер. В результате подобных действий можно добиться того, что вне зависимости от порядка оформления документов по разным организациям нумерация будет сквозной именно по каждой из организаций. Вернее по префиксу каждой организации (рис. 2.27). Рис. 2.27. Автонумерация с использованием префиксе з Хотелось бы упредить от попыток использования префиксов, которые целиком входят в состав других префиксов, например, АИ и А. В этом случае, как разбирали выше, при попытке формирования нового номера с префиксом А получим следующий номер от префиксации АИ. Дело в том,
Глава 2. Документы и последовательности 169 что механизм автонумерации считает префикс А зависимым от префикса АИ и изменяет максимальный номер зависимых префиксов в соответствии с номером того префикса, в состав которого они входят. Организация сквозной нумерации при помощи нумераторов Кроме разделения нумерации может возникнуть обратная задача - обес- печение общей сквозной нумерации. Обычно это требуется, когда имеется несколько видов документов для отражения похожих хозяйственных операций, но необходимо организовать для них сквозную нумерацию, невзирая на вид документа (рис. 2.28). Документ: Реализация дв-00012 (купля/ продажа) Документ: Реализация (комиссия) АВ-00013 АВ-00014 АВ-00015 Рис. 2.28. Использование нумераторов Для решения такой задачи используется объект конфигурации Нумератор. В нем описываются: Длина номера, Контроль уникальности, Периодичность, Тип номера. Далее у всех документов - объектов конфигурации, для которых нужна сквозная нумерация, указывается этот нумератор и устанавливается свойство Автонумерация. В результате формирование нового номера производится при обращении уже не к одной таблице документов информационной базы, а к таблицам доку- ментов, которым назначен данный нумератор. Запись документов Запись документа может производиться как из формы документа, так и не из формы документа. В первом случае запись документа инициируется расширением формы документа (для функционирования этого расширения необходимо, чтобы основным реквизитом формы был объект документа). Работа расширения формы обеспечивает специфичное, удобное для пользователя поведение формы при редактировании и записи документа.
170 Реализация прикладных задач в системе «ЮПредприятие 8.2» Во втором случае форма документа не используется, а обращение идет непос- редственно к объекту документа. При реализации записи документа из формы, кроме самой записи, выпол- няются еще стандартные действия, определяемые расширением формы: установка даты документа, установка режима проведения, запрет опреде- ленных действий пользователя и т. д. Подробно эти действия рассматриваются в разделе «Особенности работы формы документа» на стр. 195. При записи документа не из формы выполняется только запись документа (рис. 2.29). ।-----------------1 ।-----------------1 Запись документа Запись документа из формы не из формы Рис. 2.29. Запись документа При выполнении самой записи документа производятся следующие действия: Контроль уникальности номера документа. Выполняется, если у доку- мента как объекта конфигурации установлено свойство Контроль уникальности. При этом если у документа установлено свойство Автонумерация, при попытке редактирования номера документа будет получено предупреждение: «Номер заполняется при записи автомати- чески. Продолжить редактирование?». Затем, если номер документа был изменен, в транзакции записи между событиями ПередЗаписью и ПриЗаписи объекта Документ выполняется контроль уникальности номера документа, и если номер не уникальный, то транзакция записи отменяется. Проверка версии документа. Проверяется идентичность версий объекта документа и версии записей базы данных, хранящих данные этого доку- мента. Если веосии не совпадают, транзакция прерывается и выдается предупреждение: «Операция не может быть выполнена из-за несоответс- твия версии или отсутствия записи базы данных (возможно запись была изменена или удалена)!». Это необходимо, например, при следующей
Глава 2. Документы и последовательности 171? ситуации: некой обработкой программно было обеспечено, что для двух пользователей были открыты формы одного и того же документа. Первый пользователь изменил значение Контрагента в документе, второй значение - Номенклатуры. На момент первой попытки записи измененного документа версии объекта документа и записей базы данных совпадут - документ будет записан. Но при попытке записи документа другим пользователем версии не совпадут, и система не позволит записать параллельно изме- ненный документ, поскольку данное действие может породить коллизии. Запись данных в таблицы документов. Запись данных в таблицы табличных частей документов. Данное дейс- твие оптимизировано по скорости исполнения. Это происходит за счет автоматического различения ситуаций, когда необходимо записать (модифицировать) данные всех записей, подчиненных записываемому документу, или только одной записи. Причем если модифицированы были значения реквизитов документа, а не табличной части документа, то данное действие вообще не выполняется. Запись данных в таблицы журналов, если данные документа использу- ются в этих журналах. Запись данных в таблицы регистрации изменений планов обменов, если данный документ входит в состав обмениваемых данных. Причем сама запись документа может вызываться интерактивно или программно. Интерактивно запись инициируется действиями пользователей, приводящими к выполнению системных действий: «Записать»; «Провести и закрыть»/«3аписать и закрыть»; «Провести»; «Отмена проведения». Программно в контексте формы документа запись может быть инициирована посредством метода Записать () расширения формы документа. Причем методу может быть передана структура ПараметрыЗаписи, содержащая предопределенные параметры записи РежимЗаписи и РежимПроведения. Параметр РежимЗаписи содержит значения из системного перечисления РежимЗаписиДокумента: Запись, ОтменаПроведения, Проведение. В зависимости от значения параметра поведение системы будет различным. Например, для значения Запись будет вызвана запись данного документа без проведения, для значения Проведение - запись с проведением, для значения ОтменаПроведения - запись с отменой проведения.
172 Реализация прикладных задач в системе «1С:Предприятие 8.2» Параметр РежимПроведения используется в случае записи документа с проведением и содержит значения из системного перечисления РежимПроведенияДокумента: Неоперативный, Оперативный. Для значения Неоперативный будет выполнено неоперативное проведение документа, т. е. проведение выполняется не в реальном времени (например, проведение задним числом), для значения Оперативный будет выполнено оперативное проведение документа, т. е. проведение выполняется в реальном времени (например, при этом может быть выполнен контроль текущих остатков). Действие «Записать» При записи документа, вызванной интерактивным действием «Записать» или применением метода Записать (Новый Структура ("РежимЗаписи", РежимЗаписиДокумента.Запись), кроме самой записи инициируется последовательность событий. Для непроведенного документа последовательность событий при записи из формы документа будет следующей (рис. 2.30а). Рис. 2.30а. Вызов событий при выполнении действия «Записать» для непроведенного документа
Глава 2. Документы и последовательности 173 Следует иметь в виду, что для расширения формы документа платформа по умолчанию устанавливает свойство ПриЗаписиПерепроводить. То есть при записи проведенного документа будет автоматически выполняться его перепроведение. В этом случае для проведенного документа последо- вательность событий при записи из формы документа будет следующей (рис. 2.306). Рис. 2.306. Вызов событий при выполнении действия «Записать» для проведенного документа Если свойство ПриЗаписиПерепроводить у расширения формы доку- мента не установлено, то последовательность событий при записи в форме для проведенного документа будет такой же, как и у непроведенного доку- мента (см. рис. 2.30а). Для документа, у которого запрещено проведение (свойство Проведение установлено в значение Запретить), последовательность событий при записи из формы документа будет следующей (рис. 2.30в).
174 Реализация прикладных задач в системе «ЮПредприятие 8.2» Рис. 2.30в. Вызов событий при выполнении действия «Записать» для документа, у которого запрещено проведение Часть событий относится к контексту формы документа, и они могут быть перехвачены соответствующими обработчиками событий, располагаемыми в модуле формы документа. Часть событий относится к контексту объекта документа, и они moi ут быть перехвачены там. Заметьте, что при записи проведенного документа с перепроведением (см. рис. 2.306) и при записи документа, у которого запрещено проведение (см. рис. 2.30в), кроме самой записи в контексте формы и в контексте объекта вызывается также событие ОбработкаПроверкиЗаполнения, которое вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме. В обработчиках этого события в модуле формы или в модуле объекта разработчик может самостоя- тельно реализовать проверку заполнения данных формы. В обработчиках события ПередЗаписью посредством установки параметру Отказ значения Истина можно предотвратить последующий набор дейс- твий. То есть, например, если установлен отказ в записи документа на уровне
Глава 2. Документы и последовательности контекста формы документа, то последующие в показанной выше схеме события уже не произойдут, поскольку платформа прекращает выполнение данной последовательности действий. Действия «Провести и закрыть», «Провести» В случае записи документа, вызванной интерактивными действиями «Провести и закрыть» (если у документа не запрещено проведение), «Провести» или применением метода Записать (Новый Структу- ра ("РежимЗаписи", РежимЗаписиДокумента.Проведение), кроме самой записи инициируются следующие события (рис. 2.31). Рис. 2.31. Вызов событий при выполнении действий «Провести и закрыть», «Провести» То есть добавляется еще одно событие - ОбработкаПроведения. Процедура- обработчик этого события может находиться только в модуле объекта доку- мента, предназначена для указания действий, которые нужно выполнить при проведении документа, и также имеет параметр Отказ. Действия с ним аналогичны предыдущему случаю. То есть последующие события уже не выполняются, если параметру Отказ установлено значение Истина.
176 Реализация прикладных задач в системе «ЮПредприятие 8.2» Действие «Отмена проведения» В случае записи документа, вызванной системным действиями «Отмена проведения» или применением метода Записать (Новый Структура("Ре- жимЗаписи", РежимЗаписиДокумента.ОтменаПроведения), кроме самой записи инициируются следующие события (рис. 2.32). Удаление наборов записей движений документа Запись документа в базу данных Рис. 2.32. Вызов событий при выполнении действия «Отмена проведения» То есть в этом случае появляется еще событие ОбработкаУдаленияПроведения. роцедура-обработчик этого события также может располагаться только в модуле объекта документа, содержит указание действий, которые должны быть выполнены при отмене проведения, и имеет параметр Отказ. Приме- нение этого параметра аналогично разобранным выше случаям. В случаях, если запись документа производится не в форме, отличия состоят в том, что при выполнении этого действия не задействуются события, связанные с формой. Например, программная запись с проведением будет производиться следу- ющим образом (рис. 2.33).
Глава 2. Документы и последовательности 177. Модуль объекта сервер Рис. 2.33. Последовательность событий при программной записи объекта документа с проведением Проведение документов Ввод информации в документ в общем случае может осуществляться не за один раз. Кроме того, часть информации, необходимой для полной регистрации события в учетных механизмах, может становиться известной не сразу, а часть информации может быть получена в результате анализа и обработки исходной. Поэтому в системе есть возможность различать состо- яния документа - «введен» и «проведен». Для этого чаще всего разделяются операции ввода первичной информации (заполнение документа) и отражения данных документа в учете (обработка первичной информации и формиро- вание движений), рис. 2.34. Обработку информации для отражения в учете и формирование движений по регистрам обычно выполняют при проведении документа. Данный меха- низм удобен для выполнения подобных действий.
Реализация прикладных задач в системе «1С:Предприятие 8.2» 178 ____ Событие Отражение события в регистрах учета Рис. 2.34. Последовательность работы с документом Рассмотрим более подробно варианты проведения документов. Их использо- вание определяется значениями свойств документа как объекта конфигурации, а именно: Проведение, Оперативное проведение, Удаление движений, Запись движений при проведении. Свойство «Проведение» объекта конфигурации Свойство Проведение объекта конфигурации Документ может иметь значения Разрешить или Запретить. В первом случае поведение документа соответствует вышеописанному (разде- ление операций заполнения документа и отражения его данных в учетных механизмах). То есть именно для таких документов имеют смысл работа с полем Проведен и процесс «Проведение». Если же свойство объекта конфигурации Проведение имеет значение Запретить, это означает, что такой документ вообще не должен прово- диться. Такая ситуация может использоваться: Для документов, для которых нет необходимости в индикации того, что выполнены изменения в учетных механизмах, либо когда такие изменения документами не производятся. Для документов, которые используются для интерактивного ввода движений (например, документ Ручная операция). Поскольку в случае ручной операции нет разделения информации на исходную (инфор-
Глава 2. Документы и последовательности 179 мацию документа) и обработанную (информация, записываемая в регистр со ссылкой на документ), информация сразу же вводится в регистр (рис. 2.35). Рис. 2.35. Ручная операция Для документов, у которых запрещено проведение, системное поле Проведен при записи получает значение Ложь. Но во всех таблицах, отображающих данные динамических списков документов или журналов документов, пиктог- рамма документов, у которых запрещено проведение, похожа на пиктограмму проведенных документов. Таким образом, система подсказывает пользова- телю, что больше никакой обработки для данных документов не требуется (рис. 2.36). РучныеОперации ^Создать & XI Q, Найти... 91 Все действия - Рис. 2.36. Пиктограмма документа, для которого запрещено проведение Поведение форм, основным реквизитом которых является объект или список документа, учитывает значение свойства Проведение. Например, в коман- дной панели формы документа с запрещенным проведением система не создает кнопок с действиями «Провести» или «Отмена проведения». Однако система не запрещает попыток программной записи таких документов с проведением или с отменой проведения. Не запрещает, но все подобные попытки реализует по схеме обычной записи документа без проведения.
180 Реализация прикладных задач в системе «1С:Предприятие 8.2» Свойство «Оперативное проведение» объекта конфигурации Свойство Оперативное проведение объекта конфигурации Доку- мент может иметь значения Разрешить или Запретить. Для документов, у которых данное свойство имеет значение Разрешить, разрешено использо- вание механизма оперативного проведения. Поскольку посредством документов производится регистрация событий, причем на временной оси, то в общем случае положение проводимого доку- мента может быть отнесено к прошлому, настоящему или будущему. Как правило, документы, относимые к прошлому, регистрируют уже произо- шедшие события. Обычно такой способ регистрации называют «задним числом». В настоящем регистрируются события, которые только-только происходят. Такой способ регистрации называют «реальным временем». Кроме того, бывают ситуации, когда событие должно быть зарегистрировано в будущем. Например, при решении задач планирования (рис. 2.37). Общие случаи регистрации событий Прошлое Событие уже прииъашле Настоящее Событие совершается Будущее (обытие будет совершено Регистрация задним числом Регистрация реальным ременем Регистрация ь будущем Рис. 2.37. Общие случаи регистрации событий Оперативное проведение используется в ситуациях, когда есть необходимость отличать проведение в реальном режиме времени (оперативное) от другого и выполнять различные действия для одного и другого режимов. Вариант использования данного механизма может, например, включать разде- ление случаев (рис. 2.38): когда документ проводится в реальном времени и есть необходимость, например, проконтролировать остаток товаров на складе при проведении документа; когда проведение документа просто отражает уже свершившийся факт и нужно просто зафиксировать в учетных механизмах совершенное событие.
Глава 2. Документы и последовательности Регистрации событий с точки зрения механизма оперативного проведения Прошлое Настоящее Будущее Событие уже Событие Событие будет произошло совершается совершено _. . р Неоперативное Оперативное Неоперативное проведение проведение проведение Рис. 2.38. Оперативное и неоперативное проведение С точки зрения технологических средств механизм оперативного проведения включает в себя: Запрет проведения будущей датой. Использование механизма оперативной отметки времени для принудитель- ного изменения значения даты документа в случаях, когда это требуется. В ситуации, когда пользователи системы находятся в разных часовых поясах, в пределах одной информационной базы может существовать несколько последовательностей оперативных отметок времени, каждая - для своего часового пояса. Передачу в обработчик события ОбработкаПроведения параметру РежимПроведения значения Оперативный системного перечисления РежимПроведенияДокумента. В каких случаях можно намеренно не использовать механизм оперативного проведения? В любых, когда его использование не требуется логикой решаемой задачи. Например: когда нет нужды использовать разные алгоритмы проведения документов для оперативного или неоперативного режимов; когда не требуется при проведении документов обеспечивать их распо- ложение в определенном порядке на временной оси посредством выдачи оперативных отметок времени. При отказе от использования механизма оперативного проведения главное - не нарушить логику его использования для других документов. Напримгер, если для проведения документа Поступление товаров используется один и тот же алгоритм для любого вида проведения, это еще не означает, что можно установить запрет использования режима оперативного прове- дения. Его проведение будущей датой изменит данные оперативных итогов регистров именно будущей датой. То есть будет различие между актуальными
182 Реализация прикладных задач в системе «ЮПредприятие 8.2» итогами регистров и итогами на момент оперативном отметки времени. Это может привести к нарушению логики использования механизма опера- тивного проведения для документов Реализация товаров. Свойство «Удаление движений» объекта конфигурации Свойство Удаление движений объекта конфигурации Документ может иметь значения Удалять автоматически при отмене проведения (стандартное значение), Удалять автоматически или Не удалять авто- матически. В случае значения Удалять автоматически при отмене проведения для свойства Удаление движений движения, связанные с доку- ментом. удаляются автоматически только при удалении и отмене проведения документа. При проведении документа движения не удаляются, а перезаписываются. Т акое поведение является стандартным для платформы «1 С: Предприятие». Используя два других значения свойства Удаление движений, разработчик может реализовывать нестандартные сценарии проведения документа. В случае значения Удалять автоматически для свойства Удаление движений платформа сама автоматически удаляет старые записи движений, связанных с данным документом, в следующих сигуациях: при записи документа с проведением (старые записи удаляются, а новые формируются); при пометке документа на удаление (процесс, а не состояние); при отмене проведения документа (процесс, а не состояние); В случае же значения Не удалять автоматически для свойства Удаление движений автоматическое удаление движений для этих ситуаций произво- диться не будет. Например, ответственность за правильность оформления заказов покупа- телей лежит на отделе продаж. Однако заказы выборочно контролируются финансовым отделом. При обнаружении нарушений в назначении цен доку- мент снимается с проведения, что означает необходимость его дальнейшей доработки. Но движения по регистрам учета при этом удаляться не должны, чтобы не исключать данный заказ из учета вообще. Свойство «Запись движении при проведении» объекта конфигурации Свойство Запись движений при проведении объекта конфигурации Документ может иметь значения Записывать выбранные (стандартное значение) или Записывать модифицированные.
Глава 2. Документы и последовательности В случае значения Записывать выбранные разработчик должен в обра- ботчике проведения документа в явном виде указать, какие наборы движений документа следует записывать. Для этого нужно установить свойство набора записей Записывать в значение Истина. После выхода из обработки прове- дения те наборы записей, у которых свойство Записывать все еще имеет значение Истина, будут автоматически записаны платформой. При выполнении записи движений, например, при оперативном проведении документа методом Записать(), свойство Записывать у записанных наборов движений сбрасывается в значение Ложь. Такое поведение является стандартным для платформы «ЮПредприятие» и оптимизирует запись изме- ненных наборов записей без удаления движений в начале проведения. В случае значения Записывать модифицированные для свойства Запись движений при проведении после выхода из обработки проведения все модифицированные наборы записей будут автоматически записаны плат- формой. Свойства «Привилегированный режим при проведении», «Привилегированный режим при отмене проведения» объекта конфигурации Для ускорения работы с документом платформа стандартно устанавли- вает свойства документа Привилегированный режим при проведении и Привилегированный режим при отмене проведения. В результате проведение и отмена проведения документа выполняются на сервере, без контроля прав, максимально быстро. Использование механизма оперативного проведения Рассмотрим, как работает механизм при интерактивном проведении из формы документа. Пусть документу как объекту конфигурации разрешено опера- тивное проведение (свойство Оперативное проведение имеет значение Разрешить), и свойство ИспользоватьРежимПроведения расширения формы документа имеет значение Автоматически. При этом значении режим проведения документов из формы будет подбираться системой авто- матически, исходя из даты документа, позиции документа по отношению к оперативной отметке времени и других параметров. Запрет проведения будущей датой При проведении документа система прежде всего проверит положение даты документа относительно текущей даты сеанса. Текущая дата сеанса равна системной дате компьютера, приведенной к часовому поясу сеанса.
184 Реализация прикладных задач в системе «^Предприятие 8.2» В свою очередь, часовой пояс сеанса изначально равен часовому поясу информационной базы (если он установлен - УстановитьЧасовойПоясИн- формационнойБазыО) или часовому поясу сервера. Часовой пояс сеанса можно установить программно - УстановитьЧасовойПоясСеанса(). Если дата документа на день позже текущей даты сеанса, пользователь получит предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!». Проведение при этом не состоится. Если дата документа на день меньше текущей даты сеанса, документ будет проведен неоперативно. Если обе даты определяют один и тот же день, система принимает решение, что документ может быть проведен оперативно, то есть реальным временем. Механизм оперативной отметки времени Для того чтобы документы располагались последовательно и не попадали внутрь одной секунды (внутри одной секунды порядок следования не будет зависеть от разработчика), система выполняет автоматическое изменение времени документа. Дата документа получает значение оперативной отметки времени, которая рассчитывается системой по определенному алгоритму. Далее управление передается обработчику события ОбработкаПрове- дения, при этом параметр РежимПроведения получает значение РежимПро- веденияДокумента.Оперативный (рис. 2.39). Рис. 2.39. Использование оперативном отметки времени
Глава 2. Документы и последовательности Механизм оперативной отметки времени позволяет при параллельной работе пользователей записывать оперативно проводимые документы с возрастающей последовательностью значений свойства Дата. Дата опера- тивно проводимого документа получается равной текущей дате сеанса или на секунду больше предыдущей выданной оперативной отметки времени (рис. 2.40). Выдача оперативной отметки времени при оперативном проведении Рис. 2.40. Формирование оперативной отметки времени Если одновременно проводить оперативно несколько документов, то результат работы данного механизма можно представить следующим образом (рис. 2.41). Выдача оперативной отметки времени Рис. 2.41. Использование оперативной отметки времени
186 Реализация прикладных задач в системе «1С Предприятие 8.2» Как уже говорилось выше, в пределах одной информационной базы может существовать несколько последовательностей оперативных отметок времени. Если все пользователи работают в одном и том же часовом поясе, то тогда последовательность оперативных отметок времени будет одна-единственная Если же есть пользователи, работающие в других часовых поясах, тогда таких последовательностей будет несколько, каждая для своего часового пояса. Последняя выданная оперативная отметка времени для каждого часового пояса сеанса хранится до момента выхода из программы последнего пользо- вателя (включая и режим работы Конфигуратор). В клиент-серверном варианте работы системы эти отметки хранятся на сервере, в оперативной памяти Хранение и выдачу оперативных отметок времени на сервере поддержи- вает сервис времени. В файловом варианте работы системы такие отметки хранятся в специальной служебной таблице информационной базы. Получение оперативной отметки времени может выполняться не только автоматически, но и разработчиком посредством метода ПолучитьОпера- тивнуюОтметкуВремени() (листинг 2.6). Листинг 2.6. Получение оперативной отметки времени НоваяОперативнаяОтметкаВремени = ПолучитьОперативнуюОтметкуВремени(); Хотелось бы обратить внимание на ограничение формирования даты доку- мента при интерактивном проведении документа в пределах дня. Если в рамках одного дня уже выдана оперативная отметка времени со временем 23:59:59, то следующий оперативно проводимый документ того же дня выдаст пользователю сообщение о невозможности провести данный документ опера- тивно (в рамках того же дня) - «Дата документа не соответствует текущей дате или дате последнего оперативно проведенного документа Документ не может быть проведен оперативно!», и проведение документа не состоится (рис. 2.42). Выдача оперативной отметки времени Рис. 2.42. Получение оперативной отметки ^оемени следующим днем
Глава 2. Документы и последовательности ] 87 Сделано это потому, что дата документа может иметь юридическое значение. Поэтому в такой ситуации у пользователя есть два варианта: изменить дату документа следующим днем и провести документ оперативно или же иметь возможность провести документ неоперативно. Однако для того, чтобы пользователь мог выбирать режим проведения, свойство Исполь- зоватьРежимПроведения расширения формы документа должно быть установлено в значение Запрашивать, и у пользователя должно быть право на неоперативное проведение. Если же свойство ИспользоватьРе- жимПроведения имеет значение Автоматически или Оперативный, то платформа будет пытаться выполнить оперативное проведение документа, что приведет к сообщению об ошибке. Подробно о режимах проведения доку- мента из формы рассказывается в разделе «Установка режима проведения» на стр. 198. Налицо определенное ограничение, накладываемое системой. Однако в практике ввода документов реальным временем столкнуться с ним почти невозможно. Для воспроизведения такой ситуации требуется, чтобы, например, 61 одновременно работающий пользователь в течение последней минуты уходящего дня начал проведение оперативно проводимых доку- ментов. Если же все же подобная ситуации при автоматизации некоего предприятия с ночным режимом работы имеет место, 61-й и последующие документы, скорее всего, можно уже датировать следующим днем либо обеспечить их возможность проведения в неоперативном режиме. Ведь невозможность опера- тивного проведения еще не означает невозможность проведения вообще. Кроме того, запись документов с проведением может еще вызываться и программно. В таком случае можно указать режим проведения в параметре РежимПрове- дения (листинг 2.7). Листинг 2.7. Указание режима программного проведения документа Записать(РежимЗаписиДокумента.Проведение РежимПроведенияДо;:умента.Оперативный); № v»-.: . >л>»,.. Тогда поведение системы в отношении установки даты документа и передачи параметра обработчику события ОбработкаПроведения будет соот- ветствовать оперативному проведению. Однако необходимо помнить, что дата документа при этом должна соот- ветствовать дню текущей даты сеанса. Иначе обработка проведения пойдет по схеме неоперативного проведения.
188 Реализация прикладных задач в системе «1С:Предприятие 8.2» Проблемы выдачи оперативной отметки времени после 23:59:59 при программной записи документов с оперативным проведением нет. Поскольку программное проведение означает вмешательство неких алгоритмов в ход формирования, заполнения и записи документов, то в данном случае может оказаться, что некому реагировать на предупреждение о невозможности оперативного проведения в рамках того же дня. Поэтому система для подоб- ного документа просто сформирует дату на секунду больше последней оперативной отметки времени. Если потребуется не допустить формиро- вания и проведения документов с датой будущего дня, это можно обеспечить программно, в составе соответствующих обработчиков Передача значения «Оперативный» в параметр «РежимПроведения» обработчика события «ОбработкаПроведения» Итак, при оперативном проведении документов система позволяет добиться расстановки документов в идеальной хронологической последователь- ности (каждое событие зарегистрировано на момент его отражения в учете) и, кроме того, известить об этом обработчик проведения. То есть с точки зрения отражения документа в учете сам механизм оперативного проведения не выполняет никаких действий, он только передает параметр в обработчик проведения. Что это дает разработчику? Дает возможность отличать ситуации проведения документов реальным временем от иных ситуации. А это уже впоследствии может быть использовано для решения прикладных задач. Может использоваться следующая градация действий при проведении доку- ментов: при оперативном проведении — помощь пользователю посредством конт- роля возможности операции и правильности ее оформления, после этого - отражение ее в учетных механизмах; при неоперативном проведении - отражение в учетных механизмах факта свершившегося события без всякой обработки. То есть, например, при проведении документа РеализацияТоваров алгоритм обработки оперативного проведения будет контролировать остатки товаров, перечисленных в табличной части документа, на складе, указанном в доку- менте. Для этого в процедуре обработки проведения после записи движений документа будут получены актуальные остатки расходуемых товаров из регистра накопления ТоварыНаСкладах. В случае отрицательных остатков какого-либо товара на складе (а значит, невозможности отгрузки) пользова- тель будет получать соответствующее сообщение, и документ проводиться не будет.
Глава 2. Документы и последовательности 189 Если пользователь проводит документ, соответствующий уже произошедшему событию (неоперативно), нужда в контроле остатка отпадает. Например, вчера отключилось электричество, и не успели отразить в программе операцию отгрузки двух холодильников со склада. Вводя сегодня данные о событии вчерашней отгрузки, контролировать возможность данной операции уже бессмысленно, поскольку холодильники уже отгружены (листинг 2.8). ПРИМЕЧАНИЕ Пример алгоритма проведения документа РеализацияТоваров содержится в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. Листинг 2.8. Пример процедуры «ОбработкаПроведения» Процедура ОбработкаПроведения(Отказ, РежимПроведения) II Укажем, по каким регистрам нужно записывать движения Движения.ТоварыНаСкладах.Записывать = Истина; Движения.Продажи.Записывать = Истина; II Создать менеджер временных таблиц МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; $ 1 ‘ II Укажем, какой менеджер временных таблиц использует этот запрос Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = »г ВЫБРАТЬ РеализацияТоваровСостав.Номенклатура, РеализацияТоваровСостав.Номенклатура.Услуга КАК Услуга. СУММА(РеализацияТоваровСостав.Количество)КАККоличествоВДокументе, СУММА(РеализацияТоваровСостав.Сумма) КАК СуммаВДокументе ПОМЕСТИТЬ НоменклатураДокумента ИЗ Документ.РеализацияТоваров.Состав КАК РеализацияТоваровСостав РеализацияТоваровСостав.Ссылка = &Ссылка СГРУППИРОВАТЬ по РеализацияТоваровСостав.Номенклатура, РеализацияТоваровСостав.Номенклатура.Услуга"; Заире с.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Залрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ; Запрос2.Текст = "ВЫБРАТЬ НоменклатураДокумента.Номенклатура, НоменклатураДокумента.Услуга, НоменклатураДокумента.КоличествоВДокументе, Ц....si..-'.''E8
190 Реализация прикладных задач в системе «^Предприятие 8.2» ЕСТЬНЦЩНоменклатураДокумента.СуммаВДокументе 0) КАК СуммаВДокументе ИЗ НоменклатураДокумента КАК НоменклатураДокумента"; Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда И Установим необходимость блокировки данных в регистре ТоварыНаСкладах Движения.ТоварыНайклацах.БлокироватьДляИзменения = Истина; II Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе Движения.ТоварыНаСкладах.Записать(); КонецЕсли; Результат = Запрос2Выполнить(); ВыборкаДетальныеЗаписи = Резупьтат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если НЕ ВыборкаДетальныеЗаписи.Услуга Тогда II Сформировать движения по регистру ТоварыНаСкладах (расход) Движение = Движения.ТоварыНаСкладах ДобавитьО, Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение. Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = Склад; Движение.Копичество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; КонецЕсли; II Сформировать движения по регистру Продажи Движение = Дви).<ения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Контрагент = Контрагент; Движение.Количество = ВыборкаДетальныеЗаписиКоличествоВДокументе; Движение. Сумма = ВыборкаДетальныеЗаписи.СуммаВДокументе; Движение.ВидОперации = ВидОперации; КонецЦикла, Движения. За п исать(); Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда II Проверить отрицательные остатки ЗапросЗ = Новый Запрос, ЗапросЗ. МенеджерВременныхТаблиц = МенеджерВТ; ЗапросЗ.Текст = "ВЫБРАТЬ 1оварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахСстатки.КоличествоОстаток ИЗ Регист рНакоплечия. ТоварыНаСкладах.Остатки( Номенклатура В (ВЫБРАТЬ НоменклатураДокумента.Номенклатура ИЗ НоменклатураДокумента) И Склад = 8 Склад) КАК ТоварыНаСкладахОстатки ГДЕ ТоварыНаСкладахСстатки.КоличесгвоОстаток < О"; ЗапросЗ .УстановитьПаоаметр(,1С’'ладп, Склад);
Глава 2. Документы и последовательности 191 nUM^'ЫС-Пвваимм. I и ля»«йк -/aBrcw ., пно,-.и РезультатСНехваткой = Запроса. Выполнить(); 'Л-;:'' / ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать(); Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не хватает" + Строка(« ВыборкаРезультатаСНехваткой .КоличествоОстаток) +" единиц товара""" + ВыборкаРезультатаСНехваткой .Номенклатура +""" на складе+ Склад + Сообщение.Сообщить(); Отказ = Истина; & КонецЕсли; 1 КонецПроцедуры Рассмотрим подробно последовательность действий в процедуре Обработ- каПроведения. Сначала в обработчике указываются наборы записей, содержащие движения документа по регистрам, которые должны быть записаны при проведении документа. Для этого нужным наборам записей устанавливается свойство Записывать в значение Истина (например, Движения.ТоварыНа- Складах. Записывать = Истина). Затем данные табличной части документа РеализацияТоваров помещаются во временную таблицу. Эти данные посредством менеджера временных таблиц будут затем использованы в запросе для формирования движений документа и в запросе к регистру накопления для контроля остатков товаров на складах. Заметьте, что данные табличной части документа группируются по полям Номенклатура и Услуга, чтобы суммировать поля Количество и Сумма при наличии в документе нескольких строк с одинаковой номенклатурой. Затем в случае оперативного проведения документа (РежимПроведения = РежимПрове дения Документа. Оперативный) данные регистра Това- рыНаСкладах блокируются путем установки свойства БлокироватьДляИз- менения в значение Истина. Это делается для того, чтобы заблокировать остатки от чтения другими транзакциями до тех пор, пока не будет завершена текущая транзакция. А также движения данного документа в регистре очи- щаются путем записи пустого набора данных (Движения.ТоварыНаСкла- дах.Записать()). Это обеспечивает чтение остатков без учета существу- ющих движений документа (в случае его перепроведения). Далее выполняется запрос к временной таблице, содержащей перечень расходуемых товаров, и в цикле выборки результата запроса формируются движения по нужным регистрам. Затем движения документа в регистрах
192 Реализация прикладных задач в системе «ЮПредприятие 8.2» записываются в явном виде (Движения.Записать()). Метод Записать() выполняет запись всех наборов движений, у которых свойство Записывать установлено в значение Истина. И, наконец, при оперативном проведении выполняется контроль доста- точности остатка товаров на складе. Для этого после записи движений выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице, и на складе, указанном в документе. После этого выборка записей запроса обходится в цикле, и, если есть такие записи, сообщение о них выводится пользователю. В результате документ не проводится, т. к. параметру Отказ присваивается значение Истина. Если каждый документ, формирующий движения в количественном учете, будет проводиться с поддержкой механизма операгивного проведения и движения его будут датироваться именно датой документа, то можно быть уверенным в двух фактах: Не будет ситуации, когда два документа претендуют на одно и то же время (механизм выдачи оперативной отметки времени распределит их с интер- валом в секунду). Текущий проводимый документ находится на временной оси всегда позже последнего оперативно проведенного документа. А это важно при получении остатков из регистров. Так как кроме движений и помесячных остатков таблицы регистров хранят еще подсчитанные итоги, актуальные на момент времени последней записи в них. И если мы уверены, что «за» оперативной отметкой времени не было движении, то тогда для полу- чения актуальных данных контроля остатка можно использовать виртуальную таблицу остатков регистра без указания параметра Период (или с указанием значения Неопределенен в качестве его значения). Данная операция будет выполняться быстрее, если в качестве параметра передать значение момента времени документа. Потому что при отсутс- твии параметра система не будет пытаться обращаться к таблице записей регистра для «досчета» остатков до нужной временно! точки, а сразу возьмет данные последних актуальных итогов из таблицы итогов данного регистра (рис. 2.43). Но нужно понимать, что для корректности использования механизма опера- тивного проведения при данном алгоритме работы необходимо сделать так, чтобы никакими способами не были сформированы движения в будущем. Иначе использование актуальных итогов регистров в обработке прове- дения будет невозможно (вернее придется рассчитывать регистры на момент времени документа, но тогда какой смысл в оперативной работе, если при этом итоги регистров не будут актуальны на момент оперативно проводимого документа).
Глава 2. Документы и последовательности 193 Рис. 2.43. Получение итогов регистра В основном это обеспечивается системой: стандартные команды форм не позволяют пользователю оперативно проводить документы будущей датой и не предлагают в таких случаях проводить документы неоперативно. Кроме того, система при выполнении попытки программной записи с проведением в оперативном режиме (листинг 2.9) сначала выполняет проверку положения даты документа относительно дня оперативной отметки времени. Листинг 2.9. Оперативное программное проведение документа У г . . . ой йв® Запис?ть(РежимЗаписиДокумента.Проврдение, РежимПроведенияДокумент? Оперативный); г . • ,• II 1 •• • • рг ' л ««*'*• • ' И если документ пытаются записать в будущем, выдается соответствующее предупреждение о невозможности выполнения данной операции. Но вот программное неоперативное проведение документов система не запре- щает. Кроме того, при формировании движений можно добиться ситуации, чтобы Период движения не совпадал со значением Дата документа. То есть в принципе движения могут быть сформированы будущей датой. Ответствен- ность за недопущение подобных фактов - на разработчике. В завершение хотелось бы отметить, что использование механизма оператив- ного проведения может быть составной частью более сложных алгоритмов. Например, для того, чтобы во время активного ввода информации сократить количество действий по отражению документов в учете (а значит, обеспе- чить большую скорость проведения документов), часть этих действий не выполняется при неоперативном проведении, а часть относится на действия, выполняемые регламентными обработками.
194 Реализация прикладных задач в системе «1С:Предприятие 8.2» Стратегия отражения документов в учетных механизмах выглядит тогда следующим образом: при оперативном проведении - помощь пользователю посредством конт- роля возможности операции и правильности ее оформления, отражение совершаемого события только в механизмах, обеспечивающих конт- рольные функции при оперативном проведении других документов; при неоперативном проведении - отражение факта свершившегося события без всякой обработки и только в учетных механизмах; при проведении специальной регламентной обработкой - отдельно для каждого зарегистрированного события контроль возможности и правиль- ности его оформления, огражение данного события во всех оставшихся учетных механизмах. Примером подобного использования механизма оперативного проведения можно считать задачу проведения документа, отражающего реализацию товаров со склада не только в количественном, но и в количественно-стои- мостном учете. Постановка задачи может быть следующей: при реализации товаров со склада реальным временем (оперативное проведение) необхо- димо предварительно выполнить ряд проверок правомерности этой операции (наличие достаточного остатка на складе, контроль предоплаты со стороны покупателя). Эти проверки и сама регистрация факта отгрузки в количес- твенном учете товаров на складе выполняются в обработке проведения документа. Если же требуется проведение документа реализации задним числом (неоперативное проведение), это означает необходимость отражения уже свершившегося факта. Тогда не требуется проверять предоплату и наличие товаров на складе, поскольку товар уже отгружен клиенту. Нужно просто отразить факт отгрузки в количественном учете товаров на складе при прове- дении документа. Окончательное же отражение произошедших событий в механизме количес- твенно-стоимостного учета товаров на складе производится посредством отдельной регламентной обработки, которая будет выполняться не в период активного ввода первичной информации, а впоследствии. При ее выпол- нении будут собраны все необходимые данные для всех еше не полностью отраженных событий, проведены все необходимые проверки и расчеты, и приписаны необходимые движения к документам реализации Пери- одичность выполнения этой обработки определяется пользователем Например, чтобы быть достаточной для получения регламентной отчетности (рис. 2.44).
Глава 2. Документы и последовательности 195, Проведение документа "РеализацияТоваров" Активный ввсд информации пользователями Нет Нет активной работы пользователей Проведение регламентной обработки документов Регламентное форм фование движении Проведение всего комплекса проверок и расчетов - - - ................... I . Оформление реализации в количественно-стоимостном учете Рис. 2.44. Проведение документа «Реализация товаров» В случаях отказа от использования оперативного проведения разработ- чику достаточно лишь установить свойству Оперативное проведение документа как объекта конфигурации значение Запретить. И тогда все необходимые элементы работы механизма проведения придется реали- зовывать самостоятельно. То есть, например, при проведении документа предварительно проводить контроль даты документа, контроль возможности проведения документа и т. д. Особенности работы формы документа Если основной реквизит формы имеет тип значения ДокументОбъ- ект.<имя>, то для данной формы действует расширение формы документа. Посредством него решаются вопросы специфичной функциональности формы документа. Расширение помогает обрабатывать различные команды пользователя, выполнять предварительные проверки и другие сервисные действия. Кроме того, действие расширения формы документа распространяется и на механизмы записи и проведения документа. При этом не важно, была вызвана запись документа интерактивными действиями пользователя в форме доку- мента или средствами языка методом Записать(). Рассмотрим ряд примеров работы этих механизмов.
196 Реализация прикладных задач в системе «ЮПредприятие 8.2» Установка даты документа при открытии формы Если дата документа изначально не установлена, то при открытии формы нового документа происходит установка дате документа значения текущей даты сеанса. Причем время документа будет установлено в зависимости от следующих настроек, Если свойство АвтоВремя расширения формы документа имеет значение НеИспользовать, то время документа будет установлено по значению текущей даты сеанса. В остальных случаях дате документа присва- ивается время начала дня (00:00:00), рис. 2.45. Установка даты нового документа при открытии формы документа Рис. 2.45. Установка даты нового документа при открытии формы документа Установка даты нового документа при записи нового документа в форме При записи документа в режиме оперативного проведения значение даты документа устанавливается согласно выданной оперативной отметке времени. Гут настройки свойств расширения формы не играют роли. Но если время документа «нулевое» (0:00:00), то при неоперативном проведении документа оно будет изменено согласно настройкам свойства АвтоВремя (рис. 2.46). Исключение - когда АвтоВремя имеет значение НеИспользовать. Тогда время документа не меняется.
Глава 2. Документы и последовательности 197 Установка даты нового Рис. 2.46. Установка даты нового документа при записи документа в форме Запрет интерактивной записи проведенного документа без проведения (перепроведения) Запрет интерактивной записи документа без проведения (перепроведения) используется, чтобы не создавалась, например, такая ситуация: сначала доку- мент реализации был заполнен и проведен, при проведении сформированы движения по регистру с указанием количества, соответствующего коли- честву в документе. После этого пользователь исправил данные документа и сохранил без проведения (рис. 2.47). Доцент "РеализацияТоваров": Товар: Яблоки Количество: 10 Документ "РеализацияТоваров": Товар: Яблоки Количество: 100000 Движения по регистру “Т оварыНаСк ладах”: Движения регистра ”Т оварыНаСк ладах": Вид движения: Расход Товар: Яблоки Количество: 10 Вид движения: Расход Товар: Яблоки Количество: 10 1. Заполнение документа, запись с проведением, формирование движений по регистру 2. Внесение исправлений в документ, запись без проведения документа Рис. 2.47. Данные документа «РеализацияТоваров» и движения документа в регистре «ТоварыНаСкладах»
198 Реализация прикладных задач в системе «ЮПредприятие 8.2» В результате таких манипуляций в документе будут записаны новые данные, а в движениях по регистру останутся данные от прошлого проведения документа, то есть они никак не будут соответствовать текущим данным документа. Предотвращение подобных ситуаций достигается за счет установки свойства расширения формы документа ПриЗаписиПерепроводить в значение Истина. Тогда отказ в обработке проведения приведет к откату транзакции документ не будет и перезаписан. Установка режима проведения При проведении документа из формы система проверяет наличие у поль- зователя соответствующих прав (Проведение, Интерактивное проведение, Интерактивное проведение неоперативное). Если их нет, то выдается сообщение о невозможности проведения документа, и запись с проведением документа из формы отменяется. Мы будем рассматривать только возможность отсутс- твия/наличия прав на неоперативное проведение, в зависимости от которого система может менять свое поведение, так как если нет первых двух прав, то документ не может быть проведен из формы в принципе. Если интерактивное проведение разрешено, сам выбор варианта проведения должен быть обусловлен логикой применения механизма установки режима проведения из формы. То есть в некоторых ситуациях система должна выби- рать режим жестко, в некоторых право выбора режима можно предоставить пользователю. Для этого разработчик обладает рядом возможностей, предо- ставляемых системой посредством разграничения прав и расширениями формы документа При записи документа из формы расширение формы документа выполняет установку режима проведения документа. Для реализации данного функционала система использует вариант (Авто- матически, Оперативный, Неоперативный, Запрашивать), указанный в качестве значения свойства ИспользоватьРежимПроведения расши- рения формы документа. Вариант «Автоматически» Вариант Автоматически устанавливается посредством выбора значения Автоматически у свойства ИспользоватьРежимПроведения расши- рения формы документа. Платформа стандартно устанавливает это значение для новой формы. При использовании данного варианта, в зависимости от ситуации и настроек, происходит первичный подбор режима проведения из вариантов Опера- тивный или Неоперативный.
Глава 2. Документы и последовательности 199 Для проводимого документа происходит проверка положения даты документа относительно текущей даты сеанса. Если дата документа (без учета времени) равна текущей дате сеанса, то система автоматически выбирает вариант проведения Оперативный. Если дата документа (без учета времени) больше текущей даты сеанса, пользователю выдается предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется. Если дата документа (без учета времени) меньше текущей даты сеанса, выби- рается вариант проведения Неоперативный. При этом если у пользователя нет права на неоперативное проведение, выдается предупреждение: «Недо- статочно прав для неоперативного проведения», и проведение документа отменяется (рис. 2.48). Рис. 2.48. Использование режима проведения «Автоматически» Вариант «Оперативный» Вариант Оперативный устанавливается посредством выбора значения Оперативный у свойства ИспользоватьРежимПроведения расширения формы документа.
200 Реализация прикладных задач в системе «Ю.Предприятие 8.2» В данном варианте, если дата документа (без учета времени) меньше текущей даты сеанса, выдается предупреждение: «Дата оперативно проводимого доку- мента меньше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется. Если дата документа (без учета времени) равна текущей дате сеанса, произво- дится запись документа с оперативным проведением. Если дата документа (без учета времени) больше текущей даты сеанса, выда- ется предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется (рис. 2.49). Рис. 2.49. Использование режима проведения «Оперативный» Вариант «Неоперативный» Вариант Неоперативный устанавливается посредством выбора значения Неоперативный у свойства ИспользоватьРежимПроведения расши- рения формы документа. При использовании данного варианта проведение документа из формы всегда производится в неоперативном режиме, независимо от положения даты доку- мента по отношению к текущей дате сеанса.
Глава 2. Документы и последовательности При этом если у пользователя нет права на неоперативное проведение, выда- ется предупреждение: «Недостаточно прав для неоперативного проведения», и проведение документа отменяется (рис. 2.50). Рис. 2.50. Использование режима проведения «Неоперативный» Вариант «Запрашивать» Вариант Запрашивать устанавливается посредством выбора значения Запрашивать у свойства ИспользоватьРежимПроведения расширения формы документа. Данный вариант реализован в системе для того, чтобы помочь пользователю принять решение о выборе режима проведения для каждой конкретной ситу- ации. В данном варианте пользователь перед началом проведения должен будет выбрать режим проведения документа в специальном системном окне (рис. 2.51). Рис. 2.51. Выбор режима проведения Поведение системы при этом варианте определяется прежде всего положе- нием даты документа (без времени) по отношению к текущей дате сеанса.
202 Реализация прикладных задач в системе «1С:Предприятие 8.2» При равенстве этих дат далее проверяется, имеет ли пользователь право проводить документ неоперативно. Если пользователь такого права не имеет, система проводит данный документ в оперативном режиме. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора режима проведения система проводит документ соответственно в оперативном или неоперативном режиме (рис. 2.52). Рис. 2.52. Использование режима проведения «Запрашивать» при условии равенства даты документа и текущей даты сеанса Если дата документа (без учета времени) меньше текущей даты сеанса, пове- дение системы определяется опять же наличием права на неоперативное проведение у пользователя. Если пользователь таким правом не обла- дает, выдается предупреждение: «Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!», и прове- дение документа отменяется. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора неоперативного режима проведения система проводит документ в неоперативном режиме. Если же пользователь выберет оперативный режим проведения, выдается предупреж
Глава 2. Документы и последовательности 203 дение: «Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется (рис. 2.53). Рис. 2.53. Использование режима проведения «Запрашивать» при условии, что дата документа меньше текущей даты сеанса Если дата документа (без учета времени) больше текущей даты сеанса, система не позволяет проводить документ оперативно. Поэтому если права неоперативного проведения нет, сразу выдается предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора неоперативного режима проведения система проводит документ в неоперативном режиме. Если же пользователь выберет оперативный режим проведения, будет выдано предуп- реждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменится (рис. 2.54).
204 । Реализация прикладных задач в системе «ЮПредприятие 8.2» Рис. 2.54. Использование режима проведения «Запрашивать» при условии, что дата документа больше текущей даты сеанса Прочие функции Кроме выбора режима проведения и установки даты документа, расширение формы документа реализует также следующий функционал: при открытии формы проведенного документа, если у пользователя нет права Интерактивное изменение данных, форма переводится в режим ТолькоПросмотр; при открытии формы документа, в которой находятся таблицы, отража- ющие движения основного реквизита (объекта документа), эти движения автоматически считываются из базы данных и отображаются; при записи из формы (даже если и программной - посредством Запи- сать ()) система выполняет проверку прав на интерактивное проведение или интерактивную отмену проведения. Ввод на основании Ввод на основании является одним из вариантов реализации заполнения нового объекта данными другого объекта. Чаще всего это действие приме- няется для документов, но может использоваться для ряда других объектов
Глава 2. Документы и последовательности (Справочники, Планы видов характеристик, Планы счетов, Планы расчетов, Планы обменов, Бизнес-процессы, Задачи). Причем в общем случае вводится любой объект на основании любого. Механизм работы ввода на основании включает в себя формирование нового объекта и вызов обработчика события ОбработкаЗаполнения создавае- мого объекта. Например, необходимо реализовать заполнение документа, реализующего отгрузку товаров, на основании объекта, содержащего информацию о том, что именно нужно отгрузить. Исходным объектом, применяемым в конкретном случае, может быть, например, документ ЗаказПокупателя или элемент спра- вочника ДоговорыКонтрагентов (рис. 2.55). Договор 14 112/09 Заказ покупателя N 389 Владелец: ООО "Мистраль" Вид договора: Купли-продажи Дата пос та в ки: 12.02.2010 Табличная часть "Спецификация" Г енератор МХО123 3 Пульт ЕхТУб 1 Станция А6 1 Контрагент: ООО "Мистраль" Договор: 112/09 Размещение: Резерв Табличная часть "Товары" Г енератор МХО123 3 Пульт ЕхТУб 1 Реализация товаров Ввод на с сновании Ввод на с сновании Контрагент: ООО "Мистраль" Договор: 112/09 Склад: Дата поста в ки: 12.02.2010 Табличная часть "Товары” Г енератор МХО123 3 Пульт ЕхТУб 1 Рис. 2.55. Пример использования ввода на основании Ввод на основании может быть организован за счет интерфейсных средств или программно.
206 Реализация прикладных задач в системе «1С Предприятие 8.2» Интерактивный ввод на основании Интерфейсные возможности реализуются за счет соответствующих расши- рений форм и элементов форм. Кроме того, необходимо, чтобы в свойствах объекта конфигурации было указано, на основании каких объектов он может вводиться (рис. 2.56). Рис. 2.56. Указание объектов, являющихся основанием для ввода В результате: Разработчику будет доступен вызов конструктора ввода на основании для документа РеализацияТоваров. В автозаполняемых командных панелях форм, у которых основным рекви- зитом является объект документа ЗаказПокупателя и объект элемента справочника Договоры, а также в командных панелях форм списков данных объектов появляется новое подменю СоздатьНаОсновании (рис. 2 57) с действием РеализацияТоваров. Если же данное подменю уже было, то к нему просто добавится указанное действие. Заказы покупателей Создать на основании Все действия - ? _ - г-~. Размещение * -•«4— Резерв _________! Не ii аз!4ешен _________________d ----1------ Jx Номе[ Контраге! 15.04 2010 22 34:11 000000001 Компания "Рион. г' Дата Uu-U. - Реализация товаров 123/14К 1Л 05.05.2010 21:05:28 OOOOOOUOi Радонеж ООО Рис. 2 57. Кнопка «Ввести на основании»
Глава 2. Документы и последовательности 207 Посредством конструктора ввода на основании (или без его использования) в составе модуля объекта документа РеализацияТоваров может быть реализо- вана процедура - обработчик события ОбработкаЗаполнения. Поскольку параметром ДанныеЗаполнения данной процедуры система пере- дает ссылку на объект источник, то у разработчика появляется возможность заполнить данные документа информацией объекта-источника. Для нашего примера ее текст может быть таким (листинг 2.10). Листинг 2.10. Пример процедуры «ОбработкаЗаполнения» mmsiABii дйийййда Ms <№№s m , «м® авинкв&ъв&ммтшвл ч л чини Процедура ОбработкаЗапслнения(ДанныеЗаполнения,СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателян) Тогда ЧУ>'''':МВ8аМ^-' II Заполнение шапки Договор = ДанныеЗаполнения.Договор; Контрагент = ДанныеЗаполнения.Контрагент; ОснованиеРеализации = ДанныеЗаполнения.Ссылка; II Заполнить табличную часть данными табличной части основания Для Каждого ТекСтрокаСостав Из ДанныеЗаполнения.Состав Цикл НоваяСтрока = СоставДобавить(); НоваяСтрока.Количество = ТекСтрокаСостэв.Количество’ НоваяСтрока.Номенклатура = ТекСтрокьСостав.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСостав Сумма; НоваяСтрока.Цена = ТекСтрокаСостав.Цена; КонецЦикпа; ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда // Заполнение шапки Контрагент = ДанныеЗаполнения.Владелец; ДатаПоставки = ДанныеЗаполнения.ДатаПоставки; Договор = ДанныеЗаполнения.Ссылка, ОснованиеРеализации = ДанныеЗаполнения.Ссылка; II Заполнить табличную часть данными табличной части основания Для Каждого ТекСтрокаСпецификация Из ДанныеЗаполнения.Спецификация Цикл НоваяСтрока = Состав.Добавить(); НоваяСтрока.Количество = ТекСтрокаСпецификация.Количество* НоваяСтрока.Цена = ТекСтрокаСпецификация.Цена; НоваяСтрока.Номенклатура = ТекСтрокаСпецификац! ?я. Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСпецификация.Сумма; КонецЦикпа; КонецЕсли; КонецПроцедуры ПРИМЕЧАНИЕ Данный пример приведен в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске.
Реализация прикладных задач в системе «ЮПредприятие 8.2» В результате, если пользователь в соответствующей форме выберет из под- меню СоздатьНаОсновании действие РеализацияТоваров, произойдет создание нового документа и вызов обработчика события ОбрботкаЗапол- нения. То есть произойдут следующие события (рис. 2.58). Клиент Сервер Рис. 2.58. Последовательность событий при интерактивном вводе на основании Кроме того, произойдет заполнение значения параметра Основание расши- рения формы документа. Ему также будет присвоено значение ссылки на объект-ис гоч ни к. Это свойство можно активно использовать в обработчиках событий формы. Например, требуется запретить интерактивный ввод документа Реализа- цияТоваров на основании документа ЗаказПокупателя, если у последнего не заполнен контрагент. Для реализации этой задачи достаточно написать процедуру обработ- чика создания формы документа РеализацияТоваров, например, следующим образом (листинг 2.11). Листинг 2.11. Пример процедуры «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если ТипЗнч(Параметры.Основание) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда Если Параметры.Основание.Контрагент.ПустаяО Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не заполнено поле ’Контрагент’!”; Сообщение Сообщить(); Отказ = Истина*, КонецЕсли* КонецЕсли; КонецПроцедуры
Глава 2. Документы и последовательности 209 В случае выполнения условий, то есть если объектом-источником будет документ ЗаказПокупателя с невыбранным контрагентом, произойдет выдача сообщения пользователю и отказ от создания формы нового документа, вводимого на основании. Программный ввод на основании Программный способ заполнения документа данными из других объектов реализуется посредством метода Заполнить (). Например, если в переменной СсылкаНаИсходныйОбъект содержится ссылка на некий заказ покупателя или на некий договор контрагента, то программное создание документа РеализацияТоваров с заполнением данных из исход- ного объекта и последующая его запись могут быть выполнены следующим образом (листинг 2.12). Листинг 2.12. Пример создания нового документа на основании НовыйДокумент = Документы.РеализацияТоваров.СоздатьДокумент(); НовыйДокументДата = ТекущаяДата(); НовыйДокумент.Заполнить(СсылкаНаИсходныйОбъект); НовыйДокумент.Записать(); ! , ЛИ п,- №- ’.Ж» ИМНЧП Сервер Сначала новый документ будет создан в оперативной памяти, заполнено свойство Дата текущим временем, далее посредством JiS метода Заполнить () управление будет передано обработчику события ОбработкаЗаполнения. Обработка заполнения Огрел ЗЭПИСЬЮ При угтаноеке HOFOfb номера Обратите внимание: в результате применения программного запол- нения документов контекст формы не задействуется (рис. 2.59). После заполнения документ записывается. Событие ПриУстанов- кеНовогоНомера произойдет в транзакции записи, только если для документа используется автонумерация. Причем в соответс- твии с установкой параметров метода Записать () по умолчанию в данном примере документ будет записан без проведения. Следует заметить, что событие ОбработкаЗаполнения есть не только у объектных данных (документов, справочников и т. п.), но и у регистра сведений, и оно располагается в модуле объекта РегистрСведенийНаборЗаписей.<имя>. .. При Рис. 2.59. Последовательность событий при программном вводе на основании
210 Реализация прикладных задач в системе «1С:Предприятие 8.2» Получение документов, введенных на основании Кроме того, при решении прикладных задач иногда возникает необходимость получения всех документов, связанных с неким исходным объектом. Например, в рамках некоего договора был оформлен ЗаказПокупателя, на осно- вании документа ЗаказПокупателя был введен документ РеализацияТоваров, на основании РеализацииТоваров были введены СчетФактура и Приход- ныйКассовыйОрдер. Впоследствии часть товара была возвращена, то есть на основании РеализацииТоваров был введен ВозвратТоваровОтПокупателя. Кроме того, аналогичная цепочка документов может быть оформлена в отно- шении другого ЗаказаПокупателя (рис. 2.60). Рис. 2.60. Цепочка документов, введенных на основании Поскольку все события происходили в рамках договорных отношений одного договора, пользователю может оказаться необходимо увидеть все документы, касающиеся этого договора, в одном списке. Для реализации этого в состав всех объектов, которые нужно отобрать по данному договору, можно включить реквизит, ссылающийся на данный договор. Пусть он называется Договор. Далее для реализации отбора подчиненных договору документов можно использовать запросы или, например, критерии отбора. КритерийОтбора - объект конфигурации, представляющий собой одну из составляющих механизма отборов информации. Критерии отбора позволяю^ разработчику реализовать предопределенные правила отборов информации за счет создания дополнительных индексов в таблицах объектов в базе данных.
Глава 2. Документы и последовательности Для вышеприведенного примера можно создать новый критерий отбора Доку- менты ПоДоговору. Тип критерия отбора указывается в соответствии с типом данных, по которым будут отбираться объекты. То есть в данном примере - СправочникСсыл- ка. ДоговорыКонтрагентов, но в общем случае может быть и составным. В составе критерия отбора указываются реквизиты объектов, по которым нужно будет производить отбор. В данном случае это реквизит Договор документов ЗаказПокупателя, ПриходныйКассовыйОрдер, РеализацияТоваров (рис. 2.61). Рис. 2.61. Состав объектов, входящих в критерий отбора «ДокументыПоДоговору» В результате для таблиц объектов (в данном случае для таблиц документов) в базе данных будут созданы индексы по полям, хранящим значения этих реквизитов. Обратите внимание: в состав критерия отбора можно включить несколько реквизитов одного и того же документа или несколько реквизитов табличной части документа. Согласно информации о типе критерия отбора в группе Перейти панели нави- гации форм объектов, имеющих соответствующий тип, платформа создает команды для открытия списка критерия отбора. В приведенном выше примере такие команды будут созданы в группе Перейти панели навигации формы элемента справочника ДоговорыКонтрагентов. По умолчанию эта команда невидима, но можно включить ее видимость на закладке Командный интер- фейс в форме элемента (рис. 2.62).
Реализация прикладных задач в системе «1С:Предприятие 8.2» 212 к,—— и Спре*ю<щмк Дигог"рнКомтрагенгов: ФормаЭ^еменга Команда Видимо автовид Автол... 0 Г Панель навигации Важное & " Перейти_______________________________ Документы по договору (Обье. Спецификации договоров (Объ yf •*" ° См. также Командная панель Важное ® > Создать на основании 2 3.1вменгы Команда 1Й интерфейс Рис. 2.62. Команда открытия критерия отбора из формы элемента справочника «ДоговорыКонтрагентов» В результате, открыв какой-либо элемент справочника ДоговорыКонтрагентов. можно перейти к списку документов, в которых указан данный договор (рис. 2.63). Рис. 2.63. Открытие списка критерия отбора «Документы по договору» по текущему элементу справочника Также разработчик может сам вставить команду для открытия списка критерия отбора в форму списка объекта соответствующего типа (в данном случае справочника ДоговорыКонтрагентов). Для этого нужно найти соответс- твующую глобальную параметризируемую команду на закладке редактора формы списка - Команды ► Глобальные команды ► Параметризуемые ► Элементы ► Список ► Имя критерия отбора(Элементы.Список.ТекущиеДан- ные.Ссылка), рис. 2.64. Если же требуется обеспечить переходы другими средствами, то это можно реализовать программно. Достаточно лишь иметь в наличии ссылку на значение отбора.
Глава 2. Документы и последовательности 213! Рис. 2.64. Открытие списка критерия отбора «Документы по договору» по текущему элементу справочника То есть для вышеприведенного примера критерия отбора и переменной Ссыл- каНаЗначениеОтбора это может быть реализовано так (листинг 2.13). Листинг 2.13. Пример использования критерия отбора &НаКлиенте Процедура ОткрьгьСписокКритерияОтборг^Команда) I Открыть форму списка критерия отбора с отбором по договору ЗначениеОтбора = Новый Структура("3начение''. СсылкаНаЗначениеОтбора); ПараметрыФормы = Новый Структура^Отбор”, ЗначениеОтбора); ОткрытьФорму("КритерийОтбора.ДокументыПоДоговсруФормаСписка .ПараметрыФормы); КпнецПроцедуры W TOW ' ' ' . / <7 Краткий комментарий: сначала создается структура отбора ЗначениеОт- бора со значением реквизита формы СсылкаНаЗначениеОтбора, содержащим ссылку на договор, и добавляется в структуру параметров формы Пара- метрыФормы. Эти параметры передаются в форму списка критерия отбора ДокументыПоДоговору, и форма открывается с отбором по полю Значение списка критерия отбора, указанному в форме обработки ОткрытьФормуКрите- рияОтбора.
214 Реализация прикладных задач в системе «1С:Предприятие 8.2» Кроме того, может возникнуть потребность программного получения коллекции подчиненных документов (или других объектов), то есть соот- ветствующих отбору по определенному значению. Это можно реализовать посредством объектной техники (листинг 2.14) или посредством запроса (листинг 2.15). Листинг 2.14. Пример использования объектной техники МассивСсылокНаОб ьекты = КритерииОтбора.ДокументыПоДоговору.Найти(СсылкаНаЗначениеОтбора); Листинг 2.15. Пример использования запроса ВЫБРАТЬ ДокументыПоДоговору.Ссылка ИЗ КритерийОтбора .ДокументыПоДоговору(&Значение) КАК ДокументыПоДоговору В качестве значения параметру Значение необходимо будет передать ссылку на значение отбора. Для функционирования конкретного критерия отбора в базе данных для исходных таблиц были созданы соответствующие индексы. Поэтому обеспечивается достаточно быстрая работа этого механизма. Специальные случаи использования документов. Ручная операция Кроме типовой стратегии использования документов в конфигурации, когда движения формируются при проведении документов, система допус- кает и другие варианты участия документов в учетных механизмах. Так, в частности, допускается программное и интерактивное изменение записей регистров, в том числе и подчиненных регистратору. Причем от регистратора может использоваться только ссылка для определения отбора по регистратору. Остальное может быть выполнено вообще без использо- вания данных документа. Такая возможность не нарушает общую модель использования документов и регистров, а лишь дополняет ее для решения нестандартных задач. Например, когда пользователям нужно предоставить возможность отражения в учетных механизмах операций, для которых в конфигурации не предусмот- рено специальных документов (в бухгалтерском учете их обычно называют ручными операциями). Либо когда при регистрации события пользователь заполняет ровно те поля, которые требуется заполнять в регистре. И ввод этой учетной информации не требует никакой дополнительной обработки.
Глава 2. Документы и последовательности Рассмотрим подробнее возможность интерактивного формирования движений. Например, в рамках демонстрационной конфигурации «Хранение инфор- мации и учет движения средств», которая находится на прилагаемом компакт-диске, создан документ РучнаяОперация, данными которого будут только Дата и Номер. Поскольку проведение данного документа не предус- матривается, свойству Проведение данного документа указано значение Запретить. Однако в разделе свойства Движения отмечен регистр, для которого данный документ может быть регистратором (ТоварыНаСкладах), рис. 2.65. Рис. 2.65. Документ «РучнаяОперация» Далее при создании формы документа в окне элементов формы необходимо разместить таблицу, отображающую данные Объект. Движения.Това- рыНаСкладах (рис. 2.66). Пользователь при работе с данным документом сможет интерактивно форми- ровать или модифицировать движения данного документа по регистру ТоварыНаСкладах и записывать документ. При записи документа данные, отображаемые в этой таблице, будут записаны в регистр (рис. 2.67). Однако необходимо иметь в виду, что поведение подобного документа может быть неожиданным для пользователей, привыкших работать с документами по стандартной схеме.
216 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 2.66. Источник данных таблицы формы, отображающей движения документа в регистре «ТоварыНаСкладах» Рис. 2.67. Схема документа «Ручная операция» Например, при установке пометки удаления на такой документ не будет срабатывать отмена проведения и удаление движений документа. Ведь доку- мент и не проводился (ему было запрещено проведение). А как же обеспечить удаление движений? Вариантов несколько: Удалить сам документ. Тогда система удалит связанные с ним движения, поскольку записи регистра подчинены регистратору и в данном случае без регистратора существовать не могут.
Глава 2. Документы и последовательности 217 Интерактивно удалить записи в таблице, отображающей движения доку- мента, и записать документ. Программно очистить движения, то есть создать пустой набор записей с отбором по данному регистратору, и записать его. Кроме того, возможна ситуация, когда необходимо, чтобы движения сущес- твовали, но не участвовали в получении итогов регистра. Для этого можно снять активность записей движений. Необходимо помнить, что хотя Актив- ность является свойством записей, однако она может быть установлена или снята только для всего набора записей данного регистратора по данному регистру. Программно это может быть выполнено следующим образом (листинг 2.16). Листинг 2.16. Изменение активности записей ДвиженияЛоварыНаСкладах.УстановитьАктивность(Ложь); Кроме того, «неожиданным» для пользователя может оказаться тот факт, что при копировании подобного документа содержимое таблицы движений автоматически копироваться не будет. Ведь там отображаются движения доку- мента по регистру, а они не относятся к данным документа. Данный вопрос должен прорабатываться разработчиком. Для реализации подобной функциональности необходимо воспользоваться обработчиком события ПриКопировании объекта документа (листинг 2.17). Листинг 2.17. Использование обработчика события «ПриКопировании» Процедура ПриКопировании(ОбъектКопирования) II Перебрать движения документа-источника ДвиженияОбъектаКоплрования = РегистрыНакопления товарыНаС\'ладах. ВыбратьПоРегистратору(ОбъектКопирования.Ссыпка); Пока ДвиженияОбъектаКопирования.Следующий() Цикл II Создать новую запись в движениях текущего документа НовоеДвижение = Движения.ТоварыНаСкладах.Добавить(); // Заполнить поля новой записи регистра НовоеДвижение.ВидДвижения = ДвиженияОбъектаКопирования.ВидДвижения; НовоеДвижение.Период = ДвиженияОбъектаКопированияЛериод; НовоеДвижение.Номенклатура = ДвиженияОбъектаКопирования.Номенклатура; НовоеДвижение.Склад = ДвиженияОбъектаКопирования.Склад; НовоеДвижение.Количество = ДриженияОбъектаКопирования.Количество; КонецЦикла; КонецПроцедуры
218 Реализация прикладных задач в системе «1С Предприятие 8.2» Поскольку обработчик события ПриКопировании в качестве параметра получает объект копируемого документа, то в самой процедуре считываются его движения. Далее в цикле перебора набора записей документа источника формируются новые записи уже в коллекции движений нового документа. Значения полей новых записег заполняются значением полей записей из движений документа-источника. При интерактивном формировании движении документа в общем случае поле Период записей регистра доступно для редактирования. Это позволяет устанавливать произвольный период начала действия любой записи на итоги регистра. В ряде прикладных задач, однако, подобную «вольность» требу- ется пресечь. Для принудительной синхронизации поля Период, например, по значению даты документа можно использовать следующее (листинг 2.18). Листинг 2.18. Синхронизация даты движений с датой документа в обработчике события «ПередЗаписью» формы документа &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Для Каждого ЗаписьРегистра Из Объект.Движения.ТовармНаСкладах Цикл ЗаписьРегистра. Период = Объект.Дата; КонецЦикла; КонецПроцедуры Саму синхронизацию в зависимости от реализуемого алгоритма работы с документом можно располагать или в обработчике события ПередЗаписью в модуле формы документа, или в модуле объекта документа. В первом случае синхронизация будет производиться только при интерактивной записи доку мента, во втором - и при программной записи тоже. Кроме того, как определяли в начале этого раздела, формирование движений не обязательно может идти от документа. Движения могут быть сфор- мированы программно, посредством объекта НаборЗаписей регистра (просто с установленным отбором по нужному регистратору). Для синх- ронизации значения поля Дата записей регистра со значением поля Дата документа и для таких случаев необходимо использовать обработчик события ПередЗаписью самого набора записей (листинг 2.19), Листинг 2.19. Пример процедуры «ПередЗаписью» модуля набора записей регистра Процедура ПередЗаписыцОтказ, Замещение) II Получить дату регистратора ДатаРегистратзра = Это гОбъект. Отбор. Регистратор.Значение .Дата; II Принудительно установить значение поля "Период" каждой записи Для Каждого ЗаписьНабораЗаписей Из Это» Объект Цикл ЗаписьНабопаЗаписей.Период = ДатаРегистратора; КонецЦикла; КонецПроцедуры
Глава 2. Документы и последовательности 219 Выше мы рассмотрели ситуации и задачи, которые могут возникнуть при интерактивном формировании движений документов, которым проведение запрещено. Подобным образом могут решаться еще задачи для проводимых документов. Например, если пользователь должен иметь возможность в дополнение к сформированным при проведении документа движениям добавлять новые или вручную корректировать существующие движения. То есть в форме документа можно также создать таблицу для интерак- тивной работы с набором записей данного документа по нужному (нужным) регистру. Но при этом разработчику обязательно нужно учитывать и корректно отра- батывать возможные попытки перепроведения документа с «интерактивно откорректированными» движениями. Если ничего не предпринимать, а свойство документа Удаление движений будет иметь значение Удалять автоматически, то система при перепроведении удалит старые движения и сформирует новые такими, какими их формирует обработка проведения. То есть результаты ручной коррекции будут потеряны. Что именно должна выполнять конфигурация в подобной ситуации, зависит от постановки задачи. Все возможные предпосылки для ее решения у системы есть. Это и отключение автоматического удаления движений, и возможность отключения активности записей, и возможность реализации отказа в прове- дении документа, и т. д. Журналы документов Журнал документов - объект конфигурации, предназначенный для обеспе- чения работы с документами нескольких видов в одном списке. Посредством журналов легко обеспечивается интерактивный вызов следу- ющих действий (например, посредством командной панели формы журнала): добавление нового документа; копирование документа; « пометка на удаление документа/снятие пометки на удаление документа; удаление документа; открытие формы документа (для редактирования документа); проведение документа; отмена проведения документа; м ввод на основании;
Реализация прикладных задач в системе «1С:Предприятие 8.2» переход к связанной информации (в том числе отображение списков движений документа); установка отбора, сортировки, группировки и условного оформления списка документов; вывод данных из списка журнала документов в табличный документ или текстовый документ; изменение настройки списка отображаемых в журнале колонок; установка интервала дат в списке документов; поиск документа по значению в колонке списка/отмена поиска. С прикладной точки зрения журналы документов - средство группирования связанных по смыслу документов. Например, журнал КассовыеДокументы может включать в себя документы ПриходныйКассовыйОрдер, РасходныйКассо- выйОрдер, Чек, ОтчетКассовойСмены и так далее. Для отображения данных только одного вида документов создавать журнал документов не стоит. Потому что формируемая по умолчанию или созданная в конфигурации форма списка документа целиком реализует ту же функ- циональность без лишних структурных затрат. По сути дела журналы доку- ментов - вторичные данные системы, представляющие собой еще одно представление списка документов. Каждый документ может входить в один или несколько журналов или не входить ни в один. Все определяется наличием необходимости работы с рядом документов в составе одного списка (рис. 2.68). Рис. 2.68. Включение документов в различные журналы
Глава 2. Документы и последовательности 221 Состав журналов В состав журнала как объекта конфигурации включаются регистрируемые документы и графы (рис. 2.69). Рис. 2.69. Окно редактирования журнала документов При регистрации документа сразу же обеспечиваются возможности отобра- жения в списке журнала таких полей, как: Тип документа, Дата, Номер, ПометкаУдаления, Проведен. Наличие дополнительных граф в составе журнала дает возможность пользо- вателю получать в списке журнала сведения о документах, дополнительные к вышеперечисленным. Графа журнала представляет собой перечень рекви- зитов документов, регистрируемых в журнале, значения которых нужно отображать в списке в одной колонке (рис. 2.70). В списке журнала по каждому конкретному экземпляру документа инфор- мация будет отображаться для пользователя в составе только одной строки списка. Поэтому в каждую графу журнала можно включить только один реквизит для каждого вида документа и невозможно включать реквизиты табличной части документа.
222 Реализация прикладных задач в системе «^Предприятие 8.2» Таблица документа "Реализация" Таблица документа "ПлатежноеПоручение” Рис. 2.70. Регистрация реквизитов документов в графе журнала Кроме того, рекомендуется включать в состав одной графы данные одного типа знамени! или близких по смыслу типов значений. Например, графа Доку- ментОснование будет включать в себя данные значении соответствующих реквизитов разных видов документов. При этом типы значении реквизитов мог у г быть различными, но они близки по смыслу. На уровне объектов базы данных информация журналов документов хранится в отдельных таблицах для каждого журнала документов. Эти таблицы имеют следующий состав полей и содержат следующую инфор- мацию: Ссылка - ссылка на регистрируемый в журнале документ. Дата - дата/время регистрируемого документа. ПометкаУдаления - пометка удаления регистрируемого документа (Булево). Проведен - пометка проведенности регистрируемого документа (Булево). Номер - номер регистрируемого документа (поле существует, если хоть один из регистрируемых документов имеет номер с длиной, отличной от нуля). Графа1 - содержимое соответствующих реквизитов регистрируемых доку- ментов. Тип значения поля определяется типом значении реквизитов регистрируемых документов. ГрафаЫ - ... Согласно вышеописанному можно сделать вывод о том, что состав и тип значения полей таблиц разных журналов отличаются. Кроме того, при добав- лении новых документов к перечню зарегистрированных может меняться не только тип значения полей, но и состав полей.
Глава 2. Документы и последовательности Например, если ранее все зарегистрированные документы имели номера нулевой длины, то добавление нового с номером ненулевой длины приведет к добавлению поля Номер в составе таблицы журнала. Заполнение журналов Заполнение/редактирование таблицы журнала происходит при записи/ удалении документов, в рамках той же транзакции. Причем только в следу- ющих ситуациях: запись нового документа; запись документа, у которого есть изменения в реквизитах самого доку- мента (изменения в табличных частях не приводят к необходимости «перезаполнения» записей в таблицах журналов); запись документа с измененной датой или номером, с изменением признака проведения или пометки удаления; м удаление документа. Таким образом, функциональность журналов обеспечивается с минималь- ными временными затратами на ее поддержание. Сколько документов можно зарегистрировать в составе одного журнала? В принципе число документов, регистрируемых в составе одного журнала, неограниченное - могут быть зарегистрированы хоть все документы конфи- гурации. При решении данного вопроса необходимо только помнить о необходимости обеспечения параллельности работы пользователей и достаточного уровня быстродействия системы при выполнении операций записи/удаления документов. В отношении обеспечения параллельности работы: При файл-серверном варианте использования программы транзакционные блокировки устанавливаются на уровне таблиц базы данных. Поэтому документы, входящие в один журнал, одновременно не смогут быть запи- саны. н При клиент-серверном варианте использования программы блокировки устанавливаются на уровне записей. Поэтому блокировки СУБД допус- кают более высокую параллельность выполнения транзакций. В отношении скорости записи/удаления документов: чем меньше коли- чество журналов, в которых регистрируется документ, тем быстрее проходит его запись или удаление. Поэтому к вопросу организации журналов в составе функционально напол- ненных конфигураций нужно подходить внимательно. Также внимательно следует подходить к вопросу определения граф журнала. Большое количество граф может сказаться на производительности системы
224 Реализация прикладных задач в системе «ЮПредприятие 8.2» при просмотре журнала. Поэтому при отображении динамических списков документов, входящих в журнал, из базы данных считываются только те поля, которые связаны с соответствующими колонками таблицы формы списка журнала. Это сделано для уменьшения объема выбираемой из базы данных информации. Последовательности документов Последовательность документов - средство группирования документов в едином хронологическом порядке для обеспечения ведения единой логики событий в рамках некоего механизма учета. В отличие от журналов доку- ментов, которые используются в основном для группирования документов в «интерфейсных интересах» (для визуализации), последовательности группируют документы для обеспечения правильного отражения данных документов в учете. Поскольку учетных механизмов в составе одной конфигурации может быть несколько, то и последовательностей может быть адекватное количество. Кроме того, сами модели применения объекта Последовательность могут отличаться. В качестве первою примера рассмотрим использование последовательности для учета правильности списания партии товаров со склада. Проведение ряда документов (документов реализации) обусловлено состоянием данных, храня- щихся в базе данных, на момент времени регистрации документов (остатки партий в регистре ПартииТоваров). Изменение же этих исходных данных впос- ледствии, после проведения документа, ставит под сомнение правильность прошлого отражения данного документа в учете. Например, документ реализации Рнк-1 оформлен и проведен после двух приходных накладных, оприходовавших товар (рис. 2.71). ПоступлениеТ оваров Пнк-1 Номенкл. Кол Сум Пульт VH 10 100 ПоступлениеТ оваров Пнк 2 Номенкл. Кол Сум Пульт VH 5 60 Реализация Рнк-1 Номенкл. Кол Пульт VH 9 г - - . ь. Регистрация событий Отражение в учете Рис. 2.71. Набор документов
Глава 2. Документы и последовательности 225 При проведении было реализовано списание партий по методу FIFO (первый пришел - первый ушел). То есть расходная накладная использовала данные об остатках партий на момент ее проведения. В результате все операции были отражены в учете партий в виде следующих записей регистра ПартионныйУчет (табл. 2.6). Таблица 2.6. Записи регистра «ПартионныйУчет» Период Регистратор Вид движения Товар Партия Кол-во Сумма 13.03.2010 15:00:01 ПоступлениеТоваров № 1 13.03.2010 15:00:01 Приход Пульт VH Пнк-1 10 100 23.03.2010 15:30:45 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Приход Пульт VH Пнк-2 5 60 27.03.2010 12:30:45 Реализация № 1 27.03.2010 12:30:45 Расход Пульт VH Пнк-1 9 90 Видно что при реализации была частично списана партия Пнк-1. Далее было произведено изменение одной из исходных приходных накладных с последующим ее перепроведением (рис. 2.72). Поступление! оваров Пнк-1 Номенкл. Кол-'' Суг7 Пульт VH ( 7 70 Поступление!оваров Пнк-2 Номенкл. Кол Сум Пульт VH 5 60 Реализация Рнк-1 Номенкл. Кол Пульт VH 9 .... ь Регистрация событий Отражение в учете Рис. 2.72. Нарушение последовательности проведения документов Для новой ситуации движения документа Реализация, полученные в резуль- тате старого проведения, некорректны (табл. 2.7). Таблица 2.7. Записи регистра «ПартионныйУчет» Период Регистратор Вид движения Товар Партия Кол-во Сумма 13.03.2010 15:00:01 ПоступлениеТоваров № 1 13.03.2010 15:00:01 Приход Пульт VH Пнк-1 7 70 23.03.2010 15:30:45 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Приход Пульт VH Пнк-2 5 60 27.03.2010 12:30:45 Реализация № 1 27.03.2010 12:30:45 Расход Пульт VH Пнк-1 9 90
226 Реализация прикладных задач в системе «1С:Предприятие 8.2» Ведь для списания девяти пультов одной партии Пнк-1 теперь недостаточно! К аналогичному печальному результату можно прийти и в случае любого изменения записей регистра задним числом (рис. 2.73). Регис рация событий ► Отражение в учете Рис. 2.73. Пример изменения записей регистра задним числом В результате записи в регистре (учете) будут следующими (табл. 2.8). Таблица 2.8. Записи регистра «ПартионныйУчет» Период Регистратор Вид движения Товар Партия Кол-вс Сумма 01.03.2010 00:00:00 Ручная корректировка остатков РК -1 29.03.2010 17:00:00 Приход Пульт VH РК-1 2 16 13.03.2010 15:00:01 ПоступлениеТоваров № 1 13.03.2010 15:00:01 Приход Пульт VH Пнк-1 10 100 23.03.2010 15:30:45 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Приход Пульт VH Пнк-2 5 60 27.03.2010 12:30:45 Реализация № 1 27.03.2010 12:30:45 Расход Пульт VH Пнк-1 9 90 То есть движения документа Реализация не отвечают требованиям метода списания FIFO. Для исправления ситуации объект Последовательность позволяет в таких случаях оперировать понятием граница последовательности. Это и есть момент времени максимально глубокого в прошлом изменения записей регистра (регистров), от которого зависит проведение документов, зарегистрированных в последовательности. Именно с этого момента времени возможны коллизии правильности ведения учета. То есть до границы после- довательности документы проведены заведомо правильно, после - возможно, неправильно.
Глава 2. Документы и последовательности Сам процесс восстановления логики учета может быть реализован путем последовательного перепроведения документов, зарегистрированных в последовательности, начиная от границы последовательности, и называется восстановление последовательности. Другой вариант использования объекта Последовательность: пользова- тели в течение дня вводят поток заявок от покупателей и внутренних заявок. Причем в силу специфики автоматизируемого предприятия часто имеет место ситуация ввода нескольких заявок от одних и тех же покупателей или для одних и тех внутренних подразделений. Кроме того, возможен ввод «запоз- давших» заявок прошлых дней. Документы записываются, но не проводятся. По окончании рабочего времени офиса автоматически включается обра- ботка Консолидация заявок, которая собирает все непроведенные заявки (разных видов), начиная от границы последовательности, консолидирует их, оформляет соответствующим образом и проводит уже обобщенные заявки. Впоследствии исходные заявки удаляются. После этого граница последовательности смещается на момент времени последней проведенной консолидированной заявки (рис. 2.74). Рис. 2.74. Использование последовательности для консолидации заявок Первый приведенный пример можно назвать классическим. Он касается давно существующей задачи «борьбы с коллизиями из-за работы пользова- телей задним числом». Данная задача полностью или в большей своей части может быть решена за счет встроенных в платформу автоматических средств объекта Последовательность. Второй приведенный пример показывает, что разработчик при использовании объекта Последовательность не обязательно должен замыкаться только на «коллизиях работы задним числом». Благодаря наличию различных програм- мных средств и возможностей логика применения последовательностей документов определяется самим разработчиком.
228 Реализация прикладных задач в системе «1С:Предприятие 8.2» Устройство последовательностей Для создания объекта конфигурации Последовательность разработчик должен указать, какие документы необходимо регистрировать в последо- вательности, и список регистров, данные которых используются этими документами при своем проведении (рис. 2.75). Рис. 2.75. Свойства, относящиеся к использованию последовательности Хотелось бы обратить внимание на то, что автоматическое отслеживание изменения таких данных осуществляется только для регистров: регистров накопления, регистров сведений, регистров бухгалтерии, регистров расчета. Но это не мешает при необходимости реализовать программными средствами изменение положения границы последовательности при изменении данных других объектов. Например, для последовательности документов, критичных к изменению условий в элементе справочника Договоры, при записи модифи- цированного элемента данного справочника можно программно установить границу последовательности на момент времени самого первого документа по этому договору. Кроме того, последовательность может иметь разрезы. Это реализуется включением измерени i в данные последовательности. Например, если доба-
Глава 2. Документы и последовательности 229 вить в последовательность измерение Организация, то с прикладной точки зрения общая последовательность будет разбита на ряд последовательностей. Каждая из них может функционировать в рамках отдельной организации. То есть, например, будет возможно произвести восстановление последова- тельности документов только одной организации, не затрагивая остальных. С другой стороны, наличие измерений не препятствует работе с последова- тельностью в целом. Для хранения данных объекта Последовательность в базе данных сущес- твуют две таблицы: таблица регистрации документов в последовательности и таблица границ последовательности. Состав колонок обеих таблиц сходен: Период, Регистратор, Измерение!, ..., Измерением. Различно функциональное использование этих таблиц. Данные, хранящиеся в таблице регистрации документов, используются для решения вопросов, связанных с коллекцией зарегистрированных в последо- вательности документов. Причем в разрезе измерений. Для определенной комбинации значений измерений по одному регистратору в таблице регист- рации документов может храниться только одна запись. Впоследствии данные этой таблицы могут использоваться, например, для получения упорядоченного по хронологии набора документов, которые требу- ется перепровести для восстановления последовательности. Или просто для получения массива ссылок на документы, записи по которым соответствуют некоему отбору по измерениям последовательности. Данные в таблице границ последовательностей хранят значения моментов времени границ последовательностей (Период + Регистратор) по каждому набору значений измерений последовательности. То есть уникальность записей таблицы границ последовательностей определяется набором значений измерений. Если измерений у последовательности нет, значит, в этой таблице будет только одна запись. Пример содержимого таблиц при наличии измерений у последовательности приведен в табл. 2.9 и табл. 2.10. Таблица 2.9. Пример таблицы регистрации документов в последовательности Период Регистратор Ооганизация Склад 01.03.2010 00:00:00 Ручная корректировка остатков РК-1 29.03.2010 17:00:00 Сигма Главный 13.03.2010 15:00:01 ПоступлениеТоваров № 17 13.03.2010 15:00:01 Сигма Торговый 23.03.2010 15:30:45 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Сигма Торговый 27.03.2010 12:30:45 Реализация № 1 27.03.2010 12:30:45 Марон Главный
Реализация прикладных задач в системе «1С:Предприятие 8.2» Таблица 2.10. Пример таблицы границ последовательности Организация Склад Период Регистратор Сигма Главный 01 03.2010 00:00:00 Ручная корректировка остатков РК-1 О1 29.03.2010 17:00:00 Сигма Торговый 13.03.2010 15:00:01 Поступление Товаров № 17 13.03.2010 15:00:01 Марон Главный 27.03.2010 12:30:45 Реализация № 1 27.03.2010 12:30:45 Работа с последовательностями Работа с последовательностью включает в себя три процесса: регистрация документа в последовательности; перемещение границы последовательности назад; перемещение границы последовательности вперед (восстановление границы последовательности). В принципе эти процессы, во-первых, независимы, во-вторых, могут выпол- няться системой автоматически или посредством программных действий, заложенных разработчиком. Управление регистрацией документов в последовательности Для автоматической регистрации документа в последовательностях необхо- димо, чтобы свойство Заполнение последовательностей документа как объекта конфигурации было установлено в значение Заполнять авто- матически. Если последовательность имеет измерения, то для обеспечения автомати- ческого заполнения полей этих измерений в формируемой записи таблицы регистрации документов последовательности настраивается соответствие между реквизитами документа и измерениями последовательности доку- мента (рис. 2.76). Рис. 2.76. Соответствие между реквизитами документа и измерениями последовательности
Глава 2. Документы и последовательности В случае указания соответствия между реквизитами документа (не табличной части) и измерениями последовательности при записи документа в таблице регистрации документов в последовательности формируется запись, в которой поля автоматически заполняются значениями из документа. Если при настройке такого соответствия указывается реквизит табличной части документа, то в таблице регистрации документов будет сформировано столько записей, сколько уникальных значений будет иметь данный реквизит табличной части документа в записываемом документе (рис. 2.77). Поступление товаров Таблица записей регистрации документов в последовательности № 102 ОТ 23.03.2010 10:00:00 Период Регистратор Склад Номенкл... Склад: Г павный 23.03.201010:00:00 Пнк-102 от Г лавный Пульт VH Номенклатура Кол Цена Сумма 23.03.201010:00:00 Пнк-102 от Г лавный Шнур ЛК4 Пульт VH 15 10 150 Шнур ЛК4 1000 3 3000 Рис. 2.77. Пример формирования записей в таблице регистрации документов в последовательности Если указывается несколько реквизитов одной табличной части, будет сфор- мировано столько записей, сколько уникальных комбинаций из них указано в табличной части документа (рис. 2.78). Поступление товаров Таблица записей регистрации документов в последовательности № loFI от 123.03.201010:00:00 Номенклатура Склад Кол Пульт VH Г лавный 15 Шнур ЛК4 №3(Борисов) 300 Пульт VH Г лавный 1 Период Регистратор Склад Номенкл... 23.03.2010 10:00:00 Пнк-102 от Г лавный Пульт VH 23.03.2010 10:00:00 Пнк-102 от №3(Бор... Шнур ЛК4 Рис. 2.78. Пример формирования записей в таблице регистрации документов в последовательности Если же в соответствиях с измерениями последовательностей будут указаны реквизиты различных табличных частей, то документ будет зарегистрирован столько раз, сколько уникальных комбинаций значений можно составить (рис. 2.79).
232 Реализация прикладных задач в системе «1С:Предприятие 8.2» Пересортица Таблица записей регистрации документов в последовательности № 2 ОТ 23.03.2010 10:00:00 Период Регистратор Склад Номенкл... Склады Склад 23.03.2010 10:00:00 Пс-2 от Г лавный Пуль т VH Г лавный Ж- 23.03.201010:00:00 Пс-2 от Г лавный Шнур ЛК4 №3(Борисов) r~w 23.03.201010:00:00 Пс-2 от №3(Ьор Пульт VH 23.03.2010 10:00-00 Пс-2 от №3(Бор... Шнур ЛК4 Товары Номенклатура Пульт VH Шнур ЛК4 Пульт VH Рис. 2.79. Пример формирования записей в таблице регистрации документов в последовательности Исходя из вышесказанного, к вопросу добавления измерении в последова- тельность нужно подходить осмотрительно. Если для заполнения значении измерений использовать реквизиты табличных частей, да еще и разных, то количество записей в таблице регистрации документов в последователь- ности может быть очень велико. Это может сказаться на производительности системы. Следует иметь в виду еще один важный момент: при проведении документов, зарегистрированных в последовательности, платформа автоматически перемещает границу последовательности на момент регистрации этих доку- ментов, так как свойство Перемещение границы при проведении последовагельности как объекта конфигурации стандартно установлено в значение Перемещать. Данная операция перемещения границы последо- вательности не может выполняться параллельно, соответственно, документы тоже не могут проводиться параллельно. Это может вызвать проблемы, если документы, участвующие в последовательности, должны вводиться в больших количествах. Во избежание данной ситуации можно установить это свойство в значение Не перемещать, тогда граница последовательности при проведении доку- ментов автоматически перемещаться не будет. Это позволит одновременно и регистрировать документ в последовательности, и параллельно прово- дить сразу несколько таких документов. Затем граница последовательности может быть перемещена программно при помощи специальной регламентной обработки. Регистрация документа в последовательности выполняется при записи документа. Процесс записи документа происходит поэтапно (рис. 2.80). В случае же записи документа с проведением очередность этапов процесса будет следующей (рис. 2.81).
Глава 2. Документы и последовательности 233 Процесс записи документа Рис. 2.80. Действия, выполняемые при записи документа Процесс записи документа с проведением Рис. 2.81. Действия, выполняемые при записи документа с проведением
234 Реализация прикладных задач в системе «1С:Предприятие 8.2» Добавляется обработка проведения документа и процесс переноса границы последовательности вперед при выполнении необходимых для этого условий. В случае же записи документа с отменой проведения последовательность действий будет следующей (рис. 2.82). Процесс записи документа с отменой проведения Рис. 2.82. Действия, выполняемые при записи документа с отменой проведения Разработчику нужно помнить, что при создании новой последовательности документов автоматическая регистрация старых документов в ней не произ- водится. Для осуществления регистрации нужно будет или перезаписать существующие документы, или написать обработку которая зарегистрирует все нужные документы в последовательности. Если средств автоматической регистрации недостаточно или их использо- вание неудобно, для управления регистрацией документа в последователь- ности документов служит набор записей регистрации в последовательности документов.
Глава 2. Документы и последовательности 235’ У объекта документа есть свойство ПринадлежностьПоследователь- ностям. Его значением является коллекция наборов записей регистрации в последовательности документов. Для каждой последовательности, в которую входит документ, существует свой набор записей регистрации в последовательности документов (рис. 2.83). Рис. 2.83. Последовательности, в которые входит документ При автоматическом способе регистрации (напомним, для этого у документа как объекта конфигурации должен стоять признак автоматического запол- нения последовательности) наборы записей таблиц регистрации документов в последовательностях автоматически заполняются до записи документа и записываются после записи документа в одной транзакции. Поэтому если требуется программно очистить эти наборы записей и создать новые, можно это сделать в обработчике события ПередЗаписью или ПриЗаписи объекта документа (не путать с аналогичными обработчиками событий ПередЗаписью формы документа). Например, в составе последовательности документов ПартионныйУчет есть измерение Номенклатура. В табличной части Товары документа могут содер- жаться номенклатурные позиции, соответствующие услугам. По таким значениям измерения регистрировать документ в последовательности не нужно. Для того чтобы документ регистрировался в последователь- ности только по товарам (исключая услуги), можно сделать следующее (листинг 2.20).
236 Реализация прикладных задач в системе «1С:Г1редприятие 8.2» Листинг 2.20. Пример процедуры «ПередЗаписью» в модуле объекта документа «РеализацияТоваров» Процедура ПередЗаписьюЮтказ, РежимЗаписи, РежимПроведения) НаборЗаписейРегистрации = ПринадлежностьПоследовательностям.ПартионныйУчет; II Очистить автоматически сформированный набор записей регистрации НаборЗаписейРегистрации.Очистить(): II Получить выборку товаров из табличной части документа Запрос = Новый Запрос Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровСостав.Номенклатура ИЗ Документ РеализацияТоваров.Соста КАК РеализацияТоваровСостав ГДЕ РеализацияТоваровСостав.Ссылка = &Ссылка И (НЕ РеализацияТоваровСостав.Номенклатура.Услуга)"; Заппос.УстановитьПараметр(’'Соылка", Ссылка); Результат = Запрос Выполнить(); Выбоока = Результат.Выбрать(); II Добавить новые записи регистрации и заполнить их Пока Выборка.Следующий() Цикл НоваяЗапись = НаборЗаписейРегистрации.Добавить(); НоваяЗапись Номенклатура = Выборка.Номенклатура НоваяЗапись Период = Дата, КонецЦикла; КонецПрпцедуры Краткий комментарии: у элемента коллекции наборов записей регистрации документов в последовательности, соответствующей последовательности ПартионныйУчет, сначала очищаются все записи. Далее запросом получа- ются все номенклатурные позиции, входящие в табличную часть Товары текущего документа и не являющиеся услугами. В цикле перебора выборки из результата запроса добавляются в набор новые записи регистрации данного документа в последовательности ПартионныйУчет. Обратите внимание: в данном примере из-за того, что объект НаборЗаписейРегистрации был получен посредством свойства ПринадлежностьПоследовательностям объекта документа, при формировании новых записей достаточно было заполнить только значения измерений последовательности и поле Период, а поле Регистратор автоматически заполняется ссылкой на документ
Глава 2. Документы и последовательности 237 Если же потребуется очистить всю таблицу записей регистрации документов в последовательности, то данную операцию легко выполнить программно. Запросом считать все регистраторы, на которые имеются ссылки в таблице записей регистрации документов. А затем по всем регистраторам записать пустой набор записей (листинг 2.21). Листинг 2.21. Пример очистки таблицы регистрации документов в последовательности . ' ... . ' ...... .. ........... ............................ Процедура ОчисткаТаблицыРегистрацииПоследовательностиГ|артионг»ыйУчет() II Получить все документы, зарегистрированные в последовательности Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПартионныйУчет.Регистратор ИЗ Последовательность.ПартионныйУчет КАК ПартионныйУчет”; Результат = Запрос.Выполнить(); Выборка = Результат. Выбрать(); •sjW- II Создать набор записей таблицы регистрации последовательности II (при этом он пуст) НаборЗаписейРегистрации = Последовательности.ПартионныйУчет.СоздатьНаборЗаписей(); // Перебрать выборку из результата запроса Пока Выборка.Следующий() Цикл II Установить отбор по очередному зарегистрированному документу II в наборе записей НаборЗаписейРегистрации.Отбор.Регистратор.Установить(Выборка.Регистратор); II Записать пустой набор записей с замещением исходного НаборЗаписейРегистрации.Записать(); КонецЦикла; КонецПроцедуры Как видно из примера, для чтения данных таблиц регистрации документов в последовательностях можно применять запросы. Кроме того, у разработчика есть возможность проверить, принадлежит ли данный документ последовательности, и посредством метода Прина- длежит () объекта ПоследовательностьМенеджер.<имя>. Например, нужно проверить принадлежность документа последовательности Партион- ныйУчет (листинг 2.22). Листинг 2.22. Проверка принадлежности документа последовательности ФлагПринадлежности = Последовательности.ПартионныйУчет Принадлежит(СсылкаНаПровеояемыйДокумент);
238 Реализация прикладных задач в системе «ЮПредприятие 8.2» Или, например, проверить, принадлежит ли данный документ последователь- ности по конкретному значению измерения Номенклатура (листинг 2.23). Листинг 2.23. Проверка принадлежности последовательности II Подготовить структуры отбора по значениям измерений последовательности, ОтборПоИзмерениям = Новый Структура; ОтборПоИзмерениям. Вставить("Номенклатура", СсылкаНаТовар); // Проверить принадлежность к последовательности в отношении нужного значения измерения ФлагПринадлежности = Последовательности.ПартионныйУчет .Принадлежит(СсылкаНаДокумент, ОтборПоИзмерениям); В приведенном примере, если документ зарегистрирован в данной последова- тельности по нужному значению измерения, переменная ФлагПринадлежности получит булево значение Истина; если нет - Ложь. В общем случае при формировании записей набора записей регистрации документов в последовательности поле Период может заполняться произ- вольным значением. То есть момент времени самого документа и момент времени регистрации документа в последовательности могут отличаться. Также в общем случае может отличаться от даты документа и значение поля Период записей движений по регистрам. Это может понадобиться для реализации какой-нибудь особой логики. Например, для решения задач сложного многоитерационного планирования, когда в течение месяца могут вводиться, дополняться, частично отменяться планы, касающиеся как текущего месяца, так и следующего. Поэтому движения по регистру могут регистрироваться и на момент времени доку- мента, и на начало текущего месяца, и на начало следующего. Вероятные коллизии устраняются посредством использования объекта Последова- тельность. И поскольку документы планирования имеют разные приоритеты для разрешения коллизий планирования, регистрироваться в последователь- ности они могут не только на момент времени документа (рис. 2.84). Кроме того, для некоторых задач может оказаться полезным, что документ в разных последовательностях может регистрировагься на разные моменты времени, или в одних последовательностях регистрироваться, а в других нет. Например, при раздельной работе с последовательностями Партион- ныйУчет и Торговля.
Глава 2. Документы и последовательности 239 Регистрация в учете 01.04.2010 (регистры) 00:00:00 03.03.2010 12:00:00 11.03.2010 10:11:00 17.03.2010 12:00:00 J Регистрация в последовательности 01.03.2010 12:00:00 11.03.2010 10:11:00 01.04.2010 00:00:01 Рис. 2.84. Пример использования нестандартной регистрации документов в последовательности Перемещение границы последовательности назад Перенос границы последовательности выполняется при записи набора записей регистров. Сам процесс автоматического перемещения границы последовательности назад (сбивание границы) состоит из следующих операций (рис. 2.85): проверка того, что граница последовательности больше момента времени записи регистра; перемещение границы последовательности на момент времени записи регистра. Граница последовательности не сбивается Регистрация в учете (регистры) Г раница последовательности ---------► Момент времени записываемой записи регистра Граница последовательности сбивается Регистрация в учете (регистры) Момент времени граница последовательности записываемой записи регистра Рис. 2.85. Автоматическое сбивание границы последовательности
240 Реализация прикладных задач в системе «ЮПредприятие 8.2» На уровне таблиц базы данных результатом перемещения границы после- довательности назад является модификация записей в таблице границ последовательностей. То есть запись с ключом, соответствующим нужной комбинации значений измерений, заменяется на запись с тем же ключом, но со значениями полет Период и Регистратор, соответствующими моменту регистрации в последовательности документа, которому подчинены изме- ненные записи регистра. Важно понимать, что границу последовательности перемещают назад не документы, а движения регистров. Сделано это потому, что модифи- кация (а также добавление или удаление) записей регистра не обязательно может быть связана с проведением или удалением документа. В платформе есть средства, позволяющие просто «приписывать» движения к документам, не используя объекты документов. Например, возможна следующая ситуация: граница последовательности Планирование установлена на дату: 01.04.2010 00:00:00. Затем 10.04.2010 обработкой Перепланирование к документу ПланПродаж № 14, выписанному |И проведенному) с датой 11.03.2010 10:11:00, были «приписаны» движения по регистру ПланыПродаж с указанием периода движений 31.03.2010 00:00:00. При этом старые движения документа не замещались. Кроме этого, сам доку- мент был ранее зарегистрирован в последовательности на дату 01.03.2010 12:00:00. Измерений у последовательности нет. В результате этого действия граница последовательности будет перемещена назад при записи записей регистра именно на момент времени добавленных записей (рис. 2.86). ОБРАБОТКА _____ Регистрация в учете 31.03.2010 01 04.2010 (регистры) 11 03 2010 10'11-00 00:00:00 00:00:00 ---------------------------------------► 'k ГП ГП t__________I Регистрация событий Пл-0 )014 (документы) ---------------------------------------1----------------------------------► 11.03.2010 10:11:00 Регистрация в последовательности 01.03.201012:00:00 Рис. 2.86. Пример автоматического сбивания границы последовательности
Глава 2. Документы и последовательности 241 То есть для перемещения назад границы последовательности ни дата доку- мента, ни дата регистрации документа в последовательности значения не имеют. Но перенос (установка) границы последовательности програм- мными средствами доступен разработчику на произвольный момент времени. Например, если требуется установить границу последовательности ПартионныйУчет на момент времени, состоящий из значений переменных ДатаУстановки, ДокументУстановки по значению измерения Номенклатура, содержащемуся в переменной НоменклатураУстановки (листинг 2.24). Листинг 2.24. Перенос границы последовательности на произвольный момент времени «.жяшах, ши . .я ,« ммм. см л. -.ж WwjW • .•. X II Подготовить параметры установки границы последовательное ги: II Момент времени установки МоментУстановки = Новый МоментВремени(ДатаУстановки, ДокументУстановки); // Подготовить структуру отбора по значениям измерений последовательности, ОтборПоИзмерениям = Новый Структура; ОтборПоИзмерениям.Вставить(иНоменклатура’', НоменклатураУстановки); II Установить границы последовательности "Партионный учет" Последовательности.ПартионныйУчет.УстановитьГраницу(МоментУстановки, ОтборПоИзмерениям); Также есть средства для получения данных таблицы границ последователь- ности. Данные о значениях границ последовательности можно получить запросом или с помощью методов ПолучитьГраницыО и ПолучитьГраницуО объекта ПоследовательностьМенеджер.<имя>. Например, получение таблицы текущих границ последовательностей может выглядеть следующим образом (листинг 2.25). Листинг 2.25. Пример получения границ последовательности ТаблицаГ раницПоследовательности = Последовате! 1ьности.ПартионныйУчет.ПолучитьГ раницы("Номенклатура"); ГГ ~Ю М ' ' ' Ml 1 я гпг ЯШ Г” мЬп ' • » и '»«r Ч Для использования метода ПолучитьГраницыО обязательно указание названий измерений (через запятую), которые будут разрезами в таблице границ. Кроме того, можно использовать второй параметр метода, указав там структуру отбора по значениям измерений. Результатом вышеприведенного примера будет таблица значений, включа- ющая в себя колонки со значениями измерений (в данном случае Номенклатура) и колонку МоментВремени, в которой будут содержаться моменты времени границ последовательностей по хранящимся в последовательности комбина- циям значений измерений.
242 Реализация прикладных задач в системе «ЮПредприятие 8.2» Кроме того, можно получать первую на временной оси границу последо- вательности для ситуации последовательности с измерениями (рис. 2.87). Реализуется это следующим образом (листинг 2.26). ГП по номенклатуре "Самовар" Самовар ГП по номенклатуре "Утюг" Утюг ГП пс номенклатуре"Холодильник" Холодильник Граница Последовательности "ПартионныйУчет" -------------------------------------► Последовательность "ПартионныйУчет" Рис. 2.87. Пример границ последовательности «ПартионныйУчет» Листинг 2.26. Получение минимальной границы последовательности ТекущаяГ раницаПоследовательности = Последовательности ЛартионныйУчет ЛолучитьГ оаницу(); В заключение хотелось бы еще раз обратить внимание на то, что в случае наличия измерений в последовательности перемещение границы последова- тельности назад происходит только для тех комбинации значений измерений, которые уже присутствуют в таблице границ последовательности. То есть если в рассмотренном выше примере, где существуют границы после- довательности по номенклатурным позициям Самовар, Утюг, Холодильник, сформировать в регистре задним числом записи с другими номенклатурными позициями (не записывая документ), то граница последовательности Партион- ныйУчет перемещаться назад не будет. Восстановление последовательности Процесс переноса границы последовательности вперед называется восста- новление последовательности. Необходимым условием автоматического восстановления последователь ности является установка значения Перемещать свойству Перемещение границы при проведении последовательности как объекта конфигурации.
Глава 2. Документы и последовательности Сам процесс автоматического восстановления последовательности выпол- няется только при проведении документа и состоит из следующих операций (рис. 2.88): проверка того, что момент регистрации документа больше, чем граница последовательности; проверка того, что в последовательности нет других проведенных доку- ментов в интервале между границей последовательности и моментом регистрации документа; установка границы последовательности на момент регистрации доку- мента. Последовательность восстанавливается Зарегистрированные в последовательности документы Момент времени регистрации проводимого документа ГП Последовательность не восстанавливается Зарегистрированные в последовательности документы ГП Момент времени регистрации проводимого документа Рис. 2.88. Автоматическое восстановление границы последовательности На уровне таблиц базы данных результатом восстановления границы последовательности является модификация записей в таблице границ последовательностей. То есть запись с ключом, соответствующим нужной комбинации значений измерений, заменяется на запись с тем же ключом, но со значениями полей Период и Регистратор, соответствующими моменту регистрации в последовательности документа, проведение которого привело к восстановлению последовательности. Автоматическое перемещение границы последовательности вперед проис- ходит только при проведении документа. Не важно - нового или уже ранее проведенного, лишь бы соблюдались все условия алгоритма. Главное, что восстановление происходит именно при записи с проведением.
Реализация прикладных задач в системе «ЮПредприятие 8.2» 244 .. Сделано это по следующей причине: проведение документа - это сложный процесс, включающий в себя удаление предыдущих движений, установку признака проведенности, запись документа, запись движений документа и т.д., вплоть до «подтягиваниям границы последовательности Если разра- ботчик отказался от этого процесса и просто формирует новые записи в регистре для некоего документа-регистратора (даже если тот является следу- ющим после момента времени границы последовательности), то говорить о том, что с прикладной точки зрения последовательность восстановлена, слишком оптимистично и в принципе неверно. Например, нет никакой уверен- ности, чго при перепроведении такого документа не возникнет коллизий. Но если такая уверенность есть или она обеспечена соответствующим комп- лексом мероприятий, предусмот ренным разработчиком, то при необходимости для реализации неавтоматического переноса границы последовательности (назад или вперед) можно использовать программные средства - метод Уста- новитьГраницу () объекта ПоследовательностьМенеджер.<имя>. Использование механизма восстановления последовательности в прикладном смысле может быть разносторонним. При последовательном проведении всех документов, входящих в последовательность, начиная с момента границы последовательности, последовательность восстанавливается. И наоборот, при восстановлении последовательности перепроводятся проведенные документы, входящие в последовательность, но находящиеся за границей последовательности. Здесь хотелось бы отметить ряд особен- ностей. Во-первых, хотя автоматическая регистрация документов в последователь- ности происходит при записи документа (при любой записи документа, не обязательно при проведении), при восстановлении последовательности произ- водится перепроведение только проведенных документов. То есть только тех документов, у которых стоит признак проведения (рис. 2.89). Зарегистрированные в последовательности документы Перепроводимые при восстановлении последовательности документы Рис. 2.89. Проведение документов при восстановлении последовательности
Глава 2. Документы и последовательности Во-вторых, перепроводиться будут документы в хронологии, определяемой моментами регистрации документов в последовательности, а не моментами времени самих документов. Это может оказаться существенным, если доку- менты регистрируются в последовательности на отличные от своих моменты времени (рис. 2.90). Перепроводимые при восстановлении последовательности документы Рис. 2.90. Порядок проведения документов при восстановлении последовательности В-третьих, если в составе последовательности есть измерения, а восстанов- ление последовательности проводится общее (без разрезов по измерениям), то порядок перепроведения документов, которые нужно перепровести, опять же однозначно определяется хронологией регистрации документов в после- довательности. Сам процесс восстановления последовательности документов по опреде- ленную дату может быть инициирован: посредством системной команды Проведение документов (рис. 2.91); программно, с помощью метода Восстановить () объекта Последова- тельностьМенеджер.<имя>. Проведение документов к1 О Восстановить Восстановить все П ос ледоваггельпость I <роведени ‘докгментоь ^ранение ин. ПС.Гюедпги₽гие| иВИШк Проведение документов" j Восстановление постедователы<1стей^ F Партионный учет , Г раница 10 01 201012 00:01. Реализация товаров 000000003 О Прекращать восстановление последовательностей после ошибки Л Рис. 2.91. Команда восстановления последовательностей
246 Реализация прикладных задач в системе «1С:Предприятие 8.2» В первом случае есть возможность прервать интерактивный процесс восстановления последовательности путем нажатия комбинации клавиш Ctrl + Break. В последнем случае последовательность можно восстановить в целом, можно даже без указания, по какой момент времени (листинг 2.27), а можно и в пределах указанных комбинации измерений последовательности. Листинг 2.27. Пример использования метода «Восстановить()» Последовательности.ПартионныйУчет.ВосстановитьО' Например, необходимо восстановить последовательность документов Парти- онныйУчет по момент времени документа из переменной СсылкаНаДокумент по значению измерения Номенклатура, хранящемуся в переменной То^ар. Вариант выполнения такого действия представлен в листинге 2.28. Листинг 2.28. Пример восстановления границы последовательности // Сформировать момент времени, по который будет восстанапливаться последовательность МоментВосстановленияГю * Новый МоментВремени(СсылкаНаДокумент.Дата, СсылкаНаДокумент); II Сформировать таблицу отбора ТаблицаКомбинацийИзмерений = Новый ТаблицаЗначений; //Добавить колонки с именами, соответствующими II именам измерений последовательности ТаблицаКомбинацийИзмерений.Колонки.Добавить("Номенклатура"), II Добавить строку(и) со значением(ями) отбора СтрокаТаблицы = ТаблицаКомбинацийИзмерений.Добавить(); СтрокаТаблицы.Номенклатура = Ссь'лкаНаТовар; II Восс1ановлть последовательность Поспедовательности.ПартионныйУчет. Восстаносить/МоментВосстановленияПо, ТаблицаКомбинацийИзмерений); Параллельный ввод документов, участвующих в последовательности Как было описано выше, в базе данных информация последовательностей документов хранится в двух таблицах: таблице записей регистрации документов в последовательности; таблице границ последовательностей.
Глава 2. Документы и последовательности 247 Выполнение различных действий с последовательностью в клиент-серверном варианте использования программы порождает блокирование этих таблиц в различных диапазонах: При регистрации документа в последовательности происходит добав- ление или модификация набора записей таблицы регистрации документов в последовательности, подчиненного регистратору. Поэтому заблокиро- ванным оказывается как минимум диапазон записей, соответствующих одному регистратору (плюс две граничные записи «вокруг» этого диапа- зона). При перемещении границы последовательности назад происходит моди- фикация записей границ по соответствующим комбинациям значений измерений. Поэтому блокируются записи таблицы границ последова- тельности, соответствующие данным комбинациям значений измерений. А если измерений в последовательности нет, то вся таблица целиком. При перемещении границы последовательности вперед. Этот процесс происходит только при проведении документа, поэтому блокируются обе таблицы. Таблица регистрации документов в последовательности оказы- вается заблокированной в диапазоне от границы последовательности по момент времени регистрации проводимого документа в последователь- ности. То есть заблокированными могут оказаться записи, подчиненные документам не проведенным, но зарегистрированным в последователь- ности в указанном интервале. Таблица границ последовательностей будет заблокирована целиком. Если у последовательности есть измерения, то вышеописанные блокировки при данном действии будут касаться только записей с комбинациями значений измерений, совпадающими со значе- ниями измерений записей регистрации. В файловом варианте работы системы в любом случае происходит блоки- ровка таблиц целиком. Согласно данному описанию механизма блокировок видно, что узким местом обеспечения параллельности ввода и проведения документов для клиент-серверного варианта работы системы являются действия, связанные с автоматическим перемещением границы последовательности. То есть если документ зарегистрирован в последовательности, то при его проведении система может предпринять попытку автоматического пере- мещения границы последовательности на момент регистрации данного документа. Это приведет к блокировке таблицы границ последовательности целиком или в диапазоне соответствующей комбинации значений измерений последовательности. Параллельно проводимый документ, входящий в ту же последовательность, при попытке заблокировать те же записи или таблицу не сможет этого сделать. В результате вместо параллельного проведения для таких документов получим последовательное.
248 Реализация прикладных задач в системе «1С:Предприятие 8.2» Одним из вариантов выхода из ситуации является отключение автоматичес- кого перемещения границы последовательности при проведении документов Для этого свойству Перемещение границы при проведении после- довательности как объекта конфигурации устанавливается значение Не перемещать. В этом случае при проведении документа, даже если он регистрируется в последовательности, система не предпринимает попытки перемещения границы (границ) последовательности. А блокировки, возникающие при регистрации разных документов в последовательности, не мешают друг' другу. То есть тогда работа с объектом Последовательность не препятс- твует параллельному проведению документов. Необходггмо лишь не забыть позже реализовывать перемегцение границы последовательности, например, служебной обработкой.
Глава 3. Реализация задач учета движения средств Оперативный учет. Описание задач, решаемых регистрами накопления Практически все теории, тем или иным образом связанные с технологиями учета, управления, принятия решений и т.д., базируются на понятии «пока- затель». Показатель - данные, по которым можно судить о развитии, ходе, состоянии чего-нибудь. Оперативный учет-учет, позволяющий максимально быстро получать инфор- мацию о значениях показателей, учитываемых в автоматизируемой системе. Платформа системы «1С:Предприятие» предлагает удобное для учета пока- зателей средство - регистры. Посредством их использования обеспечиваются необходимое быстродействие, функциональная гибкость и простота решения этих информационных задач. Как правило, информационные модели при этом включают не только одни регистры. Обычно используется следующая схема (рис. 3.1): документами регистрируются события, приводящие к изменению значений показателей; сами значения показателей хранятся в регистрах; посредством отчетов пользователи получают информацию о состоянии показателей и проводят ее анализ.
250 Реализация прикладных задач в системе «ЮПредприятие 8.2» Рис. 3.1. Общая схема оперативного учета Какие же именно показатели используются при решении задач учета движения средств? И какие регистры нужно лля них использовать? При автоматизации учета движения средств чаще приходится сталкиваться с ситуацией, когда в момент регистрации изменений показателя фиксируется не конечное итоговое значение показателя, а его приращение. Например, при регистрации поступления товаров на склад - количество поступивших товаров, а не находящихся в остатке; при регистрации выдачи денег подотчетнику фиксируется выданная сумма, а не оставшаяся в кассе, и тому подобное. А вот при получении данных из системы учета уже требу- ются накопленные (итоговые) значения показателей. акие показатели называют показателями накопления. Для решения задачи учета показателей накопления в системе «ЮПредпри- ятие» используются регистры накопления. Регистр накопления - объект конфигурации, предназначенный для хранения итоговых (накопленных) значений показателей и хранения движений (приращений) показателей. Помигио итоговых значении показателей, регистр может хранить и промежуточные итоги, рассчитанные для указанных периодов. Информация о приращениях показателе^ (заметьте, они могут быть как поло- жительными, так и отрицательными) вносится в регистр накопления только посредством движений, то есть посредством наборов записей регистра, подчиненных документу-регистратору. Этим обеспечивается обоснованность регистрации изменений показателей - регистрацией событий, приводящих к этим изменениям.
Глава 3. Реализация задач учета движения средств 251 Упрощенно можно сравнить регистр накопления с неким «черным ящиком», «на вход» которого подаются значения приращений, а «на выходе» можно получить накопленные значения приращений (рис. 3.2). Рис. 3.2. Упрощенная схема регистра накопления Как можно заметить из приведенного рисунка, показатели накопления имеют различный прикладной смысл. Различают следующие виды накапливаемых показателей: показатели остатков, оборотные показатели. Итоги показателей остатков отражают значения учитываемых показателей на некоторый момент времени. Итоги оборотных показателей отражают значения совокуп- ного изменения показателя за временной интервал между двумя моментами времени (период). Если эти изменения положительные или отри- цательные, можно оперировать такими понятиями, как Приход и Расход (рмс. 3.3).
252 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 3.3. Различные виды накапливаемых показателей Таким образом, можно сказать, что показатели остатка и оборотные показа- тели характеризуют один и тот же процесс, но с разных сторон. Важно отметить, что показатели остатка имеют абсолютные итоги относи- тельно момента начала ведения учета. При этом изменения в приращениях (движениях) любых прошлых периодов влияют на текущее значение итога. Рассмотрим пример, приведенный на рис. 3.4. Исходные движения: 01.02.2010 01.03.2010 Изменение движений в прошлом: 01.02.2010 01.03.2010 Рис. 3.4. Пример влияния изменений в прошлых периодах на показатели остатков
Глава 3. Реализация задач учета движения средств Изменения показателя Деньги в кассе фиксируются посредством документов Приходный кассовый ордер (ПКО) и Расходный кассовый ордер (РКО). Оформ- ление поступления денег в январе повлияет на остатки, как на начало февраля, так и начало марта и т. д. В противоположность рассмотренному примеру итоги оборотных показа- телей за разные периоды независимы. Рассмотрим пример на рис. 3.5. Исходные движения: Рнк-1 Рнк-2 01.02.2010 Рнк-3 01.03.2010 200 300 150 Оборот: 500 Оборот: 150 Изменение движений в прошлом: Рис. 3.5. Отсутствие влияния изменений в прошлых периодах на оборотные показатели Изменения показателя Сумма проданного регистрируются посредством доку- мента Расходная накладная (Рнк). Введенные изменения в объемах продаж января будут касаться только января, но никак не коснутся февральских объемов продаж. Для гибкого и эффективного решения задач прикладной области система «ЮПредприятие» позволяет использовать два вида регистров накопления. Регистры накопления остатков позволяют получать итоговые значения показателей остатков и, кроме того (суммируя приращения этих показа- телей за периоды), позволяют получать обороты. Например, при решении задачи учета товаров на складах может понадобиться как значение остатка товаров на момент времени, так и оборот поступлений или расходов товара за периоды времени. Если же для некоторых сущностей накопление остатков смысла не имеет и требуется накапливать только обороты, тогда следует использовать оборотные регистры накопления. Например, учет оборотов продаж компании. О продажах всегда можно говорить только в отношении временного периода.
254. Реализация прикладных задач в системе «1С:Предприятие 8.2» ВНИМАНИЕ! Перечисленные виды регистров накопления не являются в общем случае взаимозаменяющими. Каждый из них предназначен для решения своего собственного круга прикладных задач. Например, для решения задач, связанных с учетом только оборотных показателей, не следует использовать регистры остатков и, наоборот, не следует пытаться вести учет показателей остатков на оборотных регистрах. Подобные попытки могут привести как минимум к неоправданному снижению быстродействия прикладного решения или вообще к некорректности данных учета. Структура регистра накопления В состав регистра накопления как объекта конфигурации входят измерения, ресурсы и реквизиты (рис. 3.6). Регистр накопления ТоварыНаСкладах Рис. 3.6. Состав регистра накопления Ресурсы используются для хранения информации как о приращениях, так и о самих значениях показателе!.. По сути, каждый ресурс хранит данные одного показателя. Однако регистры могут быть не только одномерными. Например, для решения задачи учета количества товаров нерационально оперировать большим количеством ресурсов (показателей) типа Количест- воХолодильников, КоличествоПылесосов, КоличествоПультов\/Н и т.д. Лучше
Глава 3. Реализация задач учета движения средств 255 использовать один ресурс (показатель) Количество, но ввести разрез учета - ПоНоменклатурнымПозициям. В регистрах накопления разрезы учета реализуются с помощью измерений. В состав регистра можно включить более одного измерения, поэтому в общем случае регистр накопления можно представить как п-мерную систему разрезов учета (измерений), в узлах которой хранятся совокупные данные ресурсов (итоги), рис. 3.7. Склад Г лавный Фили-2 Барометр G5 Пульт VH Станция G121 Рис. 3.7. Многомерная модель регистра накопления Номенклатура На представленной схеме - двумерная модель хранимой в регистре инфор- мации по итогам. Разрезы учета (измерения) Номенклатура и Склад. Узлами пересечений этих разрезов учета будут все возможные комбинации значений номенклатурных позиций на складах. Итог показателя Количество в каждом узле пересечения отражает данные: сколько (в количественном выражении) конкретной номенклатуры находится на конкретном складе. Данные этой графической двумерной модели можно представить в виде табличной модели (табл. 3.1). Таблица 3.1. Табличное представление данных регистра Номенклатура Склад Количество Барометр G5 Главный 30 Барометр G5 Фили-2 15 Пульт VH Фили-2 И Станция G121 Главный 5 Каждая строка содержит значение итога ресурса Количество для конкретной комбинации значений разрезов учета Номенклатура и Склад.
256 Реализация прикладных задач в системе «^Предприятие 8.2» Из достоинств табличной модели сейчас хотелось бы отметить универсаль- ность. Если графическое отображение более чем трехмерного пространства тяжело или вообще невозможно для человеческого восприятия, то табличная модель в принципе не ограничивает количество разрезов учета. Впоследствии будет рассмотрено, что хранение итогов регистров в базе данных основано именно на использовании табличной модели. Реквизиты - дополнительные характеристики движении, то есть первичных записей регистра. Реквизиты не влияют на итоги, хранимые в регистре. На вышеприведенной схеме, отражающей итоги, нет места реквизитам. Однако реквизиты могут быть использованы при решении задач анализа выполненных движений. То есть таких задач, в которых работа идет только с приращениями показателей, безотносительно их итоговых значений. Например, если при формировании движений регистра ТоварыНаСкладах заполнять соответствующие значения: поступление, реализация в розницу, реализация оптом, списание, перемещение и т.д. для реквизита ВидОперации, то впоследствии можно будет анализировать, какая из операций производится чаще других, какая реже; какие операции не выполняли в течение последнего квартала и г. п. Итак, в отношении задач, решаемых регистрами накопления, структура регистра как объекта конфигурации позволяет вести многомерный учет, как приращений, так и итогов показателей накопления, с возможностью при необ- ходимости использования дополнительных характеристик движений. Для обеспечения данных возможностей предусмотрена соответствующая структура таблиц базы данных и порядок работ с ними. Данные каждого регистра накопления хранятся в базе данных в двух таблицах: таблица движений регистра накопления; таблица итогов регистра накопления. Существует два вида регистров накопления, и каждый предназначен для ведения учета показателей своего вида (остатков или оборотов). И как разбирали выше, задачи учета показателей этих видов различны. Поэтому структура таблиц базы данных для регистров накопления разных видов тоже отличается. Она оптимизирована под решение соответствующих задач. Для регистра накопления остатков состав колонок таблицы движений следу- ющий: Период - дата записи. Совместно с полями Регистратор и НомерСтроки определяет положение данной записи на временной оси. Регистратор - ссылка на документ, которому подчинена данная запись.
Глава 3. Реализация задач учета движения средств 257 НомерСтроки - уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор. ВидДвижения - значение системного перечисления ВидДвиженияНакоп- ления, обозначающее направление приращения указанных в записи ресурсов на итоги по этим ресурсам (Приход или Расход). Активность - тип Булево. Содержит признак влияния записи на итоги регистра. <Измерение> - значение измерения. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации. <Ресурс> - значение ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации. <Реквизит> - значение реквизита. Количество таких полей равно количеству реквизитов, определенных в данных регистра как объекта конфигурации. Таблица движений регистра хранит данные о выполненных по регистру движениях. Таблица итогов регистра накопления остатков хранит текущие итоги на момент времени последнего движения (актуальные итоги). Дополнительно к этому могут храниться промежуточные итоги, если установлен период рассчитанных итогов. Период рассчитанных итогов влияет только на производительность при полу- чении итогов на некоторую промежуточную дату; если он установлен, итоги будут получены быстрее. Структура таблицы итогов регистра накопления остатков следующая: Период - дата, на которую актуально состояние хранимого в таблице итога. <Измерение> - значение измерения - разреза учета хранимых итогов. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации. <Ресурс> — значение итога ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфи- гурации. Разделитель - поле, позволяющее распараллелить обновление записей итогов. Добавляется в структуру таблицы итогов для регистров накоп- ления, у которых установлено свойство Разрешить разделение итогов. Пример заполнения таблицы движений регистра накопления остатков приведен в табл. 3.2.
258 Реализация прикладных задач в системе «^Предприятие 8.2» Таблица 3.2. Пример заполнения таблицы движений регистра накопления остатков Период Регистратор Номер строки Вид движения л о о X ш S Номенклатура Склад Количество Сумма 03.04.2010 15:00:00 Поступление товаров № 1 13.05.2010 15:00:00 1 Приход Истина Пульт VH Главный 1 10 13.05.2010 15:00:01 Поступление товаров № 2 13.05.2010 15:00:01 1 Приход Истина Пульт VH Главный 9 90 13.05.2010 15:00:01 Поступление товаров № 2 13.05.2010 15:00:01 2 Приход Истина Пульт PW Главный 7 490 23.05.2010 15:30:45 Поступление товаров Кр 3 23.05.2010 15:30:45 1 Приход Ложь Пульт VH Фили-2 5 60 27.05.2010 12:30:45 Реализация № 1 27.05.2010 12:30:45 1 Расход Истина Пульт VH Главный 8 80 31.05.2010 23:59:59 Поступление товаров № 4 31.05.2010 23:59:59 1 Приход Истина Пульт PW Фили-2 1 17 01.06.2010 00:00:00 Поступление товаров № 5 01.06.2010 00:00:00 1 Приход Истина Пульт VH Фили-2 1 18 Для вышеприведенного примера заполнения таблицы движений регистра таблица итогов регистра после расчета итогов по 31.05.2010 будет выглядеть так, как показано в табл. 3.3. Таблица 3.3. Пример заполнения таблицы итогов регистра накопления остатков Период Номенклатура Склад Количество Сумма Итоги апреля 2010 года 01.05.2010 00:00:00 Пульт VH Главный 1 10 Итоги мая 2010 года (граница рассчитанных итогов! 01.06.2010 00:00:00 Пульт УН Главный 2 20 01.06.2010 00:00:00 Пульт PW Главный 7 490 01.06.2010 00:00:00 Пульт PW Фили-2 1 17 01.11.3999 00:00:00 Пульт VH Фили-2 1 18 Текущие итоги 01.11.3999 00:00:00 Пульт VH Главный 2 20 01.11.3999 00:00:00 Пульт PW Главный 7 490 01.11.3999 00:00:00 Пульт PW Фили-2 1 17
Глава 3. Реализация задач учета движения средств 259 Обратите внимание: данные таблицы итогов содержат значения итогов ресурсов для всех возможных комбинаций значений измерений. Исключения составляют итоги, если для данной комбинации значений измерений значения всех ресурсов равны нулю. Такие записи в таблице итогов не хранятся за ненадобностью, потому что с прикладной точки зрения ситуация «нет итогов по данной комбинации значений измерений» равносильна ситуации «го данной комбинации значений измерений все итоги равны нулю». В разделе «Получение данных из регистров накопления» на стр. 299 рассмотрим, как при решении задач получения данных о значениях показа- телей (ресурсов) система может оптимальным с точки зрения быстродействия способом обращаться к данным как таблицы движений, так и таблицы итогов регистра. Структура таблиц оборотного регистра накопления, хранимых в базе данных, схожа. Отличие заключается только в том, что для оборотных регистров не существует понятия вид движения и понятия текущие итоги. Состав колонок таблицы движений оборотного регистра накопления следу- ющий: Период - дата записи. Совместно с полями Регистратор и НомерСтроки определяет положение данной записи на временной оси. Регистратор - ссылка на документ, которому подчинена данная запись. НомерСтроки - уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор. Активность - тип Булево. Содержит признак влияния записи на итоги регистра. <Измерение> - значение измерения. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации. <Ресурс> - значение ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации. <Реквизит> - значение реквизита. Количество таких полей равно количеству реквизитов, определенных в данных регистра как объекта конфигурации. Структура таблицы итогов оборотного регистра накопления тоже схожа: Период - период (месяц), за который накоплен оборот итогов ресурсов. <Измерение> - значение измерения - разреза учета хранимых итогов. Коли- чество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации, у которых установлено свойство Использование в итогах.
260 Реализация прикладных задач в системе «ЮПредприятие 8.2» <Ресурс> - значение итога оборота ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфи- гурации. Разделитель - поле, позволяющее распараллелить обновление записей итогов. Добавляется в структуру таблицы итогов для регистров накоп- ления, у которых установлено свойство Разрешить разделение итогов. Но вот сами данные, хранимые в таблице итогов, и механизмы их использо- вания коренным образом отличаются от регистра остатков. Для оборотного регистра в таблице итогов хранятся посчитанные суммарные обороты (итоги) ресурсов за каждый месяц, в рамках которого были зарегистрированы движения в данном регистре. Пример заполнения таблицы движений оборотного регистра накопления Продажи представлен в табл. 3.4. Таблица 3.4. Пример заполнения таблицы движений оборотного регистра накопления Период Регистратор Номер строки Активность Номенклатура Контрагент Количество Сумма 27.05.2010 12:30:45 Реализация № 1 27.05.2010 12:30:45 1 Истина Пульт VH Ялта-Лтд 9 135 29.05.2010 15:00:01 Реализация № 2 29.05.2010 15:00:01 1 Истина Пульт VH Компания "Риона” 10 150 13.06.2010 15:00:00 Реализация № 3 13.06.2010 15:00:00 1 Истина Пульт VH Компания "Риона" 1 15 23.06.2010 10:00:00 Реализация № 3 23.06 2010 10:00:00 1 Истина Пульт VH Компания "Риона" 1 15 23.06.2010 15:30:45 Реализация № 4 23.06.2010 15:30:45 1 Ложь Пульт PW Крона 1 90 01.11.2010 08:59:59 Реа пизация № 5 01.10.2010 08:59:59 1 Истина Пульт PW Ял га-Лтд 1 95 Для вышеприведенного примера заполнения таблицы движений таблица итогов регистра будет заполнена следующим образом (табл. 3.5).
Глава 3. Реализация задач учета движения средств Таблица 3.5. Пример заполнения таблицы итогов оборотного регистра накопления Период Номенклатура Контрагент Количество Сумма Итоги мая 2010 года 01.05.2010 00:00:00 Пульт VH Ялта-Лтд 9 135 01.05.2010 00:00:00 Пульт VH Компания "Риона” 10 150 Итоги июня 2010 года 01.06.2010 00:00:00 Пульт VH Компания "Риона" 2 30 Итоги ноября 2010 года 01.11.2010 00:00:00 Пульт PW Ялта-Лтд 1 95 В разделе «Получение данных из регистров накопления» на стр. 299 будет рассмотрено, в каких случаях и какими средствами достигается оптимальное быстродействие при получении данных оборотных регистров. Здесь же следует сказать, что как для регистров остатков, так и для оборотных регистров система «1С:Предприятие» индексирует таблицы движений и таблицы итогов. При этом для таблиц движений регистров создаются следу- ющие индексы: Период + Регистратор + НомерСтроки; Регистратор + НомерСтроки; Измерение + Период + Регистратор + НомерСтроки, если для измерения Измерение свойство Индексировать установлено в значение Индекси- ровать; Реквизит + Период + Регистратор + НомерСтроки, если для реквизита Реквизит свойство Индексировать установлено в значение Индекси- ровать. Для таблиц итогов создается следующий индекс: П ериод + Измерение1 + Измерение2 + ... + Измерением + Разделитель - по всем измерениям регистра. Измерение + Период, если для измерения Измерение свойство Индекси- ровать установлено в значение Индексировать. Использование индексов позволяет еще больше сократить время выполнения операций с данными регистра. Однако необходимо иметь в виду, что Microsoft SQL Server накладывает определенное ограничение на количество полей, входящих в составной индекс, - не более 16 полей в индексе. Поэтому работа с регистрами, имеющими очень большое количество измерений, может быть неэффективна по скорости из-за невозможности использования индексных таблиц. Подробнее об индексировании таблиц базы данных можно прочитать в разделе «Индексы таблиц базы данных» на стр. 697.
262 Реализация прикладных задач в системе «1С:Предприятие 8.2» Механизмы заполнения таблиц регистров накопления в базе данных Как было определено выше, данные каждого регистра накопления хранятся в двух таблицах базы данных: таблице движений регистра накопления; таблице итогов регистра накопления. В таблицу движений регистра записи могут вводиться пользователем вручную, генерироваться в процессе выполнения обработок либо при прове- дении документов. Подробно это описано ниже, в разделе «Запись данных в таблицу движений регистра накопления» на стр. 264. При формировании данных таблицы итогов важно обеспечить их непроти- воречивость данным таблицы движении. Чтобы, например, не получилось, что по данным таблицы движений за все время в кассу предприятия пришло 100 рублей, ушло 50 рублей, но таблица итогов содержит данные об остатке 1 000 рублей. Поэтому заполнение таблицы итогов осуществляется системой согласно данным активных записей таблицы движении, при расчете итогов (автомати- ческом или инициированным специальными методами), Подробно это описано в разделе «Механизмы заполнения таблицы итогов регистра накопления» на стр. 289. То есть пользователь или разработчик не могут непосредственно записывать данные в таблицу итогов регистра накопления, зато могут иници- ализировать действия системы, производящие расчет и заполнение итогов (рис. 3.8). Рис. 3.8. Заполнение таблицы итогов регистра накопления
& . 263 Глава 3. Реализация задач учета движения средств Если признак расчета итогов регистра включен, то расчет и заполнение данными таблицы итогов регистра производятся автоматически при записи набора записей. Проверить значение признака расчета итогов можно с помощью метода ПолучитьИспользованиеИтогов () менеджера регистра накопления (листинг 3.1). Листинг 3.1. Пример использования метода «ПолучитьИспользованиеИтогов()» ПризнакИспользованияИтогов = РегистрыНакоплення.ПартииТоваров.ПолучитьИспользованиеИтогов(); Если ПризнакИспользованияИтогов Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Итоги по регистру ‘ПартииТоваров’ рассчитываются"; Сообщение.Сообщить(); КонецЕсли; При необходимости разработчик может отключать или включать расчет итогов при записи движений. Это может понадобиться для того, чтобы повысить скорость записи набора записей регистра при массовых загрузках данных. Например, требуется загрузить массив информации по документам и их движениям (листинг 3.2). Листинг 3.2. Пример отключения использования итогов регистра накопления II Отключить использование итогов регистра РегистрыНакопленияЛартииТоваров.УстановитьИспользованиеИтогов(Ложь); Для Каждого Элемент из МассивИнформации Цикл II Выполнить действия по загрузке документов (регистраторов) // и наборов записей регистра //... II Записать загруженные наборы записей //... КонецЦикла; II Включить использование итогов регистра // (одновременно выполнится пересчет итогов) РегистрыНакопления.ПартииТоваров.УстановитьИспользовэниеИтогов(Истина); В приведенном примере обеспечивается ситуация, когда заполнение таблицы итогов выполняется единоразово, а не при каждой записи набора записей загружаемых документов. Дело в том, что при включении использования итогов система производит пересчет всех итогов с момента самого раннего движения, сделанного после отключения активности итогов.
264 Реализация прикладных задач в системе «ЮПредприятие 8.2» В отношении использования подобных приемов необходимо понимать, что при отключенном расчете итогов регистра система не может обеспечить непротиворечивость данных таблиц движении и итогов регистра. Поэтому попытки обращении к итогам такого регистра будуп отклоняться системой с выдачей соответствующих предупреждений об этом. Запись данных в таблицу движений регистра накопления Для понимания работы механизмов формирования или модификации записей в таблице движении регистра накопления необходимо, прежде всего, исходить из положения о том, что все записи в регистрах уникальны с точки зрения комбинации значений в ключевых полях. Регистры накопления не поддерживают независимого формирования записей без использования документа-регистратора. Этим достигается обоснован- ность информации регистров - данными документов. То есть обоснованность информации объектов, осуществляющих учет показателей, данными объектов, осуществляющих первичную регистрацию событий, приводящих к изме- нению значений показателей. С другой стороны, к одному регистратору может быть отнесено более одной записи движения. Поэтому для регис- тров накопления в таблице движений ключевыми являются поля Регистратор и НомерСтроки (рис. 3.9). Товары на складах Ключевые поля t * <♦*) I (ДНаити . | / \ Все действия ~ Период .=. Регистратир ► Номе^йтроки Номенклатура Склад Количество В.. 'п А 09.05.201012:00:00 РеализацияТоваров 00... Славиатура LK-601 КВ-2000 Р. Главный 5,00 — 09.05.201012:00:00 РеализацияТоваров 00... 2 <лаьиатура Keyboard PS/2 Главный 8,00 — 09.05.201012:00:00 РеализацияТоваров 00... 3 2ист блок Hewlett-Packard Ve... Г лавный 4,00 — 09.05.2010 12:00:00 РеализацияТоваров 00.. 4 Сист. блок IBM NetVista М41 Г лавный 4,00 — 09.05.2010 12:00 и0 РеализацияТоваров 00... 5 Мпнитор 19' Hitachi СМ715ЕТ Г лавный 3,00 — 0905 201012:00:00 РеализацияТоваров 00... 6 Монитор 15' LG Studioworks 5 Главный 1,00 — 09.05.2010 1 2:00 00 Реализация toi аров 00. 7 Мышь GENIUS "EASY" (3 кно Г лавный 9.00 — 09.05.2010 1 2:00:00 Реали: >ция товаров 00.. 8 Мышь 0К-720 Mouse А4Тech Г лавный 4.00 09.05.2010 12:00:00 Реализациятоваров 00... V/ Ла >ерныи Принтер Canon LB Г лавный 1,00 + 11.05.2010 0:00:00 Ручная операция ЛООС" 1 С:Бухгалтерия 7.7 Базовая Склад отдела 5.00 + Г 05 20100:00 00 ручная операция 00000.. 2 1 С: Бухгалтерия 7.7 Стандарт. Фили-2 5.00 + 11 05 20100:00:00 Поступление товароь 0... Windows ХР Home Edition Rus Склад отдела 3.00 + 11.05.20100:00:00 Поступление товаров 0... 1 Windows XP Home Edition Rus Склад отдела 5.00 + 11.05.2010 0:00:00 Поступление товаров 0. 3 Windows ХР Professional Russi. Склад отдела 1 00 — 12.05.201012:00:00 Реализация товаров 00. Клавиатура Linkworld LK-601 . Г лавный 10.00 — 12.05.2010 1 2:00:00 Реализация товаров 00. Клавиатура Apple Pro Keyboards Г лавный 40.00 — 12.05.2010 12:00:00 Реали: ация товаров 00.. ] Сист блок Hewlett-Packard Br-. Главный 5,00 — 12.05.2010 1 2:00:00 Реализациятоваров 00.. 4 Сист блок IBM NetVista A22p Г лавны i 5,00 — 12.05.2010 12:00:00 Реализация товаров 00.. Монитор 17' Philips 107S20 Г лавный 4.00 ▼ Набор записей, подчиненный регистратору Поле “НомерСтроки" содержит порядковый номер записи в наборе записей, подчиненных регистратору Рис. 3.9. Набор записей регистра накопления
Глава 3. Реализация задач учета движения средств Для обеспечения манипулирования записями регистра при формировании или модифицировании движений используется объект встроенного языка системы РегистрНакопленияНаборЗаписей.<имя>. В отношении регистров накопления эти действия выполняются при использовании обяза- тельного отбора по регистратору То есть запись модифицированных данных в таблицу движений регистра накопления не может выполняться отдельно для каждого движения, а только «блоками», то есть наборами записей, подчи- ненных одному регистратору. Поле НомерСтроки система заполняет автоматически, при добавлении или вставке новой записи в набор записей, отобранных по первому ключевому полю Регистратор. Поле НомерСтроки содержит порядковый номер записи в наборе записей, подчиненных одному регистратору. Кроме того, в регистре накопления не могут существовать записи с пустым значением поля Регистратор, то есть не подчиненные ни одному регистратору или «подчиненные пустому регистратору». Это противоречило бы принципу «обоснованности данных регистра накопления». Таким образом, в отношении движений регистров накопления можно конста- тировать строгую связь с двумя классами объектов конфигурации: с регистрами как «хранителями» движений; с документами как с «обоснованием» формирования и наличия движений. Соответственно, для заполнения или модификации данных таблицы движений есть две возможности: посредством создания набора записей регистра с обязательным отбором по регистратору; посредством использования свойства объекта документа Движения, пред- ставляющего собой коллекцию наборов записей, подчиненных данному регистратору. ПРИМЕЧАНИЕ Можно сказать, что свойство Движения объекта документа представляет собой определенный «сервис», призванный облегчить труд разработчика по созданию движений документа. В этом свойстве содержатся пустые наборы записей по всем регистрам, по которым документ может выполнять движения. Для этих наборов записей уже установлен отбор по регистратору, соответствующему текущему документу. Сами же действия по записи могут инициироваться как программно (при выполнении обработок), так и интерактивно. Примеры подобных дейс- твий приводятся ниже.
266 Реализация прикладных задач в системе «1С:Предприятие 8.2» Свойство «Движения» объекта документа Свойство Движения - это свойство объекта документа (Доку- ментОбъект.<Имя>). Состав наборов записей, входящих в эту коллекцию, определяется системой исходя из информации, хранящейся в конфигурации. Модификация этого состава может осуществляться при работе с документом как с объектом конфигурации (рис. 3.10). Рис. 3.10. Регистры, для которых документ является регистратором Кроме этого, состав наборов записей, создаваемых системой в свойстве Движения, может быть изменен при редактировании регистра как объекта конфигурации (рис. 3.11). Благодаря использованию данного свойства облегчается работа разработчика, которому необходимо сформировать или модифицировать набор (наборы) записей регистра (регистров), подчиненных данному документу (рис. 3.12). Важно понимать, что платформа во многих механизмах использует обращение к элементам коллекции Движения. Например, при удалении документа система будет для каждого регистра, в котором он может быть регистратором, проверять наличие движений документа с целью их удаления. Поэтому не рекомендуется включать в коллекцию Движения элементы «с запасом». И наоборот, если не указано, что документ может быть регистратором для некоего регистра, то система никоим образом не позволит записать в данный регистр движения данного документа.
Глава 3. Реализация задач учета движения средств 267 Рис. 3.11. Документы, которые могут создавать движения в регистре База данных ДокументОбъект.<Имя> Рис. 3.12. Свойство «Движения» объекта документа Т аблица документа Ссылка Номер Дата — Т аблица движений регистра N Регистратор -►
268 Реализация прикладных задач в системе «^Предприятие 8.2» Формирование наборов записей посредством свойства объекта документа «Движения» Формирование новых наборов записе 4 включает в себя операции, состо- ящие' из добавления новых записей к набору записей; заполнения полей записей; записи набора записе!.. Например, требуется сформировать движения по регистру ТоварыНаСкладах на основании данных документа ПоступлениеТоваров. Причем информация для заполнения полей записей движении в основном находится в табличной части Состав документа. Данная операция может быть выполнена так, как показано в листинге 3.3. Листинг 3.3. Пример формирования движений документа II Укажем. что движения по данному регистру нужно записывать Движения.ТоварыНаСкладах.Запись’вать = Истина; II Перебрать коллекцию строк табличной части документа Для Каждого ТекСтрокаСостав Из Состав Цикл II Добавить новую запись к набору записей регистра ТоварыНаСкладах Движение = Движения.ТовэрыНаСкладах.Добавить(); // Заполнить поля добавленной записи Движение.ВидДвижения = ВидДвиженияНакопгения.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСостав.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрсхаСостав.Количество; Движение.ВидОперации = ЕидОперации; КонецЦикла; Краткий комментарий: сначала указываются наборы записей, содер- жащие движения документа по регистрам, которые должны быть записаны при проведении документ а. Формирование новых записей движений и их заполнение выполняются в цикле перебора строк табличной части документа. Для каждой строки добавляется новая запись к набору записей регистра ТоварыНаСкладах, полученному как элемент коллекции свойства Движения данного объекта документа. Поскольку метод Добавить () возвращает сам добавленный объект, новая запись получается в переменную Движение. Дальнейшее запол- нение полей записи осуществляется посредством этой переменно] .
Глава 3. Реализация задач учета движения средств 269 После выхода из обработки проведения те наборы записей, у которых свойство Записывать имеет значение Истина, будут автоматически запи- саны платформой. После этого свойство Записывать у этих наборов движений будет установлено в значение Ложь. Следует учитывать, что при автоматической записи движений они будут запи- саны с замещением, то есть старые движения документа будут замещены новыми. Если же при записи движений документа нужно добавлять новые движения к старым, то для этого нужно использовать параметр Замещать метода Записать () набора записей регистра накопления и явно записывать набор записей с параметром Замещать, установленным в значение Ложь. Параметр Замещать может принимать значения типа Булево, по умолча- нию - значение Истина. Действие данного параметра проявляется в случае, если на момент записи нового (или модифицированного) набора записей в регистре присутствуют еще записи, подчиненные данному же регистратору. Например, в регистре ТоварыНаСкладах присутствует набор записей, подчи- ненный регистратору ПоступлениеТоваров № 1 (табл. 3.6). Таблица 3.6. Состав записей регистра накопления Период Регистратор Номер строки Вид движения Активность Номенклатура Склад Количество 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 1 Приход Истина Пульт VH Главный 10 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 2 Приход Истина Пульт PW Главный 7 Записывается новый набор записей (табл. 3.7). Таблица 3.7. Записываемый набор записей Период Регистратор Номерстроки Вид движения Активность Номенклатура Склад Количество 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 Приход Истина Пульт VH Главный 10 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 Приход Истина Пульт PW Главный 7 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 Приход Истина Шнур R-100 Главный 100
270 Реализация прикладных задач в системе «1С:Предприятие 8.2» Тогда если при записи набора записей для параметра Замещать будет указано значение Ложь (листинг 3.4), то записи, существовавшие в регистре накопления, будут сохранены, и к ним будут добавлены новые записи из запи- сываемого набора (табл. 3.8). Листинг 3.4. Запись набора записей с добавлением Движения.ТоварыНаСкладах Записать(Ложь), Таблица 3.8. Состав записей регистра накопления Период Регистратор Номер строки Вид движения Активность Номенклатура Склад Количество 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 1 Приход Истина Пульт VH Главный 10 13.05.2010 15:00:01 Поступление Товаров № 1 13.05.2010 15:00:01 2 .. Приход Истина ПуЛоТ PW Главный 7 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 3 Приход Истина Пульт VH Главный 10 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 4 Приход Истина Пульт PW Главный 7 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 5 Приход Истина Шнур R-100 Г лавный 100 Если же запись набора записей будет выполняться с замещением (листинг 3.5), то старый набор записей будет замещен, и после выполнения операции регистр будет содержать записи, показанные в табл. 3.9. Листинг 3.5. Запись набора записей с замещением Движения ТоьарыНаСкпадах.Запмса! ь(Истина); II Альтернативный вариант вызова Движения.ТоварыНаСкладах.Записать(); Данная возможность позволяет решать различные прикладные задачи, связанные: с добавлением новых движений к старым; замещением старых движений новыми. Хотелось бы отметить, что все вышеописанные действия по формированию движении типизированы, и большая часть кода посвяшена заполнению полей регистра значениями полей документа. Поэтому для облегчения напи-
Глава 3. Реализация задач учета движения средств сания соответствующего кода разработчик может использовать конструктор движений документа (рис. 3.13). Таблица 3.9. Состав записей регистра накопления Период Регистратор Номер строки Вид движения Активность Номенклатура Склад Количество 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 1 Приход Истина Пульт VH Главный 10 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 2 Приход Истина Пульт PW Главный 7 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 3 Приход Истина Шнур R-100 Главный 100 . , , . ' , .. , I . . . «яийллинж . га ь aimmUBfaii . . „виягиип /л 4 Конструктор движения регистров I X ♦ ♦ — Регистры PerncrpHai опления ТоварыНаСкладах Т ип движения регистра: С*1 П риход О Расход ' Реквизиты документа Лата " Номер “ Контрагент ““ Склад “ ВидОперации ТекСтрокаСостав.НомерСтроки ТекСтрокаСостав.Номенклатура «5J Т екСтрокаСостав. Количество *“) ТекСтрокаСостав.Цена 11^] Т екСтрокаСостав. Сумма Состав полей документа I ; I Далее> Заполнить выражения | Т абличная часть: ! Состав [ Поле Нсгжгнкл. rfypA ► Выражение Очистить выражения Склад Т екСтрокаСостав. Количество ВидОперации Склад Количество ВидОперации Поставщик ''Заполнение I полей записей, f регистра ] < w-дами-вд taum ОК Отмена Справка < i Рис. 3.13. Конструктор движений документа Программное изменение данных регистра можно использовать при прове- дении документа, а можно и без проведения. Поскольку заполнение учетных данных чаще всего выполняется во время операции проведения документа, то конструктор движений документа создает соответствующий код именно в рамках процедуры обработчика события ОбработкаПроведения.
Реализация прикладных задач в системе «ЮПредприятие 8.2» Формирование движений при проведении документа Проведение документов чаще всего используется для формирования движений документов. Этому способствует удобство функциональных решений, зало- женных в платформу. Например: С точки зрения платформы отдельного процесса «проведение» не существует. Есть запись документа с проведением, причем в рамках одной транзакции. Подробно это описано в разделе «Запись документов» на стр. 169. Таким образом, в момент выполнения обработчика события Обра- боткаПроведения документ уже записан. То есть разработчику не нужно беспокоиться о предотвращении попыток проведения незапи - санных документов фис. 3.14). Рис. 3.14. Последовательность событий при записи документа с проведением Свойство Удаление движений документа как объекта конфигурации стандартно устанавливается платформой в значение Удалять автома- тически при отмене проведения. Это значит, что при перепроведении документа движения, подчиненные данному документу, перезаписываются, а пои отмене проведения движения документа автоматически удаляются. Если разработчик захочет реализовать нестандартный вариант прове- дения документа и установит свойство Удаление движений в значение Удалять автоматически, то при записи документа с проведением сначала будут удалены все старые движения документа. То есть на момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа. При записи с проведением система автоматически запишет выбранные и незаписанные наборы записей, находящиеся в свойстве Движения. Это еще один «сервис», обеспечиваемый свойством Движения. Отсюда следуют два важных вывода. Во-первых, если наборы записе 1 необходимо записывать с добавлением, то это нужно выполнять в явном виде, т. к. при автоматической записи движений они будут записаны с замещением.
Глава 3. Реализация задач учета движения средств 273 Во-вторых, последовательность обращения к регистрам при автома- тической записи движений будет одна и та же для разных документов. Это позволяет снизить вероятность взаимных блокировок при проведении документа в конкурентных режимах работы. В случаях, если необходимо программно вызвать саму обработку проведения, инициируется запись документа с проведением. Пример программного вызова проведения документа в оперативном режиме приведен в листинге 3.6. Листинг 3.6. Пример программного вызова проведения документа т чиами ыи в i, 1 ub-uumiBmimimhi lUafni «..%• igighuenMi «т ... " ш м шмынли •MiiiniiW'itHBo »1кимм ьтм rutr'o.di /цм^чов^ч или на1'ил L *< ... Hi e, «.«// пл ' tub unt intiBn Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДсжумента.Оперативныи); рта В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в обработке ДействияСДвижениямиРегистраНакопления приводится пример перепроведения документов РеализацияТоваров в интервале с ДатаНачала по ДатаОкончания (листинг 3.7). Листинг 3.7. Пример перепроведения документов «РеализацияТоваров» t. ЧяВПНЛт ИнВШтЛ ЫММЯЮШЛгЫШЛ 1п№Ь ЩрА №№№>. fUM, Hof! НМММЯЫ. II Получить ссылки на проведенные документы в требуемом интервале Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РеализацияТоваров.Ссылка ИЗ Документ.РеализацияТоваров КАК РеализацияТоваров ГДЕ РеализацияТоваров.Дата МЕЖДУ ВДатаНачала И &ДатаОкончания И РеализацияТоваров.Проведен"; Запрос.УстановитьПараметрСДатаНачала”, ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Результат = Запрос.Выполнить(); // Перебрать ссылки полученных документов Выборка = Результат.Выбрать(); Пока Выборка.Следующий) Цикл II Перепровести каждый документ неоперативно Документ = Выборка.Ссылка.ПолучитьОбъект(); Документ.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла; Здесь инициировалось проведение в неоперативном режиме. Значение по умолчанию параметра РежимПроведения метода объекта документа Записать() - именно РежимПроведенияДокумента. Неоперативный. Говоря о записи документа, необходимо отдельно упомянуть случай, когда документ записывается с проведением в форме самого документа.
274 Реализация прикладных задач в системе «ЮПредприятие 8.2» Запись в форме позволяет использовать функциональность, определяемую расширением формы документа: установка даты документа, установка режима проведения, запрет определенных действий пользователя и т.д. Подробно эти действия рассматриваются в разделе «Особенности работы формы документа» на стр. 195. В качестве примера записи в форме в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в форме документа Реализациятоваров в коман- дную панель формы добавлена кнопка Провести неоперативно. Действие, выполняемые по нажатию этой кнопки, представлены в листингах 3.8, 3.9. Листинг 3.8. Обработчик события нажатия кнопки «Провести неоперативно» &НаКлиенте Процедура ПровестиНеоперативно(Команда) ПровестиНеоперативноНаСервере(): КонецПроцедуры Листинг 3.9. Пример записи документа с неоперативным проведением в форме &НаСервере Процедура ПровестиНеоперативноНаСервере(); /7 Установить использование режима неоперативного проведения ИспользоватьРежимПроведения = ИспользованиеРежимаПроведения.Неоперативный; II Выполнить проведение в форме Записат^НовыйСтруктураС'РежимЗаписи", РежимЗаписиДокумента.Проведение)); КонецПроцедуры В данном примере используется свойство ИспользоватьРежимПрове- дения и метод Записать () расширения формы документа. Формирование движений в объекте документа, но без проведения документа С прикладной точки зрения часто возникает потребность сформировать движения для документов, чья обработка еще полностью не завершена, и завершена будет, возможно, не в этом сеансе работы с программой, а через некоторое время. Поэтому платформа «ЮПредприятие» позволяет в способе формирования движений не ограничиваться только проведением документа.
Глава 3. Реализация задач учета движения средств Однако нужно помнить, что кроме выполнения самих движений при форми- ровании движений вне процедуры, обрабатывающей проведение документа, необходимо: контролировать, чтобы документ был сохранен на момент записи движений в регистр (записи должны содержать ссылку на регистратор); решать, что делать со старыми движениями документа; явно записывать сформированные наборы записей движений. Пример формирования движений без проведения документа приведен в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. В командной панели формы документа ПоступлениеТоваров создано подменю Действия с движениями. В нем находится команда Формирование движений. Обработчик действия данной команды (листинг 3.11, 3.12) передает управление проце- дуре ФормированиеДвиженийБезПроведения() модуля объекта документа (листинг 3.10). Листинг 3.10. Пример формирования движений документа без проведения Процедура ФормированиеДьиженийБезПроведенияО Экспорт II Проверить и записать документ, если ранее не записан Если ЭтоНовый() Тогда Записать(); КонецЕсли; Для Каждого ТекСтрокаСостав Из Состав Цикл II Сформировать и заполнить запись движения Движение = Движения.ТоварыНаСкпадах.Добавить() Движение.Вид Движения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатуоа = ТекСтрокаСостав. Номенклатура; Движение.Склад = Склад: Движение.Количествс - ТекСтрокаСостав.Количество; Движение.ВидОперации = ВидОперации; КонецЦикла; II Записать движения регистров с замещением старых наборов записей - Движения.ТоварыНаСкладах.Зап!1сать(); КонецПроцедуры Краткий комментарий: сначала необходимо убедиться, что ссылка на данный документ уже есть в базе данных, то есть документ не новый. Если нет, доку- мент записывается, поскольку без ссылки на регистратор движения в регистре накопления сформированы быть не могут. Затем формируется новый набор записей в цикле перебора строк табличной части Состав документа. Далее сформированный набор записей записывается в регистр.
276 Реализация прикладных задач в системе «^Предприятие 8.2» Также следует обратить внимание на то, что в заголовке процедуры, выпол- няющей эти действия, указано ключевое слово Экспорт. В результате данная процедура доступна в контексте объекта документа. Вызов даннот процедуры в демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, выполняется из модуля формы данного документа. Основным реквизитом формы доку мента как раз и является объект документа, поэтому процедура будет досту пна в контексте формы документа. Но для того, чтобы вызвать процедуру объекта документа, нужно сначала конвертировать основной реквизит формы Объект в этот объект (листинг 3.12, 3.13). Листинг 3.11. Обработчик действия команды «ФормированиеДвижений» &НаКлиенте Процедура ФормированиеДвижений(Команда) ФормированиеДвиженииДокумента(); КонецПроцедуры Листинг 3.12. Пример вызова процедуры из формы документа &НаСервере Процедура ФормированиеДвиженийДокумента() Документ = РеквизитФормыВЗначениеС’Объект”); Документ.ФормированиеДвиженийБезПроведения(); КонецПроцедуры В принципе вызов этой процедуры может быть реализован почти из любого модуля программы. Для этого нужно лишь получить объект документа (например, из ссылки на документ), листинг 3.13. Листинг 3.13. Пример вызова процедуры из модуля обработки II Получить объект документа Документ = СсылкаНаДокумент.ПолучитьОбъектО; II Вызвать процедуру модуля объекта документа, формирующую движения Документ ФормированиеДвиженийБезПроведения/); Модификация существующих движений документа Кроме задачи формирования новых движений без проведения документа разработчикам иногда приходится решать задачи изменения информации в движениях (модификации движений), снятия активности движений доку- мента или вообще удаления движений. Технология их решения абсолютно та же. Это запись наборов записей регистра Только соответствующим образом модифицированных.
Глава 3. Реализация задач учета движения средств 277’ Для модификации движений можно сначала прочитать набор записей движений, далее модифицировать записи и записать уже модифицированный набор записей движений. Обратите внимание: элемент коллекции свойства документа Движения представляет собой набор записей регистра. Но он, пока не прочитан, пуст (рис. 3.15). Рис. 3.15. Коллекция «Движения» содержит пустые наборы записей Поэтому, для того чтобы модифицировать записи регистра, необходимо сначала прочитать данные наборы записей (рис. 3.16). Рис. 3.16. Чтение набора записей
278 Реализация прикладных задач в системе «1С:Предприятие 8.2» В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в форме доку- мента ПоступлениеТоваров приведен пример заполнения поля реквизита Поставщик регистра ТоварыНаСкладах значением из константы ОсновнойПос- тавщик (листинг 3.14). Листинг 3.14. Пример модификации движений документа // Получи гь значение основного поставщика ОсноинойПоставщик = Константь'.ОсновнойПоставщик.Получить(); // Прочитать набор записей движений по регистру "ТоварыНаСкладах" Документ = РекЕизитФормыВЗначеаие("Объект‘'); НаборЗаписей = Документ.Движения.ТоварыНаСкладах; НаборЗаписей.Прочитать(); II Модифицировать каждую запись в прочитанных движениях Если НаборЗаписей. Когичество()<> 0 Тогда Для Каждого Движение Из НаборЗаписей Цикл Движение Поставщик = ОсковнойПоставщик; КонецЦикга; // Записать измененный набор записей НабирЗаписей.ЗаписатьО; КонецЕсли; Снятие активности движений - по сути дела та же задача модификации движений документа. Только в отношении поля Активность и может выпол- няться аналогично. Однако с прикладной точки зрения свойство записи движения Активность особое. Во-первых, наличие активных движений документа в регистре означает, что данный документ отражен в неком аспекте учета. Вернее, в учете отражено событие, зафиксированное данным документом. Во-вторых, наличие движений документа со снятой активностью означает, что движения данного документа не используются в учетном механизме. В-третьих, наличие движений документа в регистре, из которых часть активна, а часть неактивна, с точки зрения практического применения нонсенс. Например, попробуйте представить себе ситуацию: «Отгружено пять пылесосов и холодильник, но не совсем. Холодильник не отгружен». Поэтому плат форма не допускает записи набора записей движений регистра, если часть записей в этом наборе активна, а часть - нет (рис. 3.17).
Глава 3. Реализация задач учета движения средств 279 Объект манипулирования данными документа Набор записей регистра N, подчиненный данному документу Активность ИСТИНА ИСТИНА ИСТИНА База данных Т аблица движений регистра N Набор записей регистра N, подчиненный данному документу Активность ИСТИНА ЛОЖЬ ИСТИНА Т аблица движений регистра N Регистратор Т аблица движений регистра N Набор записей регистра N, подчиненный данному документу Активность ЛОЖЬ ложь ложь * Регистратор Рис. 3.17. Варианты использования свойства «Активность» В системе предусмотрена возможность установки и снятия активности целиком для всего набора записей посредством метода УстановитьАктив- ность () набора записей регистра накопления. В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в форме доку- мента ПоступлениеТоваров приводится пример снятия активности всех движений документа по регистрам (листинг 3.15). Листинг 3.15. Пример снятия активности записей ч :<\• "й..- •* 4 * * * * * * II . v. уйинмм.; .<№. , .-.йй, -.ш, •> Документ = РеквизитФормыВЗначение("Объект"); II Перебрать наборы записей по регистрам Для Каждого НаборЗаписей Из Документ.Движения Цикл I! Прочитать движения по регистру НаборЗаписей.Прочитать(); II Снять активность НаборЗаписей.УстановитьАктивность(Ложь); II Записать набор записей Набор3аписей.3аписать(); КонецЦикла;
280 Реализация прикладных задач в системе «ЮПредприятие 8.2» И, наконец, операция удаления движений документа. Она сводится к записи пустого набора записей регистра. В ситуации, когда набор записей регистра прочитан и не пуст, можно использовать его предварительную очистку. В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в форме документа ПоступлениеТоваров при выполнении действия Очис- титьДвиженияДокумента выполняется процедура с текстом, который пред- ставлен в листинге 3.16. Листинг 3.16. Пример удаления движений документа Документ = РеквизитФормыВЗначение("Объекти); // Перебрать наборы записей по регистрам Для Каждого НаборЗаписей Из Документ.Движения Цикл II Очистить набор записей движений по регистру НаборЗаписей.ОчиститЦ); II Записать набор записей НаборЗаписей.Записа гь(); КонецЦикла; Однако если бы была полная уверенность, что ни один из наборов записей регистров для данного объекта документа на момент выполнения проце- дуры не прочитан, то предварительную очистку можно было бы не делать (листинг 3.17). Листинг 3.17. Пример удаления движений документа Документ = РеквизитФормыВЗначение(нОбъект"); II Перебрать наборы записей по регистрам Для Каждого НаборЗаписей Из Документ.Движения Цикт > h Записать набор записей Набор3аписей.3аписать(); КонецЦикла Интерактивное формирование наборов записей с помощью свойства «Движения» объекта документа Описанный выше функционал системы касался наиболее часто встре- чающихся решений задач формирования движений документов. То есть пользователь отвечает за правильность ввода информации в документ, а разработчик - за правильность работы обработок, интерпретирующих
Глава 3. Реализация задач учета движения средств и записывающих в регистры учетную информацию, полученную согласно данным документов. Однако иногда могут встречаться ситуации, когда не требуется никакой допол- нительной обработки для вводимой пользователем информации. То есть тогда можно обеспечить ввод информации напрямую в данные регистра, без проме- жуточной регистрации ее в данных документа. Для регистров накопления в любой ситуации возможно содержание инфор- мации только с использованием документа-регистратора. Поэтому в таких случаях для обеспечения требования обоснованности данных регистра наличием регистратора и желания уменьшить избыточность хранения инфор- мации в базе данных возможно применение технологии, условно называемой «ручная операция». В форме документа отображаются данные и документа, и движений регистра, которые починены данному документу (рис. 3.18). Рис. 3.18. Редактирование движений вручную В состав демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, входит документ РучнаяОперация. Его создание и технологические вопросы, возни- кающие при его использовании, подробно описаны в разделе «Специальные случаи использования документов. Ручная операция» на стр. 214. Хотелось бы только еще раз подчеркнуть, что для облегчения работы разра- ботчика здесь использовалось свойство Движения объекта документа. И таблица в форме документа отображает данные одного из элементов этой коллекции - набора записей движений по регистру ТоварыНаСкладах.
282 Реализация прикладных задач в системе «ЮПредприятие 8.2» Пользователь, работая с формой документа, на самом деле интерактивно модифицирует считанные данные набора записей движений регистра, подчи- ненных данному документу (рис. 3.19). Запись данных, отображаемых таблицей формы в регистр t . Ручная операции 000000001 от 20 04 2prt)12:0t 00-хранение инф,,. (ЮПредприятие; м М* М Is Номер: 000000001 Все действия Ручная операция ООО... Перейти______________ Т овары на складах Все действия - ? Дата 20.04,2010 1 2 00 00 ^{Добавить 2» X и1 Ручная операция!000000061 от 20.04.2010 12:00:00 ----X-------- * Записать и закрыть |fjj Рис. 3.19. Форма документа «РучнаяОперация» N Период П Вод движения Номенклатура Склад 20.04.201012:00:00 I' ЭГХОД 1 С:Бухгалтерия 7 7 Базовая версия Г лавный 2 20.04.201012:00:00 При» д 1 С:Бухгалтерия 7.7 Стандартная версия Фили-2 ,'П ► А вопросы отображения данных регистра в таблице формы, записи моди- фицированных данных из реквизита формы в таблицу движений регистра и т. д. берет на себя платформа посредством возможностей, предоставляемых расширением формы документа. Причем системой отрабатывается большинство ситуаций, которые могут привести к коллизиям. Например, если пользователь после внесения изме- нений в содержимое таблицы формы, но до записи модифицированных данных в регистр нажмет кнопку Перечитать ® (или выполнит команду формы Все действия ► Перечитать), то он получит предупреждение (рис. 3.20). Рис. 3.20. Предупреждение при перечитывании данных Если перечитать данные до записи модифицированных данных в регистр (ответ - Да), то последние изменения будут потеряны.
Глава 3. Реализация задач учета движения средств 283 Запись набора записей регистра без использования свойства «Движения» В разделе «Свойство «Движения» объекта документа» на стр 266 были описаны действия с объектом документа, приводящие к чтению, моди- фикации, добавлению и записи наборов записей в регистр. Те же самые результаты можно получить и без использования объекта документа, работая непосредственно с набором записей (рис. 3.21). В данном случае для модификации движений документа не используется объект документа (используется только ссылка на документ). Поэтому при выполнении обработок массового формирования или модификации движений, связанных не с единичными документами, а с большими массивами доку- ментов, уместнее применение приемов работы, основанных на использовании набора записей регистра, т. к. этот способ является менее ресурсоемким. Например, в состав конфигурации уже заполненной базы данных ввели новый оборотный регистр Продажи со следующей структурой (рис. 3.22). 1ажи - й И - Ц Измерения Г. Номенклатура Г. Контрагент J Ресурсы J. Количество J Сумма - =“ Реквизиты и ВццОперации Рис. 3.22. Структура регистра «Продажи»
284 Реализация прикладных задач в системе «1С:Предприятие 8.2» Он должен заполняться при проведении документа РеализацияТоваров данными документа (включая данные его табличной части Состав), поэтому в обработку проведения данного объекта конфигурации были внесены соответствующие изменения. Однако существует уже достаточно много документов РеализацияТоваров, оформленных и проведенных еще в то время, когда нового регистра нс было. Как для них сформировать движения по новому регистру? Можно, конечно, перепровести все ранее проведенные документы Реализа- цияТоваров. Однако при проведении документа не только выполняются движения по новому регистру. Формируются движения по другим регистрам, записываются данные в таблицу документа, в таблицы журналов документов и т.д. Поэтому данное решение может оказаться неудобным в отношении скорости исполнения или по другим причинам. В данной ситуации более эффективным выглядит применение следующей обработки. Из базы данных запросом выбрать ссылки на проведенные документы РеализацияТоваров и другие данные этих документов, необ- ходимые для формирования движений. Эти данные можно получить из таблицы документа. Перебирая выборку результата запроса, применять отбор по регистраторам (ссылкам на документы) для формирования наборов записей движений, подчиненных этим документам (листинг 3.18). Листинг 3.18. Пример формирования движений документов Процедура ФормированиеДвиженийПоПродажамДляВсехРеализацияТоваров() II Обратиться к набору записей регистра НаборЗаписейРегистра = РегистрыНакопления.Продажи Создь г ьНаборЗаписей(); II Прочитать из базы данных данные, необходимые для формирования движений Запрос = Новый Запрос; Запрос Текст = "ВЫБРАТЬ РеализацияТоварс тСостав.Ссылка КАК Ссылка, РеализацияТоваровСостав.Ссылка.Дата, Реализация I озаровСостав.Ссылка. Контрагент, РеализацияТоваровСостав.Ссылка.ВидОперации, РеализацияТоваровСостав.Номенклатура, Реализаци$ТоваровСостав.Количество, РеаллзацияТоваровСостав.Сумма ИЗ Документ.РеализацияТоваров.Состав КАК РеализацияТоваровСостав ГДЕ РеализацияТоваровСостав.Ссылка.Проведен ИТОГИ ПО Ссылка"; Результат = Запрос, Выполнить();
Глава 3. Реализация задач учета движения средств 285 олмджа .-да-. ... ...--. II Перебрать все документы из результата запроса ВыборкаДокументов = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаДокументов.Следующий() Цикл II Установить отбор набора записей по регистратору, к которому будут приписаны движения НаборЗазисейРегистра.Отбор.Регистратор.Установить(ВыборкаДокументов.Ссылка); II Перебрать данные о составе документа, необходимые для заполнения формируемых движений ВыборкаДетальныхЗаписей = ВыборкаДокументов.Выбрать{); Пока ВыборкаДетальныхЗаписей.Следую1дий() Цикл II Сформировать движения по регистру Продажи НоваяЗапись = НаборЗаписейРегистра.Добавить(); НоваяЗапись.Период = ВыборкаДетальныхЗаписей.Дата; НоваяЗапись.Номенклатура = ВыборкаДетальныхЗаписей.Номенклатура; НоваяЗапись.Количество = ВыборкаДетальныхЗаписей.Количество; НоваяЗапись.Сумма = ВыборкаДетальныхЗаписей.Сумма; НоваяЗапись.Контрагент = ВыборкаДокументов.Контрагент; НоваяЗапись.ВидОперации = ВыборкаДокументов.ВидОперации; КонецЦикла; II Записать сформированные для очередного документа движения fHa6op3anncenPerncTpa.3anncaTb(); II Очистить набор записей регистра II перед использованием для следующего документа НаборЗаписейРегистра.Очистить(); КонецЦикла; ; КонецПроцедуры Данный пример приведен в составе обработки ДействияСДвижениямиРегист- раНакопления демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске. Еще раз хотелось бы подчеркнуть, что данная обработка вообще не обра- щается к объектам документов. По сути, движения «приписываются» к документам «без ведома объектов документов». Подобным же образом можно решать не только задачи формирования новых движений документов, но и модификации существующих движений. Примеры чтения движений регистров накопления будут приведены ниже, в разделе «Получение движений регистров накопления» на стр. 300. Частным случаем операций модификации наборов записей регистров накоп- ления является удаление движений. Удалить движения регистра Продажи в пределах заданного временного интервала можно следующим образом (листинг 3.19).
286 Реализация прикладных задач в системе «ЮПредприятие 8.2» Листинг 3.19. Пример удаления движений документа &НаСервереБезКонтекста Процедура \ дали ьДвиженияПоПродажамЗаПеоиод(ДатаНачаля ДатаОкончания) II Обратиться к набору записей регистра НаборЗаписейРегистра = РегистрыНгкопления. Продажи СоздатьНабсрЗаписей(); II Получить из базы данных ссылки на документы, у которых нужно удалить движения Запрос = Новый Запрос; Запоос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Продажи. Регистратор ИЗ РегистрНакопления.Прлдажи КАК Продажи ГДЕ Продажи.Период МЕЖДУ ВДатаНачала И ВДатаОкончания"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос Ус гановитьПараметр(”ДатаОкончания", ДатаОкончания;; Результат = Запрос.Выполнить(); II Перебрать все документы из результата запроса Выборка = Результат.Выбрать(). Пока Выборка.Следующий() Цикл II Установить отбор набора записей по регистратору, к которому будут приписаны движения НаборЗаписеиРегистра.Отбор.Регистратор.Установить(Выборка.Регистратор); II Записать пустой набор записей движений для очередного документа НаборЗаписейРегистра.Записать(); КонецЦикпа; КонецПроцедуры В данном примере использовался следующий прием: набор записей регистра, не прочитанный из базы, пуст. Если записать пустой набор записей регистра с замещением, это приведет к удалению движении замещаемого в рамках отбора набора записей. В заключение хотелось бы только еще раз подчеркнуть - для регистров накопления все действия с модификацией наборов записей регистра можно выполнять только в рамках отбора по регистратору, то есть документу, кото- рому подчинен этот набор записей.
Глава 3. Реализация задач учета движения средств 287 Интерактивное формирование движений с помощью формы набора записей Выше, в разделе «Интерактивное формирование наборов записей с помощью свойства «Движения» объекта документа» на стр. 266, рассматривался пример, когда в рамках формы документа пользователю предоставлялись возможности интерактивного формирования/модификации движений документа. Если пользователю необходимо предоставить те же интерактивные возмож- ности, но без использования формы документа, задача может быть решена посредством использования формы набора записей. В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, в форме списка документа РучнаяОперация приведен подобный пример. В состав регистра ТоварыНаСкладах включена форма ФормаНабораЗаписей, основной реквизит которой имеет тип РегистрНакопленияНаборЗаписей.Това- рыНаСкладах. Вызов данной формы может осуществляться любой обработкой или командой. Единственное, для возможности выполнения действий по модификации наборов записей регистра накопления необходимо помнить об обязатель- ности установки отбора по регистратору. В демонстрационной конфигурации «Хранение информации и учет движения средств», которая находится на прилагаемом компакт-диске, вызов формы набора записей регистра ТоварыНаСкладах реализуется из формы списка документа РучнаяОперация (рис. 3.23). Ручные операции ^Создать & ,х| М СХНайти. Ч; Дополнительно Все действи: г?; Дата 20.04.201012:00:00 , 11.05.2010 0:00:00 > 20.05.2010 2С-4&31 Номер 000000001 000000002 0000000113 Открыть Форму на зора записей Рис. 3.23. Форма списка документа «РучнаяОперация» Обработчик команды ОткрытьФормуНабораЗаписей реализован следующим образом (листинг 3.20). С ' А ▼
Реализация прикладных задач в системе «1С:Предприятие 8.2» Листинг 3.20. Пример использования формы набора записей &НаКлиенте Процедура ОткрытьФормуНабораЗаписей(Команда) // Получить ссылку на текущий документ ТекушийДокумент = Элементы.Список.ТекущаяСтрока: // Открыть форму набора записей с отбором по регистратору ЗначениеОтбора = Новый Структура("Регистраторч, ТекущийДокумент); ПараметрыФормы = Новый Структура(”Отбор”, ЗначениеОтбора); ОткрытьФормуСРеглстрНакопления.ТоварыНаСкладах.Форма.ФормаНабораЗаписей”, ПараметрыФормы) КонецПроцедуры г Кратки т комментарии: сначала создается структура отбора ЗначениеОт- бора с ключом Регистратор, содержащим ссылку на текущий документ (Элементы.Список.ТекущаяСтрока), и добавляется в структуру пара- метров формы ПараметрыФормы. Эти параметры передаются в форму набора записей ФормаНабораЗаписей, и эта форма открывается с отбором по полю Регистратор регистра накопления ТоварыНаСкладах. В форме набора записей пользователь может интерактивно модифици- ровать как сам набор записей (удалять, добавлять, копировать и т.д.), так и содержимое полей записей, входящих в набор записей. Впоследствии модифицированный набор может быть сохранен, то есть записан в регистр «рис. 3.24). Запись данных, отображаемых таблицей формы в регистр «в*, Торёры на складах-Хранение информации и учет движени... (1 (^Предприятие) .4J* М M+М* * - □ X Товарцийс? складах ------------------- < j 1 Записать и загрьлгг. ей ♦>! кл Все действия’ 1 ?J ^Добавить & X < V В се действия ; N Регистратор Активность (Период Вид движения Номенклатура Склад Щ Ручная операция 000001 )0, iy1 20.05.2010 20:46... Расход 1 С.Бухгалтирия 7 7 Б а _>ова.. Склад отдела прода 2 Ручная операция 0000000.. ** 20.05.2010 20:46... П риход 1 С: Б ухгалтерия 7.7 Станда... Фили-2 « > Рис. 3.24. Форма набора записей регистра Обеспечение выполнения этих действии и устранение возможных коллизий реализуются средствами расширения формы набора записей регистра.
Глава 3. Реализация задач учета движения средств Механизмы заполнения таблицы итогов регистра накопления Таблицы итогов регистров накопления заполняются автоматически вследствие добавления, удаления или модификации наборов записей в таблице движений регистра, если для этого регистра не отключен режим расчета итогов. Расчет итогов производится согласно записям таблицы движений регистра, если свойство Активность этих записей имеет значение Истина. Но для разных видов регистров накопления заполнение данных таблицы итогов выполняется по разным правилам. Это объясняется спецификой пока- зателей, учитываемых посредством регистров. Подробно данная специфика была описана ранее, в разделе «Оперативный учет. Описание задач, реша- емых регистрами накопления» на стр. 249. Механизм заполнения таблицы итогов регистра накопления остатков В таблице итогов регистра остатков хранятся текущие итоги и могут храниться итоги рассчитанных периодов. Текущие (актуальные) итоги - это итоговые значения учитываемых в регистре ресурсов (показателей) на момент времени заведомо больший, нежели любое значение поля Период записей таблицы движений. Для определенности текущие итоги регистров остатков датированы на 01.11.3999 00:00:00. Итоги рассчитанных периодов содержат данные конечных значений ресурсов для каждого месяца, предшествующего границе рассчитанных итогов. При записи набора активных записей в таблице движений всегда рассчиты- ваются и перезаписываются текущие итоги в таблице итогов, если у регистра установлен признак использования итогов. Данные итогов периодов в таблице итогов появляются вследствие расчета итогов. Такой расчет может быть инициирован посредством системной команды Управление итогами. Для этого нужно вызвать стандартную функцию Управление итогами (Все функции ► Стандартные) и переключить ее в режим Полные возможности (рис. 3.25). Период для подсчета итогов - всегда месяц. Чтобы установить границу рассчитанных итогов сразу для всех регистров накопления остатков, можно переключить обработку в режим Часто используемые возможности и выпол- нить команду Установить период рассчитанных итогов. Также расчет итогов может быть выполнен программно (листинг 3.21).
290 Реализация прикладных задач в системе «1С:Предприятие 8.2» Рис. 3.25. Стандартная обработка «Управление итогами» Листинг 3.21. Программный расчет итогов регистра РегистрыНакопления ГоварыНаСкладах.УстанопитьПериодРассчитанныхИтогов(Дата(2010,05.31)); Например, пусть таблица движении регистра накопления будет заполнена данными, как показано в табл. 3.10. Таблица 3.10. Таблица движений регистра накопления остатков Период Регистратор Номер строки Вид движения Активность Номенклатура Склад Количество Сумма 03.04.20 Ю 15:00:00 ПоступлениеТоваров № 1 13.05.2010 15:00:00 1 Приход Истина Пульт VH Главный 1 10 13.05.2010 15:00:01 Поступление .оваров № 2 13.05.2010 15:00:01 1 Приход Истина Пульт VH Главный 9 90 13.05.2010 15:00:01 ПоступлениеТоваров № 2 13.05.2010 15:00:01 2 Приход Истина Пульт PW Главный 7 490 23.05.2010 15:30:45 ПоступлениеТоваров № 3 23.05.2010 15:30:45 1 Приход Ложь Пульт VH Фили-2 5 60 27.05.2010 12:30:45 Реализация №1 27.05.2010 12:30:45 1 Расход Истина Пулы VH Главный 8 80 31.05.2010 23:59:59 ПоступлениеТоваров № 4 31.05.2010 23:59:59 1 Приход Истина Пульт PW Фили-2 1 17 01.09.2010 00:00:00 ПоступлениеТоваров № 5 01.09.2010 00:00:00 1 Приход Истина Пульт VH Фили-2 1 18
& 291 Глава 3. Реализация задач учета движения средств Для вышеприведенного примера заполнения таблицы движений регистра таблица итогов регистра после расчета итогов по 31.05.2010 будет выглядеть так, как показано в табл. 3.11. Таблица 3.11. Таблица итогов регистра накопления остатков Период Номенклатура Склад Количество Сумма Итоги апреля 2010 года 01.05.2010 00:00:00 Пульт VH Главный 1 10 Итоги мая 2010 года (граница рассчитанных итогов) 01.06.2010 00:00:00 Пульт VH Главный 2 20 01.06.2010 00:00:00 Пульт PW Главный 7 490 01.06.2010 00:00:00 Пульт PW Фили-2 1 17 Текущие итоги 01.11.3999 00:00:00 Пульт VH Фили-2 1 18 01.11.3999 00:00:00 Пульт VH Главный 2 20 01.11.3999 00:00:00 Пульт PW Главный 7 490 01.11.3999 00:00:00 Пульт PW Фили-2 1 17 Обратите внимание: майские итоги хранятся с указанием периода 01.06.2010 00:00:00, потому что итоги рассчитаны на начало июня. То есть при их расчете учтены все записи, которые зафиксированы в мае, включая 31.05.2010 23:59:59 (рис. 3.26). Регистрация движений: Рассчитанные итоги: 01.05.2010 01.06.2010 01.11.3999 Г раница рассчитанных итогов Актуальные итоги Рис. 3.26. Хранение рассчитанных итогов регистра накопления остатков Наличие посчитанных по конец каждого месяца итогов положительно сказы- вается на быстродействии обращений к остаткам регистра. Как будет еще более подробно описано ниже, в разделе «Получение остатков» на стр. 310, расчет остатков начинается с определения ближайшего равного или большего итога (хранимого в таблице итогов регистра) с последующим «досчетом» остатка на нужный момент времени по таблице движений.
292 Реализация прикладных задач в системе «ЮПредприятие 8.2» Но зачастую может сложиться ситуация, что граница рассчитанных итогов очень сильно «отстает» от периода самой последней записи в регистре. Данное положение не сказывается на функциональности регистра, сказыва- ется только на быстродействии обращений к его остаткам. Поскольку досчет тогда будет производиться, скорее всего, по большому количеству записей. При добавлении, удалении, модификации записей таблицы движений регистра система автоматически производит пересчет всех рассчитанных итогов, начиная с того периода (месяца), к