Профессиональная разработка в системе «1С:Предприятие 8» В двух томах Том 1 Москва «1С-Паблишинг» 2012
Электронная вер...
141 downloads
2134 Views
118MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Профессиональная разработка в системе «1С:Предприятие 8» В двух томах Том 1 Москва «1С-Паблишинг» 2012
Электронная версия книги «Профессиональная разработка в системе 1С:Предприятие 8» (издание 2) Том 1
© ООО «1С-Паблишинг», 2012
Материалы предназначены для личного индивидуального использования приобретателем книги «Профессиональная разработка в системе 1С:Предприятие 8», 2 издание (Москва, «1С-Паблишинг», ISBN 978-5-9677-1790-8, 2012). Запрещено тиражирование, распространение материалов, предоставление доступа по сети к материалам без письменного разрешения правообладателей. Разрешено копирование фрагментов программного кода для использования в разрабатываемых прикладных решениях.
Оглавление
Оглавление Введение....................................................................................7 От редактора...........................................................................................................................7 Благодарности........................................................................................................................7 Особенности книги..................................................................................................................7 Как читать книгу......................................................................................................................8 Что находится на компакт-диске...........................................................................................8 Скажите нам, что вы думаете . .............................................................................................8
Глава 1. Архитектура «1С:Предприятия»............................. 9 Платформа и прикладные решения......................................................................................9 Средства разработки в составе платформы........................................................................9 Метаданные – способ описания прикладного решения....................................................10 Метаданные и встроенный язык....................................................................................................10 Подсистемы.....................................................................................................................................10
Создание прикладных решений на основе модели...........................................................11 Объектные и необъектные данные.....................................................................................12 Три способа представления данных...................................................................................12 Сквозная типизация..............................................................................................................13 Поддержка составных типов данных..................................................................................13 Смешанный подход к манипулированию данными...........................................................13 Встроенный язык..................................................................................................................14 Язык запросов.......................................................................................................................14 Прикладные решения, независимые от используемого хранилища данных..................15 Управляемый интерфейс.....................................................................................................15
Командный интерфейс...................................................................................................................17 Ссылки.............................................................................................................................................18 История............................................................................................................................................20 Избранное........................................................................................................................................21 Использование информации из метаданных...............................................................................23 Расширения форм и элементов управления................................................................................23 Генерация форм по умолчанию.....................................................................................................23
Клиентские приложения ......................................................................................................24 Подключение через Интернет.............................................................................................24 Файловый и клиент-серверный варианты работы.............................................................25
Кластер серверов «1С:Предприятия»...........................................................................................25 Выполнение основной функциональности на сервере................................................................26
Том 1
Поддержка различных хранилищ данных..........................................................................26 Работа под управлением различных операционных систем ...........................................27 Обновление прикладных решений......................................................................................27 Интернационализация..........................................................................................................27
Глава 2. Функциональность «1С:Предприятия»............... 29 Обзор функциональности прикладных решений...............................................................29 Справочники....................................................................................................................................29 Документы.......................................................................................................................................29 Механизм характеристик................................................................................................................29 Механизм сведений........................................................................................................................30 Механизм учета движения средств...............................................................................................30 Механизм бухгалтерского учета....................................................................................................30 Механизм сложных периодических расчетов...............................................................................30 Механизм бизнес-процессов..........................................................................................................31 Механизм анализа данных и прогнозирования............................................................................31 Сложные отчеты, использующие систему компоновки данных..................................................31 Механизмы презентации текстовых и аналитических данных....................................................32 Средства интеграции и механизмы обмена данными.................................................................34 Web-сервисы...................................................................................................................................34 Web-расширение.............................................................................................................................35 Механизм полнотекстового поиска................................................................................................35 Механизм криптографии.................................................................................................................36 Механизм разделения данных.......................................................................................................36 Внешние источники данных...........................................................................................................36
Обзор функциональности средств разработки..................................................................36
Объекты конфигурации и инструменты для их редактирования................................................37 Конструкторы и редакторы.............................................................................................................37 Синтакс-помощник..........................................................................................................................38 Отладчик и режим замера производительности..........................................................................38 Проверка конфигурации.................................................................................................................39 Редактирование текстов интерфейса...........................................................................................39 Групповая разработка прикладных решений...............................................................................39 Поставка и поддержка прикладных решений...............................................................................39 Создание дистрибутивов................................................................................................................39 Функциональные опции..................................................................................................................39 Показатели производительности и режим имитации задержек при вызове сервера...............40 «1С:Библиотека стандартных подсистем 8.2».............................................................................40
3
Оглавление Обзор функциональности средств администрирования...................................................40 Список пользователей....................................................................................................................41 Механизмы аутентификации . .......................................................................................................41 Механизм заданий..........................................................................................................................41 Система прав доступа....................................................................................................................41 Ограничение прав на уровне записей и полей.............................................................................42 Журнал регистрации.......................................................................................................................42 Загрузка/выгрузка информационной базы....................................................................................42 Утилита администрирования кластера серверов.........................................................................42 «1С:Корпоративный инструментальный пакет» ..........................................................................43
Глава 3. Использование встроенного языка..................... 45 Модули конфигурации..........................................................................................................46 Контекст исполнения модулей.......................................................................................................47 Общий модуль.................................................................................................................................48 Модуль управляемого приложения...............................................................................................48 Модуль сеанса.................................................................................................................................50 Модуль внешнего соединения.......................................................................................................50 Модуль объекта...............................................................................................................................51 Модуль менеджера объекта...........................................................................................................52 Модуль управляемой формы.........................................................................................................53 Модуль команды.............................................................................................................................57
Работа встроенного языка на сервере...............................................................................58
Организация выполнения кода на сервере или на клиенте........................................................58 Вызов процедур из серверных модулей ......................................................................................59 Передача параметров на сервер и возврат значений.................................................................60 Привилегированный и безопасный режимы исполнения кода...................................................60
Работа с метаданными........................................................................................................61
Глава 4. Работа с данными................................................... 65 Объектные и необъектные данные.....................................................................................65 Объектные данные.........................................................................................................................65 Необъектные данные.....................................................................................................................75
Система типов.......................................................................................................................79
Типы значений и типы данных.......................................................................................................79 Типы значений.................................................................................................................................80 Типы данных....................................................................................................................................99
Транзакции..........................................................................................................................104
Использование явного вызова транзакций.................................................................................105 Обработка ошибок базы данных в транзакции...........................................................................105 Вложенный вызов транзакций.....................................................................................................107 Влияние транзакций на работу программных объектов............................................................108
Механизм управляемых блокировок................................................................................. 111
Возможные проблемы при многопользовательском доступе к одним и тем же данным....... 111 Уровни изоляции транзакций....................................................................................................... 113
4
Режим управляемых блокировок................................................................................................. 113 Установка управляемых блокировок........................................................................................... 114
Глава 5. Клиент-серверный вариант работы.................. 119 Общие сведения ................................................................................................................119 Программные компоненты клиент-серверной архитектуры «1С:Предприятия»..................... 119 Варианты использования.............................................................................................................121 Работа под управлением различных операционных систем ...................................................122
Кластер серверов...............................................................................................................122
Состав кластера............................................................................................................................122 Сеансы и соединения...................................................................................................................123
Масштабируемость и отказоустойчивость.......................................................................126
Масштабируемость кластера.......................................................................................................126 Устойчивость клиентских приложений........................................................................................127 Использование протокола HTTP..................................................................................................127 Отказоустойчивость кластера......................................................................................................128 Динамическое перераспределение нагрузки..............................................................................130
Безопасность.......................................................................................................................130
Многоуровневая аутентификация...............................................................................................130 Шифрование передаваемых данных..........................................................................................131
Глава 6. Установка и администрирование системы...... 135 Несколько дистрибутивов..................................................................................................135 Установка, обновление и запуск........................................................................................135 Запуск.............................................................................................................................................135 Установка.......................................................................................................................................137 Обновление...................................................................................................................................138
Управление кластером серверов......................................................................................139
Работа со списком администраторов центрального сервера...................................................139 Работа со списком кластеров центрального сервера................................................................139 Работа со списком менеджеров кластера..................................................................................140 Работа со списком администраторов кластера..........................................................................140 Работа со списком рабочих серверов кластера.........................................................................141 Работа со списком рабочих процессов.......................................................................................141 Работа со списком информационных баз...................................................................................142 Работа со списком сеансов..........................................................................................................142 Работа со списком соединений....................................................................................................143
Программные средства администрирования кластера серверов..................................143
Глава 7. Командный интерфейс прикладных решений.......................................... 145 Пользователь, интерфейс, команда.................................................................................145 Командный интерфейс системы.......................................................................................146 Команды «1С:Предприятия»........................................................................................................146 Структура командного интерфейса.............................................................................................147
Профессиональная разработка в системе «1С:Предприятие 8»
Оглавление Формирование состава командного интерфейса.......................................................................149 Краткие итоги.................................................................................................................................154
Настраиваем состав команд..............................................................................................154
Постановка задачи........................................................................................................................154 Системные команды.....................................................................................................................155 Состав разделов...........................................................................................................................155 Стандартные команды..................................................................................................................157 Основные действия для создания командного интерфейса.....................................................161
Настраиваем доступность команд по ролям....................................................................161
Система прав доступа..................................................................................................................161 Система управления пользователями........................................................................................165
Редактирование командного интерфейса........................................................................168
Автоматическое размещение и видимость команд....................................................................168 Система настройки командного интерфейса..............................................................................174
Влияние функциональных опций на командный интерфейс..........................................183
Механизм функциональных опций..............................................................................................183 Отключаем неиспользуемые команды........................................................................................184
Пользовательская настройка интерфейса.......................................................................187
Настройка области системных команд.......................................................................................187 Настройка командного интерфейса.............................................................................................188
Настраиваем представление команд................................................................................190 Модель разработки глобального командного интерфейса.............................................192 Создаем произвольные команды......................................................................................193
Произвольные команды...............................................................................................................193 Особенности размещения............................................................................................................196 Развитие функциональности ценообразования.........................................................................197
«Командуем» формами......................................................................................................210
Необходимые сведения о формах..............................................................................................210 Функциональность по умолчанию................................................................................................ 211 Команды формы............................................................................................................................ 211 Способы формирования состава команд формы......................................................................215 Автоматическое формирование состава команд формы..........................................................215 Доступность команд формы для пользователя.........................................................................219 Управляем командами формы.....................................................................................................221 Если не хватает стандартных команд.........................................................................................230 Краткие итоги.................................................................................................................................232
Глава 8. Разработка форм................................................... 233 Конструирование форм......................................................................................................233 Форма «1С:Предприятия»............................................................................................................233 Создание формы...........................................................................................................................235 Редактирование формы...............................................................................................................240 Влияние объектов конфигурации на форму...............................................................................253 Реквизиты формы.........................................................................................................................258 Командный интерфейс формы....................................................................................................259
Том 1
Управление видимостью элементов формы..............................................................................261 Окно сообщений формы...............................................................................................................268 Примеры конструирования форм................................................................................................269 Рабочий стол.................................................................................................................................279
Программирование форм..................................................................................................283 Форма как элемент клиент-серверного взаимодействия...........................................................283 Параметры и реквизиты формы..................................................................................................284 Открытие форм.............................................................................................................................285 Преобразование прикладных данных в данные формы...........................................................294 Контекстные и внеконтекстные серверные вызовы...................................................................296 Работа с данными объекта в форме...........................................................................................297 Последовательность событий при открытии формы объекта..................................................299 Последовательность событий при записи объекта из формы..................................................301 Начальное заполнение.................................................................................................................305 Проверка заполнения...................................................................................................................310 Сообщения пользователю...........................................................................................................321 Способы информирования пользователя..................................................................................327 Обновление данных в динамических списках............................................................................329 Оформление списков....................................................................................................................332 Дополнительные колонки в списках............................................................................................341 Работа с таблицей в форме.........................................................................................................347 Работа с файлами и картинками.................................................................................................351 Ввод по строке...............................................................................................................................364 Программное изменение формы.................................................................................................372 Настройки пользователей ...........................................................................................................380
Оптимизация клиент-серверного взаимодействия в формах.........................................391
Общие рекомендации по оптимизации клиент-серверного взаимодействия..........................391 Инструменты, используемые при оптимизации клиент-серверного взаимодействия............392 Примеры оптимизации клиент-серверного взаимодействия....................................................397
Глава 9. Хранение информации......................................... 435 Задачи хранения информации..........................................................................................435 Варианты подходов к решению задач хранения информации.......................................438 Хранение информации, общей для информационной базы.....................................................438 Хранение единичных значений условно-постоянной информации..........................................439 Использование перечислений ...................................................................................................440 Использование предопределенных элементов..........................................................................442 Хранение информации объектных и необъектных сущностей.................................................443 Хранение информации в самих объектах или в других объектах............................................444 Хранение иерархической информации.......................................................................................446 Хранение информации, имеющей привязку ко времени...........................................................453 Использование объекта «ХранилищеЗначения».......................................................................454
Хранение информации в регистрах сведений.................................................................455
Уникальность записей регистра сведений..................................................................................455 Периодические регистры сведений.............................................................................................457 Подчинение записей регистратору..............................................................................................457
5
Оглавление Структура регистра сведений......................................................................................................459 Создание, изменение, удаление записей регистра сведений...................................................462 Получение данных из регистров сведений.................................................................................470 Проектирование структуры регистров сведений........................................................................479
Хранение дополнительных характеристик.......................................................................480
Хранение дополнительных характеристик определенного типа..............................................481 Хранение дополнительных характеристик произвольного типа . ............................................483
Глава 10. Документы и последовательности.................. 495 Место документов в концепции системы «1С:Предприятие».........................................495 Документы...........................................................................................................................496 Функциональность документов....................................................................................................496 Состав документов........................................................................................................................503 Отдельные вопросы типового использования документов.......................................................505 Специальные случаи использования документов. Ручная операция......................................529
Журналы документов.........................................................................................................531
Состав журналов...........................................................................................................................532 Заполнение журналов...................................................................................................................533
Последовательности документов......................................................................................533
Устройство последовательностей...............................................................................................535 Работа с последовательностями.................................................................................................536 Параллельный ввод документов, участвующих в последовательности..................................543
Получение оборотов.....................................................................................................................580 Получение остатков и оборотов в одной таблице......................................................................592 Применение отборов в запросах, использующих виртуальные таблицы регистров накопления . ................................................................................................................602 Когда следует использовать запрос вместо объектной модели обращения при получении данных регистров накопления............................................................................604
Отдельные вопросы использования регистров накопления...........................................605
Работа с регистрами при отображении динамических данных.................................................605 Получение остатков при проведении документов......................................................................609
Глава 12. Бухгалтерский учет............................................. 613 Диаграмма взаимодействия объектов..............................................................................613 План счетов и его основные свойства..............................................................................614 Коды счетов...................................................................................................................................617 Упорядочивание счетов в плане счетов.....................................................................................618 Иерархичность плана счетов.......................................................................................................620 Предопределенные и пользовательские счета..........................................................................623 Основы организации аналитического учета...............................................................................624 Принятие решений при организации аналитического учета.....................................................632
Предназначение регистра бухгалтерии............................................................................634 Объект «Регистр бухгалтерии».........................................................................................636
Основные свойства регистра бухгалтерии.................................................................................637 Данные регистра бухгалтерии.....................................................................................................638
Глава 11. Учет движения средств...................................... 545
Запись движений в регистр бухгалтерии..........................................................................646
Оперативный учет. Описание задач, решаемых регистрами накопления.....................545 Структура регистра накопления........................................................................................547 Механизмы заполнения таблиц регистров накопления в базе данных.........................550
Интерактивно: ручная операция..................................................................................................647 Программно при проведении документа.....................................................................................650 Программно без проведения документа.....................................................................................653
Запись данных в таблицу движений регистра накопления.......................................................551 Свойство «Движения» объекта документа ................................................................................552 Запись набора записей регистра без использования свойства «Движения»..........................560 Механизмы заполнения таблицы итогов регистра накопления................................................563
Получение данных из регистров накопления...................................................................568
Получение движений регистров накопления..............................................................................568 Получение остатков......................................................................................................................573
6
Чтение данных регистра бухгалтерии...............................................................................654
Таблицы регистра бухгалтерии...................................................................................................654
Вопросы производительности регистра бухгалтерии......................................................678
Физические таблицы регистра бухгалтерии...............................................................................678 Индексы таблиц итогов регистра бухгалтерии...........................................................................681 Построение виртуальных таблиц регистра бухгалтерии...........................................................684 Зависимость производительности от настроек субконто счета................................................689
Профессиональная разработка в системе «1С:Предприятие 8»
Введение
Введение От редактора
Благодарности
Идея этой книги заключается в том, чтобы собрать воедино и систематизировать наиболее важную информацию, которая может понадобиться разработчику прикладных решений «1С:Предприятия 8.2». Уровень изложения материала предполагает, с одной стороны, что разработчик уже знаком с системой «1С:Предприятие 8.2», а с другой стороны – что в этой книге он сможет найти ответ даже на довольно сложные вопросы, возникающие в процессе разработки.
Написание такой книги, как эта, всегда требует совместных усилий. Поэтому кроме авторов в ее создании приняло участие большое количество специалистов.
В одной книге, пусть даже такой большой, невозможно охватить абсолютно все ситуации, которые могут возникнуть при разработке прикладных решений. Однако на подавляющее большинство вопросов, возникающих перед разработчиками, книга дает ответы. Причем книга будет одинаково интересна как начинающим разработчикам, так и более «продвинутым». Как правило, прикладные разработчики имеют достаточно четко определенную специализацию, сосредотачивая свои усилия на решении задач одной предметной области. Вместе с этим довольно часто возникают ситуации, когда приходится осваивать «смежные» прикладные области, чтобы внести небольшие исправления в существующее решение или, наоборот, создать новую подсистему. Поэтому книга, помимо собственно глубокого изложения прикладных механизмов, содержит общие сведения как о самих механизмах, так и об автоматизируемой предметной области. Благодаря этому разработчик, хорошо знакомый с системой, но специализирующийся, например, на решении задач оперативного учета, всегда сможет быстро разобраться с задачами начисления заработной платы и понять работу механизмов, которые используются для решения этих задач. При написании этой книги мы стремились, чтобы она стала серьезным инструментом для серьезных разработчиков, книгой, к которой всегда можно обратиться в случае затруднений и которую просто интересно прочитать, чтобы узнать что-то новое о хорошо известной предметной области или познакомиться с новым взглядом на привычные вещи. От себя лично и от всех авторов этой книги хочу пожелать вам успехов в изучении системы «1С:Предприятие» и повышения вашего мастерства! Максим Радченко
Том 1
Мы выражаем признательность всем, кто высказал свои замечания по тем или иным разделам книги: Александру Алексееву, Александру Безбородову, Александру Виноградову, Андрею Волкову, Геннадию Дамье, Одею Деруту, Дмитрию Зарецкому, Сергею Копиенко, Максиму Лейбовичу, Евгению Митрошкину, Сергею Мурзину, Сергею Нуралиеву, Константину Рупасову, Павлу Чикову и Андрею Чичерину. Хочется поблагодарить Одея Дерута, Дмитрия Русанова и Виталия Филиппова, которые оказали помощь авторам в разборе сложных вопросов по реализации и функционированию системы. При создании книги с разрешения фирмы «1С» использовались материалы информационно-технологического сопровождения и материалы докладов партнерских конференций. Мы выражаем признательность авторам этих материалов и выступлений. Также мы благодарим Евгения Медведева, Сергея Позднякова и Павла Чикова, которые выступили в качестве «бета-тестеров» некоторых глав и разделов книги.
Особенности книги Существует ряд особенностей, отличающих эту книгу от других книг, посвященных системе «1С:Предприятие 8.2». Прежде всего, это освещение вопросов, которые обычно остаются в тени, когда речь идет о прикладных разработках. Например, такие вопросы, как общая концепция системы, описание используемых таблиц и принципы хранения информации системы. При описании тех или иных прикладных механизмов авторы стремились дать общее представление о механизме, его месте в системе, показать идеологию его работы. По мнению авторов, это поможет разработчику строить эффективные решения исходя из понимания идеологии работы механизма, выбирать те или иные варианты реализации, основываясь на знании принципов работы механизма.
7
Введение Довольно много внимания в книге уделено методическим вопросам разработки прикладных решений, когда разработка ведется коллективом разработчиков. Рассматривается использование механизма групповой разработки. Также излагается методика настройки производительности прикладного решения, рассматриваются конкретные шаги и инструменты, используемые на каждом из уровней, которые следует использовать в обычной практике. Применительно к методике создания прикладных решений рассматриваются механизмы интернационализации, содержащиеся в системе, их влияние и использование в каждом из элементов системы. Этот раздел дает целостное представление обо всех средствах интернационализации, которые содержит «1С:Предприятие 8.2». При подготовке этой книги были использованы самые различные источники информации: ■■ опыт преподавания на учебных курсах по платформе и прикладным решениям «1С:Предприятия 8»; ■■ опыт внедрения прикладных решений; ■■ опыт, накопленный разработчиками фирмы «1С»; ■■ материалы информационно-технологической поддержки (ИТС); ■■ материалы форума партнеров-разработчиков на http://partners.v8.1c.ru; ■■ общение на партнерских семинарах, проводимых фирмой «1С».
или доработать любую имеющуюся конфигурацию. При этом учебная версия имеет ряд технических ограничений и не может быть использована для ведения реального учета на предприятии. Ограничения учебной версии платформы перечислены на сайте http://v8.1c.ru/edu/. Для учебной версии платформы периодически выпускаются обновления с тем, чтобы она соответствовала текущим возможностям, используемым в прикладных решениях. Обновить учебную версию платформы можно через сайт поддержки пользователей. Для этого необходимо: ■■ зарегистрироваться на сайте поддержки пользователей (ввести регистрационный номер, PIN-код и другую информацию); ■■ скачать новую учебную версию платформы. Регистрационная анкета и конверт с PIN-кодом входят в состав данного продукта. Адрес сайта поддержки пользователей – http://users.v8.1c.ru. Кроме учебной версии платформы на диске содержится более шестидесяти демонстрационных конфигураций, которые используются в ходе изложения различных глав книги. Все демонстрационные конфигурации содержатся на компакт-диске в виде одного дистрибутива. После его запуска (первый пункт меню диска) шаблоны конфигураций устанавливаются в текущий каталог шаблонов. Конфигурации созданы в версии «1С:Предприятия» 8.2.15.317.
Как читать книгу
Также на компакт-диске находится электронная версия этой книги в формате PDF. Ее можно использовать для быстрого поиска в тексте книги, а также для копирования фрагментов программного кода.
Книга построена таким образом, чтобы можно было читать главы как подряд, так и выборочно.
Кроме этого, на диске содержатся вспомогательные файлы, которые используются в некоторых примерах.
Чтение глав по порядку позволяет получить целостное представление о системе и ее возможностях, постепенно переходя от общих архитектурных решений к более конкретным прикладным механизмам и их реализации. В то же время книгу можно читать отдельными главами, если требуется изучить работу какого-то конкретного прикладного механизма или понять принципы работы системных механизмов. Книга содержит достаточно подробное оглавление, что позволяет обращаться к отдельным разделам книги в тех случаях, когда нужно разобраться в конкретных особенностях работы того или иного механизма или просто освежить их в памяти.
Что находится на компакт-диске К книге прилагается компакт-диск, который содержит материалы, предназначенные для самостоятельного изучения и использования. Прежде всего, это учебная версия платформы «1С:Предприятие 8.2». Она не имеет аппаратной или программной защиты и позволяет создать
8
Скажите нам, что вы думаете В процессе подготовки этой книги мы прилагали значительные усилия для того, чтобы устранить возможные неточности и опечатки, однако не можем гарантировать их отсутствие на 100 %. Мы понимаем, сколько негативных эмоций может доставить пример, который не работает, например, потому, что в имени переменной допущена ошибка. Поэтому сообщить об обнаруженных неточностях вы можете в форуме по адресу DevTrainingForum.v8.1c.ru. Здесь же вы можете написать свои впечатления от этой книги и пожелания по ее совершенствованию. Мы ценим обратную связь с читателями, и с благодарностью примем как слова критики, так и слова одобрения и учтем их в работе над будущими изданиями.
Профессиональная разработка в системе «1С:Предприятие 8»
Платформа и прикладные решения
Глава 1. Архитектура «1С:Предприятия» Система «1С:Предприятие» в широком смысле представляет собой совокупность четырех составляющих (рис. 1.1): ■■ технологической платформы; ■■ прикладных решений различного масштаба и различной направленности, созданных на основе технологической платформы; ■■ методики создания прикладных решений; ■■ информационно-технологической поддержки пользователей и разработчиков.
Платформа и прикладные решения Основным концептуальным решением, отличающим систему «1С:Предприятие» от универсальных средств программирования, является четкое разделение на платформу и прикладное решение. Прикладное решение «1С:Предприятия» является самостоятельной сущностью и может выступать в качестве отдельного программного продукта. Однако создание, модификация и собственно функционирование прикладного решения невозможны без использования технологий и механизмов платформы. Поэтому платформа поставляется с каждым комплектом «1С:Предприятия».
Средства разработки в составе платформы Рис. 1.1. Структура «1С:Предприятия»
Такая архитектура продиктована прежде всего задачами, которые призвана решать система «1С:Предприятие». Во-первых, система должна обеспечивать высокий уровень адаптируемости прикладных решений под требования заказчика. Во-вторых, система должна обеспечивать изменение готового прикладного решения разработчиком, не участвовавшим в его создании. Это особенно важно для прикладных решений в сфере экономических задач, где существенная часть разработчиков не создает собственные прикладные решения, а дорабатывает и развивает существующие типовые решения. В-третьих, система должна обеспечивать эффективное использование компьютерных технологий и платформ, не требуя при этом глубоких специальных знаний от разработчика.
Прикладные решения «1С:Предприятия» являются открытыми. Благодаря этому клиент с помощью разработчика или собственными силами может модифицировать и настраивать любое прикладное решение под себя. Исключение составляют прикладные решения, которые выпускаются в так называемой «базовой версии». Кроме прочих ограничений это означает невозможность самостоятельной модификации прикладного решения пользователем. Для модификации прикладных решений не требуется использовать какие-либо отдельные программные продукты – все средства разработки входят в состав технологической платформы. Можно сказать, что платформа состоит из двух составляющих (рис. 1.2): ■■ среда исполнения, ■■ среда разработки.
В-четвертых, система должна обеспечивать стандартизацию разработки. Таким образом, можно сказать, что «1С:Предприятие» не является универсальным средством программирования. Система обладает достаточно широкими возможностями, однако ее архитектура и конкретная реализация механизмов и технологий платформы продиктованы прежде всего необходимостью решения специализированных задач по созданию бизнесприложений и требованиями, предъявляемыми к самой системе. Том 1
Рис. 1.2. Структура технологической платформы «1С:Предприятия»
9
Глава 1. Архитектура «1С:Предприятия» Таким образом обеспечивается высокий уровень адаптируемости прикладных решений под требования заказчика.
Среда исполнения «1С:Предприятия» исполняет, «проигрывает» метаданные, аналогично тому, как операционная система исполняет код привычной программы.
Метаданные – способ описания прикладного решения
Отличительной особенностью технологии метаданных является использование визуального конструирования прикладного решения. Вместо кропотливого написания кода разработчик просто добавляет визуальными средствами новый объект конфигурации в прикладное решение и получает сразу же описание нужных типов, структур данных, описание наборов прав, связей между объектами, информацию об особенностях их поведения, визуального представления и т. д.
Прикладное решение «1С:Предприятия» не пишется в прямом смысле слова на языке программирования. При создании прикладных решений «1С:Предприятия» используется более абстрактная технология – технология метаданных. Метаданные представляют собой иерархическую структуру объектов, полностью описывающую все прикладное решение. Эта структура называется «дерево объектов конфигурации» (рис. 1.3).
Метаданные и встроенный язык Все прикладное решение представляется не в виде строк с инструкциями на языке программирования, а в виде иерархической структуры объектов конфигурации. При этом разработчик использует встроенный язык и язык запросов для того, чтобы описать специфические алгоритмы поведения тех или иных объектов конфигурации в различные моменты исполнения прикладного решения. Использование встроенного языка при разработке прикладных решений ограничено в основном решением тех задач, которые действительно требуют алгоритмического описания, например, расчета налогов, проверки корректности введенных данных и пр. Основная же структура прикладного решения описывается структурой объектов конфигурации. Почти все объекты конфигурации содержат модули, в которых и могут быть описаны алгоритмы на встроенном языке. Эти модули будут вызываться средой исполнения в конкретные, заранее определенные моменты работы прикладного решения – события. Таким образом, можно сказать, что использование встроенного языка в прикладных решениях носит событийный характер.
Подсистемы Платформа «1С:Предприятие» позволяет выделить в прикладном решении отдельные функциональные части – подсистемы, в совокупности представляющие все прикладное решение. Подсистемы могут иметь иерархическую структуру, т. е. одна подсистема может включать в себя несколько других подсистем. Структура подсистем определяет всю функциональность прикладного решения и служит основой для построения глобального командного интерфейса приложения (рис. 1.4). Рис. 1.3. Дерево объектов конфигурации прикладного решения
10
Разработка практически любого прикладного решения начинается с проектирования состава подсистем, так как структура подсистем Профессиональная разработка в системе «1С:Предприятие 8»
Метаданные – способ описания прикладного решения (разделов в интерфейсе приложения) – это первое, что увидит пользователь при знакомстве с прикладным решением.
Каждый такой шаблон (прототип) содержит определенную базовую реализацию объекта конфигурации (рис. 1.5).
Рис. 1.5. Состав прототипа (шаблона) объекта конфигурации
Рис. 1.4. Глобальный интерфейс прикладного решения
Когда разработчик добавляет в дерево объектов конфигурации новый объект конфигурации, этот объект наследует базовую реализацию прототипа (рис. 1.6):
Каждый объект конфигурации, описывающий данное прикладное решение, может быть отнесен к одной или нескольким подсистемам. Таким образом, наличие подсистем позволяет распределить объекты конфигурации по логически связанным с ними разделам и предоставить пользователю удобный интерфейс, в котором ему будут видны только те объекты (т. е. та функциональность прикладного решения), с которыми он работает.
Создание прикладных решений на основе модели Важной особенностью системы «1С:Предприятие» является то, что для описания структуры прикладного решения разработчик использует не произвольные, а строго определенные объекты конфигурации. Платформа «1С:Предприятие» содержит ограниченный набор прототипов (шаблонов) объектов конфигурации. Среди этих шаблонов есть, например, шаблон справочника, документа, регистра накопления, бизнеспроцесса и т. д. Том 1
Рис. 1.6. Добавление нового объекта конфигурации
11
Глава 1. Архитектура «1С:Предприятия» При добавлении нового объекта конфигурации платформа основывается на «знаниях» о базовом классе объектов (рис. 1.7): ■■ платформа «знает», какие таблицы (состав полей, количество таблиц, их взаимная связь) нужно будет создать в хранилище данных при сохранении конфигурации; ■■ сразу же добавляются новые типы встроенного языка, позволяющие работать с данными создаваемого объекта, причем состав этих типов может быть разным для различных шаблонов (прототипов); ■■ сразу же создается набор прав, которые будут использоваться для данного объекта, причем наборы прав также могут быть различными для разных шаблонов (прототипов), поскольку различается их базовая функциональность; ■■ определяются стандартные действия, которые система может выполнять с данными этого объекта конфигурации; ■■ и т. д.
Объектные и необъектные данные В «1С:Предприятии» принято разделять все прикладные данные на те, которые имеют объектную природу (объектные данные) и не имеют объектной природы (необъектные данные). Примерами объектных данных могут служить данные справочников, документов. Необъектными данными являются, например, данные регистров. Подобное деление определяет два различных подхода к работе с данными. Данные, имеющие объектную природу, хранятся в базе данных в виде объектов. Например, объектом является элемент справочника или конкретный документ. Каждый объект ценен для системы уже одним фактом своего существования и имеет уникальный идентификатор – ссылку. Могут измениться любые данные объекта, но это будет все тот же объект. Удалив объект, его нельзя создать заново. Даже если для нового объекта будут установлены те же данные, это будет уже другой объект с точки зрения «1С:Предприятия», обладающий другим уникальным идентификатором. Данные, имеющие необъектную природу, хранятся в базе данных в виде записей. Каждая запись полностью описывается значениями своих полей и не имеет какого-либо уникального идентификатора. Поэтому для «1С:Предприятия» собственно факт существования записи не важен. Можно удалить запись, а затем создать новую, с такими же значениями полей – состояние базы данных с точки зрения логики прикладного решения от этого не изменится. Подробнее
Рис. 1.7. Добавление нового объекта конфигурации
Благодаря этому разработчик, не производя никаких дополнительных действий, тут же может запустить прикладное решение и работать с только что добавленным объектом – базовая реализация объекта, унаследованная от прототипа (шаблона), обеспечит выполнение всех необходимых типовых действий. Таким образом, несмотря на то, что каждое прикладное решение обладает собственной «индивидуальностью», все они созданы по определенной модели, с использованием объектов конфигурации, которые обладают одинаковой базовой реализацией. Такой подход значительно упрощает модификацию прикладных решений разработчиками, которые не участвовали в их создании.
Раздел «Объектные и необъектные данные», стр. 65.
Три способа представления данных Для всех прикладных данных (как объектных, так и необъектных) «1С:Предприятие» поддерживает три способа представления данных (рис. 1.8): ■■ хранение в базе данных, ■■ представление во встроенном языке, ■■ отображение в формате XML. В базе данных информация хранится в виде объектов базы данных или в виде отдельных записей (в зависимости от ее природы – объектной или необъектной). Данные, хранимые в базе данных, могут быть считаны в объекты встроенного языка для их просмотра или изменения и записаны обратно в базу данных.
12
Профессиональная разработка в системе «1С:Предприятие 8»
Три способа представления данных
Поддержка составных типов данных
Рис. 1.8. Три способа представления данных
В то же время объекты встроенного языка могут быть сериализованы в/из элементы/ов XML. Представление данных в формате XML используется при обмене данными в распределенных информационных базах, а также может использоваться при взаимодействии с другими информационными системами. Важно отметить, что все три способа представления данных используют одну и ту же систему понятий, благодаря чему от разработчика не требуется специальных усилий для преобразования данных из одного представления в другое.
Сквозная типизация Важной особенностью работы с данными является то, что в «1С:Предприятии» реализована общая система типов встроенного языка, полей баз данных и интерфейса. Иными словами, разработчик одинаковым образом определяет поля базы данных, переменные встроенного языка, реквизиты форм и одинаковым образом работает с ними (рис. 1.9).
Важной особенностью модели данных «1С:Предприятия» является возможность использования реквизитов объектов конфигурации, имеющих составной тип. Например, в расходной накладной в качестве покупателя может быть указано либо юридическое лицо из справочника организаций, либо физическое лицо из справочника частных лиц. Соответственно, при проектировании базы данных разработчик может определить реквизит, который будет хранить значение любого из этих типов. Подробнее
Раздел «Составной тип данных», стр. 101.
Смешанный подход к манипулированию данными «1С:Предприятие» обеспечивает два способа доступа к данным – объектный (для чтения и записи) и табличный (только для чтения). В объектной модели разработчик оперирует объектами встроенного языка. В этой модели обращения к объекту, например документу, происходят как к единому целому – он полностью загружается в память, вместе с вложенными таблицами, к которым можно обращаться средствами встроенного языка как к коллекциям записей и т. д. (рис. 1.10).
Рис. 1.9. Общая система типов
Рис. 1.10. Объектный доступ к данным
В результате разработчику не приходится заботиться о преобразованиях между типами данных, поддерживаемыми той или иной СУБД, типами, поддерживаемыми встроенным языком, и типами, используемыми для построения интерфейсных решений.
При манипулировании данными в объектной модели обеспечивается сохранение целостности объектов, кеширование объектов, вызов соответствующих обработчиков событий и т. д.
Подробнее
Раздел «Система типов», стр. 79.
Том 1
В табличной модели все множество объектов того или иного класса представляется как совокупность связанных между собой таблиц, к которым можно обращаться при помощи запросов – как к отдельной таблице, так и к нескольким таблицам во взаимосвязи (рис. 1.11).
13
Глава 1. Архитектура «1С:Предприятия»
Язык запросов Язык запросов основан на SQL, но при этом содержит значительное количество расширений, ориентированных на отражение специфики финансово-экономических задач и на максимальное сокращение усилий по разработке прикладных решений. Важной особенностью языка запросов является то, что он предоставляет доступ к данным только на чтение и использует те же типы данных, что и встроенный язык. Рис. 1.11. Табличный доступ к данным
В этом случае разработчик получает доступ к данным сразу нескольких объектов, что очень удобно для анализа больших объемов данных, например, при создании отчетов. Однако в силу того, что данные, выбираемые таким способом, содержат не все, а лишь некоторые реквизиты анализируемых объектов, табличный способ доступа не позволяет изменять эти данные. Сочетание табличного и объектного доступа к данным позволяет, с одной стороны, сделать разработку прикладных решений простой и наглядной, а с другой стороны, получать сколь угодно сложные выборки данных и использовать возможности агрегирования полученных данных.
Встроенный язык Встроенный язык имеет много общих черт с другими языками, такими как Pascal, Java Script, Basic, что облегчает его освоение начинающими разработчиками. Однако он не является прямым аналогом какого-либо перечисленного языка. Вот лишь некоторые наиболее значимые особенности встроенного языка: ■■ мягкая типизация (тип переменной определяется типом значения, которое она содержит, и может изменяться в процессе работы); ■■ отсутствие программного описания прикладных типов (они создаются при добавлении объектов метаданных); ■■ не требуется предварительное описание процедур/функций, если их вызов выполняется раньше их описания; ■■ событийная ориентированность встроенного языка; ■■ поддерживается обработка исключительных ситуаций; ■■ все операторы имеют как русское, так и английское написание, которое можно использовать одновременно; ■■ используется интерпретатор с предварительной компиляцией (перед исполнением модули, содержащие текст на встроенном языке, преобразуются во внутренний код); ■■ кеширование скомпилированных модулей в памяти.
14
Можно перечислить наиболее существенные возможности, реализуемые языком запросов: ■■ Обращение к подчиненным полям через точку. Если поля какой-либо таблицы имеют ссылочный тип (хранят ссылки на объекты другой таблицы), разработчик может в тексте запроса ссылаться на них через точку («.»). При этом количество уровней вложенности таких ссылок система не ограничивает; ■■ Обращение к вложенным таблицам (например, табличным частям документов и элементов справочников). К вложенным табличным частям можно обращаться и как к отдельным таблицам, и как к целым полям одной таблицы; ■■ Автоматическое упорядочивание. Режим автоматического упорядочивания позволяет выводить информацию в наиболее правильном («естественном») порядке; ■■ Многомерное и многоуровневое формирование итогов. Итоги и подытоги формируются с учетом группировки и иерархии, обход уровней может выполняться в произвольном порядке с подведением подытогов. Обеспечивается корректное построение итогов по временным измерениям; ■■ Поддержка виртуальных таблиц. Виртуальные таблицы, предоставляемые системой, позволяют получить практически готовые данные для большинства прикладных решений без необходимости составления сложных запросов. Например, такая виртуальная таблица может предоставить данные по остаткам товаров в разрезе периодов на какой-то момент времени. При этом виртуальные таблицы максимально используют хранимую информацию, например, ранее рассчитанные итоги и т. д.; ■■ Стандартные SQL операции. В языке запросов поддерживаются стандартные для SQL операции, такие как объединение (Union), соединение (Join) и т. д.; ■■ Использование временных таблиц. Временные таблицы позволяют повысить производительность запросов, в некоторых случаях снизить количество блокировок и сделать текст запроса более легким для восприятия; Профессиональная разработка в системе «1С:Предприятие 8»
Язык запросов ■■ Пакетные запросы. Пакетные запросы позволяют более удобно работать с временными таблицами за счет того, что создание временной таблицы и ее использование помещаются в один запрос. Пакетный запрос представляет собой последовательность запросов, разделенных символом «;». Запросы исполняются один за другим. Результатом выполнения пакетного запроса в зависимости от используемого метода будет являться либо результат, возвращаемый последним запросом пакета, либо массив результатов всех запросов пакета в той последовательности, в которой следуют запросы в пакете.
Прикладные решения, независимые от используемого хранилища данных
Пользовательский интерфейс «1С:Предприятия» можно охарактеризовать как задаче-ориентированный, позволяющий в каждом отдельном окне приложения (основном или вспомогательном) решать конкретную задачу. Основное окно приложения предназначено для навигации по прикладному решению и вызова различных команд. Вспомогательное окно предназначено для работы с объектами информационной базы (например, с документами или элементами справочников), построения отчетов или выполнения обработок данных. В основном окне приложения пользователю предоставляется вся структура прикладного решения (панель разделов) и рабочий стол (рис. 1.12).
Платформа изолирует разработчика от понятий и подробностей более низкоуровневых технологий. При создании прикладных решений разработчик «1С:Предприятия» не обращается к базе данных напрямую. Непосредственно он работает с платформой «1С:Предприятие». При этом он может: ■■ описывать структуры данных в конфигураторе; ■■ манипулировать данными с помощью объектов встроенного языка; ■■ составлять запросы к данным, используя язык запросов. Платформа «1С:Предприятие» обеспечивает операции исполнения запросов, описания структур данных и манипулирования данными, транслируя их в соответствующие команды. Это могут быть команды одной из сторонних СУБД, поддерживаемых «1С:Предприятием», в случае клиент-серверного варианта работы или команды собственной СУБД для файлового варианта работы.
Управляемый интерфейс В платформе «1С:Предприятие» реализован современный эргономичный пользовательский интерфейс, рассчитанный на комфортную работу с системой в течение продолжительного времени, в том числе и неподготовленных пользователей, имеющих небольшой опыт работы с компьютером. Удобный и интуитивно понятный интерфейс позволяет пользователям выполнять большой объем функционала, даже не пользуясь при этом инструкциями и документацией. Пользовательский интерфейс «1С:Предприятия» построен по принципу декларативного описания. Он называется «управляемым» потому, что с помощью прав и ролей пользователей, функциональных опций и настроек пользователя платформа автоматически строит командный интерфейс, управляемые формы и отчеты. Том 1
Рис. 1.12. Основное окно приложения
Рабочий стол – это стандартный раздел программы, содержащий часто используемые документы, отчеты, справочники и т. п. Этот раздел автоматически активизируется при запуске прикладного решения. Это своеобразный «помощник» пользователя. Рабочий стол вводит пользователя в курс дел, отвечает на его вопросы и позволяет ему быстро включиться в работу. Панель разделов – это наиболее крупное разделение функциональности прикладного решения. Она расположена в верхней части основного окна
15
Глава 1. Архитектура «1С:Предприятия» и соответствует верхнему уровню подсистем, добавленных в конфигурацию. С ее помощью осуществляется переход к другим разделам программы.
отчетов и обработок. Эти окна отображаются на экране компьютера независимо от основного окна приложения (рис. 1.14).
При активизации раздела вся функциональность соответствующей подсистемы, включая вложенные подсистемы, представляется пользователю в виде команд в двух панелях: панели навигации и панели действий (рис. 1.13).
Рис. 1.13. Основное окно приложения
Панель навигации содержит своеобразное «оглавление» раздела. Она включает навигационные команды, которые позволяют перейти к той или иной точке этого раздела. Как правило, это команды перехода к каким-либо спискам. При вызове навигационной команды соответствующий ей список отображается в рабочей области раздела, замещая прежнее содержимое рабочей области. Панель действий содержит наиболее востребованные в повседневной работе команды, позволяющие быстро создавать новые объекты, выполнять типовые обработки или строить популярные отчеты. Такие команды называются командами действия, поскольку их вызов приводит к открытию нового, вспомогательного окна приложения и на некоторое время переключает пользователя на выполнение другой задачи. Вспомогательные окна приложения открываются при вызове команд ввода новых и редактирования существующих объектов, а также при открытии
16
Рис. 1.14. Основное и вспомогательное окна приложения
Пользователь может открывать любое необходимое ему количество вспомогательных окон. Для удобства ввода данных и защиты от ошибок вспомогательное окно может быть открыто в режиме блокирования окнавладельца. Основное окно приложения также включает в себя главное меню системы и набор вспомогательных команд (калькулятор, календарь и пр.). А также предоставляет различные сервисные возможности, такие как: просмотр истории работы пользователя и возможность перемещаться по разделам прикладного решения, с которыми уже работал пользователь; добавление разделов, списков, объектов базы данных, отчетов и обработок в избранное; отображение в информационной панели (внизу окна) оповещений о последних действиях пользователя; возможность получить ссылку на любые разделы, списки, объекты базы данных, отчеты и обработки и перейти по полученной ссылке к этим данным и т. д. Профессиональная разработка в системе «1С:Предприятие 8»
Управляемый интерфейс
Командный интерфейс Командный интерфейс – это основное средство навигации пользователя по функциональности прикладного решения. Формирование командного интерфейса выполняется платформой автоматически в зависимости от прав пользователя, видимости команд по ролям, функциональных опций приложения и настроек самого пользователя. Глобальный командный интерфейс в системе «1С:Предприятие» строится на основе иерархии подсистем, созданных разработчиком в конфигурации. Состав подсистем верхнего уровня иерархии отражает наиболее общее разделение функциональности прикладного решения, в интерфейсе приложения он образует разделы глобального командного интерфейса. Структура подсистем определяет всю функциональность прикладного решения и служит основой для построения глобального командного интерфейса приложения (рис. 1.15).
Рис. 1.15. Глобальный интерфейс прикладного решения
Если подсистема имеет подчиненную подсистему, то для нее формируется подраздел, отображаемый группой в панели навигации раздела. Все прикладные объекты конфигурации (справочники, документы, отчеты и т. д.) привязываются разработчиком конфигурации к подсистемам. На основе этой информации (структуры подсистем и привязки объектов к подсистемам) платформа автоматически строит командный интерфейс Том 1
для пользователя. Пользователю отображается структура прикладного решения (иерархия подсистем) и предоставляются стандартные команды доступа к функциональности прикладных объектов (вызов списков справочников, документов, открытие отчетов, обработок и т. д.). При этом разработчик может по своему усмотрению отредактировать предлагаемое системой построение командного интерфейса (изменить порядок, видимость команд). Кроме того, разработчик может создать свои команды (общие для конфигурации или подчиненные прикладным объектам), которые будут включаться в командный интерфейс. При запуске прикладного решения платформа «превращает» полный командный интерфейс приложения в командный интерфейс пользователя, запустившего прикладное решение. Этот процесс включает несколько этапов (рис. 1.16): ■■ Автоматический учет ролей/прав. Прежде всего, при построении интерфейса автоматически анализируются права этого пользователя на доступ к данным. Например, из командного интерфейса исключаются команды для доступа к объектам, которые пользователю недоступны. Кроме того, в системе существует возможность установки прав на отдельные реквизиты объектов. Используя эту информацию, платформа сама исключает или делает недоступными для редактирования соответствующие поля в формах, а также исключает колонки из списков и отчетов; ■■ Видимость по умолчанию. Для различных интерфейсных элементов системы (команд, элементов формы) настраивается видимость по умолчанию для отдельных ролей. Это позволяет, в зависимости от ролей пользователя, предоставить ему наиболее важную часть функциональности. При этом у пользователя есть возможность включения видимости тех элементов, которые изначально были отключены разработчиком; ■■ Значения функциональных опций. Механизм функциональных опций позволяет определить в конфигурации ту функциональность, которая может использоваться или нет при внедрении в зависимости от потребностей конкретной организации. Различные элементы конфигурации (объекты, реквизиты, команды) могут быть привязаны к функциональным опциям. При внедрении можно управлять включением и выключением функциональных опций в конкретной информационной базе. Платформа при этом будет автоматически включать и выключать отображение всех элементов интерфейса (полей, команд, колонок списков, элементов отчетов), связанных с этими функциональными опциями; ■■ Пользовательская настройка. Платформа предоставляет пользователю возможность донастроить внешний вид командного интерфейса в соответствии со своими предпочтениями. Возможна настройка всех
17
Глава 1. Архитектура «1С:Предприятия» основных элементов интерфейса: панели разделов, рабочего стола, панели навигации и панели действий. Пользовательская настройка запоминается и учитывается при следующем запуске приложения этим пользователем.
□□ □□ □□ □□
реквизит табличной части объекта информационной базы; запись регистра информационной базы; реквизит записи регистра информационной базы; временное хранилище.
Интерактивные ссылки Эти ссылки можно запоминать для дальнейшего использования, например, чтобы быстро перейти к определенному документу. Этими ссылками можно обмениваться: например, передать сотруднику ссылку на неправильно оформленный документ. Получивший ссылку сотрудник может просто ввести текстовую ссылку, и нужный документ сразу откроется. Например, навигационная ссылка может выглядеть следующим образом (листинг 1.1). Рис. 1.16. Автоматическое формирование платформой командного интерфейса для пользователя
Подробнее
Глава 7 «Командный интерфейс прикладных решений», стр. 145.
Ссылки В системе «1С:Предприятие» реализован механизм ссылок. Значительная часть этого механизма реализована в режиме 1С:Предприятие и доступна пользователю интерактивно. В полном же объеме механизм доступен из встроенного языка. Общий смысл этого механизма заключается в том, что в режиме 1С:Предприятие можно получать текстовые ссылки на данные, хранящиеся в информационной базе, на точки навигации и на отчеты и обработки. Условно такие ссылки можно разделить на два «вида» – интерактивные и неинтерактивные: ■■ интерактивные ссылки: □□ на объекты информационной базы – на элементы справочников, документы и т. д.; □□ отчеты; □□ обработки; □□ точки навигации – на разделы, формы списков, открывающиеся в основном окне; ■■ неинтерактивные ссылки: □□ на реквизит объекта информационной базы (например, реквизит элемента справочника);
18
Листинг 1.1. Навигационная ссылка
e1cib/data/Документ.ПриходТовара?ref="a9b800055d49b45e11dbb50561cf0dac"
Правила, по которым формируются ссылки, описаны в документации. Формат текстовых ссылок соответствует стандартам RFC 1738, 1808, 2368, 2396, и для того чтобы отличать ссылки «1С:Предприятия» от других (например, http или file), используется идентификатор схемы e1c. Подробнее
Документация «1С:Предприятие 8.2. Руководство разработчика», Приложение 2 «Форматы навигационных ссылок».
Заметим, что одна и та же ссылка может быть представлена как внутренняя (относительно какой-то информационной базы) или внешняя, то есть включающая в себя сведения о конкретной информационной базе. Пример внутренней и внешней ссылки приведен в листинге 1.2. Листинг 1.2. Внутренняя и внешняя ссылка
// Внутренняя ссылка e1cib/data/Документ.ПриходТовара?ref="a9b800055d49b45e11dbb50561cf0dac" // Внешняя ссылка e1c://filev/C/Bases/Platform82Demo#e1cib/data/Документ.ПриходТовара?ref= "a9b800055d49b45e11dbb50561cf0dac"
Как видно, разница только в начальной части ссылки. У внешней ссылки добавляется идентификатор конкретной базы данных. В примере это файловая база данных (e1c://filev/), расположенная в каталоге C/Bases/Platform82Demo. Профессиональная разработка в системе «1С:Предприятие 8»
Управляемый интерфейс С точки зрения пользователя, существует три способа использования таких ссылок: ■■ любые ссылки (и внешние, и внутренние) можно добавлять в избранное, чтобы затем, при необходимости, быстро вернуться к этому документу или списку.
В диалоге получения ссылки можно сразу же скопировать ее в буфер обмена или переключить представление ссылки с внутренней на внешнюю. Чтобы перейти по полученной ссылке, нужно выполнить команду Перейти по ссылке в основном или во вспомогательном окне (рис. 1.18).
Подробнее
Раздел «Избранное», стр. 21.
■■ внутренние ссылки можно использовать внутри конкретной информационной базы. При этом не важно, каким клиентом пользователи подключены к этой информационной базе. Один пользователь может получить внутреннюю ссылку, передать ее другому пользователю, например, по электронной почте. Другой пользователь может перейти по этой ссылке; ■■ внешние ссылки задуманы для использования вне «1С:Предприятия». Внешние ссылки имеет смысл использовать только для веб-клиента. Один пользователь, подключенный к информационной базе веб-клиентом или тонким клиентом по протоколу http, может получить внешнюю ссылку и передать ее другому пользователю. Другой пользователь может ввести эту ссылку в строку веб-браузера. В результате будет запущен веб-клиент, выполнено соединение с нужной информационной базой и выполнен переход по ссылке. В режиме 1С:Предприятие ссылку можно получить по команде Получить ссылку в основном или во вспомогательном окне (рис. 1.17). Рис. 1.18. Команда «Перейти по ссылке»
Встроенный язык поддерживает работу со ссылками. Для этого в глобальном контексте есть ряд методов: ■■ ■■ ■■ ■■ ■■
ПолучитьНавигационнуюСсылку(), ПолучитьНавигационнуюСсылкуИнформационнойБазы(), ПолучитьПредставленияНавигационныхСсылок(), ПерейтиПоНавигационнойСсылке(), НайтиОкноПоНавигационнойСсылке().
Неинтерактивные ссылки Неинтерактивные ссылки предназначены для использования во встроенном языке. Например, они могут использоваться для отображения картинок в форме, когда нужная картинка находится во временном хранилище или в реквизите объекта информационной базы. Рис. 1.17. Команда «Получить ссылку»
Том 1
19
Глава 1. Архитектура «1С:Предприятия»
История Платформа «1С:Предприятие» сохраняет историю работы пользователя. При интерактивном добавлении или изменении объектов информационной базы (например, документов, элементов справочников) информация об этом автоматически сохраняется системой.
Кроме этого, последние оповещения об изменении объектов информационной базы отображаются в правой части информационной панели для быстрого доступа к ним (рис. 1.21).
Пользователь всегда может открыть список этих изменений и перейти к любому из объектов, перечисленных в этом списке. Например, для того, чтобы уточнить, правильно ли он изменил данные (рис. 1.19).
Рис. 1.19. История работы пользователя
Перейти к окну История можно с помощью кнопки История в информационной панели или через Главное меню Сервис История в основном или вспомогательных окнах приложения (рис. 1.20). Рис. 1.21. Последние измененные объекты в информационной панели
История хранится в служебной таблице информационной базы. Если один и тот же объект информационной базы изменялся несколько раз, то в истории будет храниться только одна запись о последнем изменении этого объекта. Если изменялись необъектные данные (например, запись регистра сведений), то история будет хранить записи о каждом изменении данных в ключевых полях этой записи. История хранит не более 200 записей. При добавлении новых записей в историю старые записи автоматически удаляются. Автоматически записи в историю попадают только при интерактивном изменении объектов. Если объекты изменяются программно (например, средствами встроенного языка с помощью внешней обработки), то стандартно при этом не появляется оповещение в правом нижнем углу основного окна приложения и не появляется записи в истории.
Рис. 1.20. Переход к истории работы пользователя
20
Но разработчик может при необходимости принудительно вызвать появление оповещения и может занести запись в историю работы пользователя. Профессиональная разработка в системе «1С:Предприятие 8»
Управляемый интерфейс Во встроенном языке для работы с историей используется менеджер истории работы пользователя. Его можно получить с помощью свойства глобального контекста ИсторияРаботыПользователя. Для показа оповещения используется метод глобального контекста ПоказатьОповещениеПользователя(). В качестве примера рассмотрим программное изменение элементов справочника. При программном изменении автоматически записи в историю не добавляются. Поэтому мы будем добавлять их самостоятельно, из встроенного языка. А при завершении работы выведем оповещение о том, что элементы справочника были изменены. Подробнее
Этот пример можно посмотреть в демонстрационной конфигурации «Архитектура 1С:Предприятия».
В новой информационной базе добавим в конфигурацию справочник Товары и создадим его форму списка. Расположим ее на рабочем столе. В эту форму добавим команду ИзменитьТовары. В обработчике действия команды напишем следующий код (листинг 1.3): Листинг 1.3. Обработчик команды «ИзменитьТовары»
&НаКлиенте Процедура ИзменитьТовары(Команда) Количество = ИзменитьЭлементы(); Элементы.Список.Обновить(); ПоказатьОповещениеПользователя("Обработано " + Количество + " элемента", "e1cib/navigationpoint/desktop", "Список товаров"); КонецПроцедуры
Сначала вызовем функцию ИзменитьЭлементы(). Ее пока нет, мы ее напишем позже. Она будет изменять наименование элементов справочника Товары и вернет нам количество измененных элементов. После этого мы обновим список справочника, расположенный в форме, чтобы увидеть новые наименования – Элементы.Список.Обновить(). И в заключение мы выведем оповещение, которое сообщит пользователю количество измененных элементов и будет содержать ссылку на рабочий стол – e1cib/navigationpoint/desktop, чтобы пользователь, если он находится в другом разделе программы, мог быстро перейти к рабочему столу и посмотреть выполненные изменения. Подробнее
Раздел «Ссылки», стр. 18.
Том 1
После этого добавим недостающую функцию листинг 1.4.
ИзменитьЭлементы(),
Листинг 1.4. Функция «ИзменитьЭлементы()»
&НаСервереБезКонтекста Функция ИзменитьЭлементы() Экспорт Количество = 0; Выборка = Справочники.Товары.Выбрать( , , , "Код"); Пока Выборка.Следующий() Цикл ОбъектТовар = Выборка.ПолучитьОбъект(); ОбъектТовар.Наименование = "Новый товар" + Количество; ОбъектТовар.Записать(); ИсторияРаботыПользователя.Добавить(Выборка.Ссылка); Количество = Количество + 1; КонецЦикла; Возврат Количество; КонецФункции
Функция очень простая. Выбираются все элементы справочника Товары. Каждому элементу изменяется наименование, и он записывается. После этого в историю добавляется запись об изменении этого элемента справочника – ИсторияРаботыПользователя.Добавить(Выборка.Ссылка). Функция возвращает количество измененных элементов. Теперь в результате выполнения команды ИзменитьТовары в списке справочника Товары наименования всех товаров будут изменены. Запись об изменении каждого товара будет добавлена в историю, а в конце работы будет выведено одно оповещение. Можно было бы выводить оповещения каждый раз после изменения очередного элемента справочника, но это бессмысленно, так как визуально все эти оповещения «сольются» в одно. Поэтому выводится одно «итоговое» оповещение в конце работы.
Избранное Платформа «1С:Предприятие» позволяет пользователю вести собственный список избранных ссылок. В этот список пользователь самостоятельно может добавить ссылки на точки навигации: на разделы программы, списки, открывающиеся в основном окне, отчеты, обработки и объекты информационной базы – на элементы справочников, документы и т. д. Предполагается, что пользователь будет добавлять в этот список важные для него ссылки или ссылки, которыми он часто пользуется, для того чтобы быстро переходить к ним.
21
Глава 1. Архитектура «1С:Предприятия» Подробнее
Раздел «Ссылки», стр. 18.
Также ссылки в избранное можно добавить с помощью команды главного меню – Сервис Добавить в избранное (рис. 1.24).
Чтобы увидеть список избранного, нужно открыть меню Избранное в основном или во вспомогательном окне приложения (рис. 1.22).
Рис. 1.24. Добавление ссылок с помощью команды главного меню
Рис. 1.22. Список избранного
Еще один способ добавления ссылок – с помощью кнопки Добавить в избранное, которая есть в диалогах получения ссылки и перехода по ссылке (рис. 1.25).
Ссылки в избранное можно добавить с помощью команды Добавить в избранное. Эта команда находится в меню Избранное, в области системных команд в основном и во вспомогательных окнах приложения (рис. 1.23).
Рис. 1.25. Добавление ссылки из диалога получения ссылки
Рис. 1.23. Добавление ссылок в избранное
22
Пользователь имеет возможность управлять списком избранного – менять ссылки местами, удалять ненужные ссылки. Профессиональная разработка в системе «1С:Предприятие 8»
Управляемый интерфейс Это возможно в окне настройки избранного, которое открывается по команде Настройка избранного из меню избранного основного или вспомогательного окна приложения (рис. 1.26).
Использование информации из метаданных Интерфейсные механизмы «1С:Предприятия» широко используют информацию из метаданных для того, чтобы автоматизировать процесс разработки интерфейса и уменьшить необходимость детальной настройки, выполняемой разработчиком. Объекты конфигурации имеют множество интерфейсных свойств (таких как Представление объекта, Представление списка, Маска, Формат и пр.). Настроив их, разработчик может управлять отображением объекта в интерфейсе и его интерактивным поведением в процессе работы прикладного решения.
Расширения форм и элементов управления «1С:Предприятие» использует механизм расширений форм и элементов управления. Расширения содержат набор свойств, методов и событий, которыми дополняется стандартное поведение элементов управления и формы после того, как они связываются с данными. В зависимости от того, какой тип данных отображает элемент управления или форма, платформа будет использовать то или иное расширение. Такой подход позволяет реализовывать индивидуальные особенности поведения формы и элементов управления при работе с различными типами данных. Рис. 1.26. Настройка избранного
Избранное хранится в хранилище системных настроек. Подробнее
Раздел «Настройки пользователей», стр. 380. Документация «1С:Предприятие 8.2. Руководство разработчика»: ■■ глава 5 «Объекты конфигурации», ■■ Приложение 4 «Перечень автоматически сохраняемых настроек».
Содержимым избранного можно управлять программно с помощью объекта встроенного языка ИзбранноеРаботыПользователя. Особенностью является то, что доступ к этому объекту не предоставляется через свойство глобального контекста, как, например, к истории работы пользователя. Для того чтобы получить доступ к избранному, нужно прочитать из системного хранилища настроек избранное, добавить в него новый элемент с нужной ссылкой и сохранить избранное обратно в системное хранилище настроек.
Том 1
Командный интерфейс также наряду с командами, общими для данного элемента управления или формы, содержит и индивидуальный набор команд, определяемый конкретным типом данных, с которыми связан элемент управления или форма. Например, в форме документа содержится команда Провести, а в форме справочника – нет.
Генерация форм по умолчанию Важной особенностью системы «1С:Предприятие» является механизм форм по умолчанию. Этот механизм освобождает разработчика от необходимости создания всех возможных форм для каждого объекта прикладного решения. Разработчику достаточно создать новый объект прикладного решения, а система сама сгенерирует в нужные моменты работы пользователя необходимые формы по умолчанию для работы с данными, содержащимися в этом объекте. Таким образом, разработчику нужно создавать собственные формы объектов прикладного решения лишь в том случае, если они должны иметь отличия (другой дизайн или специфическое поведение) от форм, генерируемых системой по умолчанию.
23
Глава 1. Архитектура «1С:Предприятия»
Клиентские приложения
Подключение через Интернет
Клиентское приложение – это программа, работающая на компьютере пользователя и обеспечивающая интерактивное взаимодействие системы «1С:Предприятие» с пользователем. В системе «1С:Предприятие» существуют три клиентских приложения: толстый клиент, тонкий клиент и веб-клиент.
Подключение через Интернет позволяет обеспечить удаленную online работу пользователей с информационными базами. Это возможно благодаря использованию тонкого клиента и веб-клиента. Они подключаются к специальным образом настроенному веб-серверу, который осуществляет их взаимодействие с кластером серверов «1С:Предприятия» или с файловой информационной базой (рис. 1.27).
Толстый клиент позволяет реализовывать полные возможности «1С:Предприятия», как в плане разработки, администрирования, так и в плане исполнения прикладного кода. Однако он не поддерживает работу с информационными базами через Интернет, требует предварительной установки на компьютер пользователя и имеет довольно внушительный объем дистрибутива. Тонкий клиент не позволяет разрабатывать и администрировать прикладные решения, однако может работать с информационными базами через Интернет. Он также требует предварительной установки на компьютер пользователя, но имеет значительно меньший размер дистрибутива, чем толстый клиент. Веб-клиент не требует какой-либо предварительной установки на компьютер. В отличие от толстого и тонкого клиентов, он исполняется не в среде операционной системы компьютера, а в среде интернетбраузера (Windows Internet Explorer, Mozilla Firefox, Google Chrome или Safari). В веб-клиенте невозможна разработка прикладных решений. В сводном виде возможности этих клиентских приложений можно представить следующим образом (табл. 1.1). Таблица 1.1. Возможности клиентских приложений Толстый клиент Тонкий клиент Веб-клиент
Разработка прикладных решений Работа в локальной сети Работа через Интернет Необходимость предварительной установки
Да Да Нет Да, большой дистрибутив
Нет Да Да Да, маленький дистрибутив
Нет Да Да Нет
Независимо от режима работы (толстый, тонкий, веб-клиент) вся разработка прикладного решения ведется полностью в конфигураторе «1С:Предприятия», серверный и клиентский код пишется на встроенном языке. Однако работа в конфигураторе доступна только в режиме толстого клиента, тонкий и веб-клиент поддерживают работу только в пользовательском режиме 1С:Предприятие.
Рис. 1.27. Подключение к Интернету через веб-сервер в клиент-серверном варианте работы
Прикладные решения не требуют какой-либо доработки для того, чтобы работать с ними через Интернет. И тонкий, и веб-клиент самостоятельно обеспечивают функционирование интерфейса «1С:Предприятия» на компьютере пользователя. Клиенты могут использовать различные способы выхода в Интернет. Это могут быть высокоскоростные подключения по выделенным линиям или через локальную сеть. А могут быть низкоскоростные подключения, например, через мобильное GPRS-соединение. Специально для таких случаев, когда работа с информационной базой осуществляется через низкоскоростные каналы связи, тонкий клиент и веб-клиент имеют специальный режим запуска – режим низкой скорости соединения. В результате даже на низкоскоростных каналах связи платформа обеспечивает приемлемую скорость работы пользователей.
Подробнее
Раздел «Программные компоненты клиент-серверной архитектуры «1С:Предприятия», стр. 119.
24
Профессиональная разработка в системе «1С:Предприятие 8»
Файловый и клиент-серверный варианты работы
Файловый и клиент-серверный варианты работы «1С:Предприятие» может работать в двух вариантах: ■■ файловый, ■■ клиент-серверный. И в том, и в другом варианте все прикладные решения работают полностью идентично, что позволяет выбирать один или другой вариант работы без изменения существующего прикладного решения. Файловый вариант работы рассчитан на персональную работу одного пользователя или работу небольшого количества пользователей в локальной сети. В этом варианте все данные информационной базы (конфигурация, база данных, административная информация) располагаются в одном файле – файловой базе данных. Работу с этой базой данных осуществляет файловая СУБД, разработанная фирмой «1С» и являющаяся частью платформы (рис. 1.28).
Рис. 1.29. Клиент-серверный вариант работы
Подробнее
Глава 5 «Клиент-серверный вариант работы», стр. 119.
Кластер серверов «1С:Предприятия» Кластер серверов «1С:Предприятия» – основной компонент платформы, обеспечивающий взаимодействие между пользователями и системой управления базами данных в клиент-серверном варианте работы. Наличие кластера позволяет обеспечить бесперебойную, отказоустойчивую, конкурентную работу большого количества пользователей с крупными информационными базами. Рис. 1.28. Файловый вариант работы
Такой вариант работы обеспечивает легкость установки и эксплуатации прикладного решения. При этом для работы с информационной базой не требуются дополнительные программные средства, достаточно иметь операционную систему и «1С:Предприятие». Клиент-серверный вариант предназначен для использования в рабочих группах или в масштабе предприятия. Он реализован на основе трехуровневой архитектуры «клиент-сервер» (рис. 1.29). Клиентское приложение, работающее у пользователя (толстый клиент, тонкий клиент или веб-клиент), взаимодействует с кластером серверов «1С:Предприятия», а кластер при необходимости обращается к серверу баз данных (Microsoft SQL Server, PostgreSQL, IBM DB2 или Oracle Database). При этом физически кластер серверов «1С:Предприятия» и сервер баз данных могут располагаться как на одном компьютере, так и на разных. Это позволяет администратору при необходимости распределять нагрузку между серверами.
Использование кластера серверов позволяет сосредоточить на нем выполнение наиболее объемных операций по обработке данных. Например, при выполнении даже весьма сложных запросов программа, работающая у пользователя, будет получать только необходимую ей выборку, а вся промежуточная обработка будет выполняться на сервере. Кластер серверов «1С:Предприятия» отличают следующие свойства: ■■ Масштабируемость – позволяет перераспределить нагрузку между менеджерами кластера и тем самым разгрузить главный менеджер кластера; ■■ Отказоустойчивость – позволяет обеспечить бесперебойную работу пользователей при программных и аппаратных сбоях в кластере серверов; ■■ Динамическое распределение нагрузки – автоматически переключает пользователя на более производительный рабочий процесс, что обеспечит его более эффективную работу, причем такое переключение будет совершенно незаметно для пользователя. Подробнее
Раздел «Кластер серверов», стр. 122.
Том 1
25
Глава 1. Архитектура «1С:Предприятия»
Выполнение основной функциональности на сервере Вся работа с прикладными объектами, чтение и запись базы данных выполняются только на сервере. Функциональность форм и командного интерфейса также реализована на сервере. Это позволяет увеличить производительность и надежность работы прикладного решения. На сервере выполняется подготовка данных форм, расположение элементов, запись данных форм после изменения. На клиенте отображается уже подготовленная на сервере форма, выполняется ввод данных и вызовы сервера для записи введенных данных и других необходимых действий. Командный интерфейс и отчеты также полностью формируются на сервере и отображаются на клиенте (рис. 1.30).
Использование встроенного языка на клиенте Управлять функциональностью форм можно не только на сервере, но и на клиенте. На клиенте также поддерживается работа встроенного языка, но в строго ограниченном объеме. Он используется в тех случаях, когда необходимо провести расчеты, связанные с отображенной на экране формой, например, быстро (без обращения к серверу) подсчитать сумму строки документа на основе цены и количества, задать пользователю вопрос и обработать ответ, прочитать файл из файловой системы компьютера и отправить его на сервер. Клиентские процедуры в модулях в явном виде отделяются от серверных, и в них используется ограниченный состав объектной модели встроенного языка. На клиенте не допускается непосредственная работа с базой данных, а также работа непосредственно с прикладными объектами, например, недоступны такие типы встроенного языка, как СправочникОбъект.. На клиенте невозможно использовать запросы. При необходимости вызова действий с данными в клиентском коде нужно вызывать серверные процедуры, которые, в свою очередь, будут обращаться к данным.
Поддержка различных хранилищ данных В различных вариантах работы (файловый или клиент-серверный) «1С:Предприятие» использует различные хранилища данных. В файловом варианте работы все данные информационной базы хранятся в одном файле – 1Cv8.1CD. Этот файл имеет специальный формат, поддерживаемый системой «1С:Предприятие». Рис. 1.30. Выполнение основной функциональности на сервере
При этом механизмы платформы ориентированы на минимизацию объема данных, передаваемых на клиентский компьютер. Например, данные списков, табличных частей и отчетов передаются с сервера не сразу, а по мере просмотра их пользователем или использования во встроенном языке. На сервере выполняются: запросы к базе данных, запись данных, проведение документов, различные расчеты, выполнение обработок, формирование отчетов, подготовка форм к отображению. На клиенте выполняется: получение и открытие форм, отображение форм, «общение» с пользователем (предупреждения, вопросы…), небольшие расчеты в формах, требующие быстрой реакции (например, умножение цены на количество), работа с локальными файлами, работа с торговым оборудованием.
26
В клиент-серверном варианте работы все данные хранятся в базах данных Microsoft SQL Server, PostgreSQL, IBM DB2 или Oracle Database. Бесспорным преимуществом файловой базы данных является простота ее использования и обслуживания, однако она не рассчитана на интенсивную конкурентную работу большого числа пользователей и хранение значительных объемов данных. В то же время использование сторонних СУБД, поддерживаемых «1С:Предприятием», позволяет обеспечить большую пропускную способность системы, хранение значительных объемов данных и надежность использования. Оборотной стороной этих преимуществ является более сложное, по сравнению с файловой базой данных, обслуживание и необходимость использования дополнительного программного обеспечения (в качестве сервера баз данных используются сторонние СУБД, поддерживаемые «1С:Предприятием»).
Профессиональная разработка в системе «1С:Предприятие 8»
Интернационализация
Работа под управлением различных операционных систем Архитектура «1С:Предприятия» поддерживает многоплатформенность, то есть способность системы работать под управлением различных операционных систем. Все основные компоненты платформы способны функционировать как под управлением операционной системы Windows, так и под управлением операционной системы Linux. Благодаря тому, что взаимодействие процессов между собой осуществляется по протоколу TCP/IP, в составе системы могут присутствовать компоненты с различными операционными системами. В общем случае архитектура «1С:Предприятия» позволяет смешивать в одной системе элементы, работающие под управлением различных операционных систем, например, в одной системе может работать тонкий клиент под управлением операционной системы Windows, веб-клиент под управлением Linux в интернет-браузере Mozilla Firefox и веб-клиент под управлением Windows в браузере Internet Explorer (рис. 1.31).
Обновление прикладных решений Одним из важных архитектурных решений «1С:Предприятия» является наличие механизмов обновления прикладных решений. Эти механизмы обеспечивают синхронизацию изменений, сделанных поставщиком прикладного решения, с изменениями, внесенными при внедрении на конкретном предприятии. Они предоставляют мощные функции сравнения и анализа изменений, а также средства управления их синхронизацией. Администратор или разработчик может детально настроить синхронизацию обновлений вплоть до отдельных объектов, отдельных свойств и отдельных процедур модулей. Например, если специалист, отвечающий за сопровождение прикладного решения на предприятии, отметит объекты, которые намерен поддерживать самостоятельно, они не будут в дальнейшем обновляться при установке очередного обновления от поставщика. Если объекты необходимо объединить, то для упрощения синхронизации изменений можно настроить приоритеты такого объединения. В то же время если прикладное решение не изменялось у клиента, то обновление может быть выполнено полностью в автоматическом режиме. Подробнее
Том 2, глава 21, раздел «Механизм поставки и поддержки прикладных решений».
Интернационализация Механизмы интернационализации, заложенные в технологическую платформу «1С:Предприятие», позволяют использовать различные языки, как при разработке прикладного решения, так и при работе пользователей прикладного решения. Кроме этого, на уровне технологической платформы поддерживаются национальные стандарты представления дат, чисел и т. д. Благодаря этому в «1С:Предприятии» возможно создание многоязычных прикладных решений, в которых различные пользователи работают с одной и той же информационной базой, используя интерфейсы на различных языках. Подробнее
Том 2, глава 22, раздел «Многоязычные прикладные решения».
Рис. 1.31. Элементы системы «1С:Предприятие», работающие под управлением различных операционных систем
Том 1
27
Глава 1. Архитектура «1С:Предприятия»
28
Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности прикладных решений
Глава 2. Функциональность «1С:Предприятия» Обзор функциональности прикладных решений
Документы
Значительная часть функциональности прикладных решений, создаваемых на платформе «1С:Предприятие», определяется теми возможностями, которые содержит базовая реализация используемых объектов конфигурации. Не претендуя на полное и глубокое изложение, рассмотрим лишь основные функциональные возможности некоторых объектов конфигурации.
Документы отражают в системе события, происходящие в жизни предприятия: поступление материалов, перечисление денег через банк, прием сотрудника на работу и т. д. Прототип (шаблон) документа обеспечивает их отражение в различных учетных механизмах, поддерживает контроль последовательности обработки событий, реализует сквозную нумерацию объектов разного типа и т. д.
Кроме этого, рассмотрим также и некоторые общие объекты технологической платформы, не реализующие конкретной прикладной специфики, но обеспечивающие важные функциональные возможности для прикладных решений.
Одним из важных функциональных механизмов системы является механизм проведения документов. Он предлагает разработчику стандартную модель организации связи между информацией о событиях, происходящих на предприятии, и различными учетными механизмами. Любая вводимая пользователем в виде документов информация может отражаться в любых учетных механизмах (планировании, управленческом учете, бухгалтерском учете и т. д.). Разработчик должен только указать в свойствах метаданных связь между документами и учетными механизмами, а также описать алгоритм проведения документа.
Справочники Справочники описывают каталоги, содержимое которых более или менее постоянно. Это может быть, например, перечень выпускаемой продукции, список клиентов компании, перечень валют и т. д. Справочники обеспечивают поддержку иерархических структур, позволяют относить данные к отдельным объектам и их группам, предоставляют ряд других сервисных возможностей. Многоуровневая иерархия, поддерживаемая справочниками, включается простой активизацией соответствующего свойства в метаданных. При этом поддержка иерархии распространяется сразу на все аспекты использования прикладного объекта. Например, прототип (шаблон) справочника обеспечивает поддержку необходимых свойств и методов в объектной модели манипулирования данными (определение уровня объекта, контроль зацикливания иерархии и т. д.). В интерфейсных механизмах реализуется представление данных в виде иерархического списка или дерева с навигацией по уровням и интерактивным изменениям иерархии. В механизмах отчетов обеспечивается формирование иерархических документов такого рода и получение многоуровневой иерархии итогов в любых отчетах, в которых объекты этого типа выступают в качестве параметров для группировки. Подробнее
Глава 9 «Хранение информации», стр. 435.
Том 1
Все необходимые действия по проведению и отмене проведения система будет выполнять автоматически. При этом системой предоставляются дополнительные возможности, такие как поддержка отражения событий в реальном времени, поддержка восстановления последовательности отражения событий, происходящих на предприятии, при изменении их задним числом и т. д. В результате предоставляется единая модель связи исходных данных и учетных механизмов, которая не просто облегчает разработку, но и обеспечивает единообразное предсказуемое поведение всех прикладных решений, что существенно облегчает их освоение и поддержку. Подробнее
Глава 10 «Документы и последовательности», стр. 495.
Механизм характеристик Механизм описания характеристик позволяет организовать хранение свойств объектов (справочников, документов и т. д.), которые еще не известны на момент разработки прикладного решения. Таким образом, например, для номенклатуры пользователь сможет самостоятельно вводить новые свойства: цвет, размер, габариты, мощность и т. д.
29
Глава 2. Функциональность «1С:Предприятия» Для каждой группы номенклатуры может быть создан свой набор свойств: для холодильников – объем морозильной камеры, число компрессоров, уровень шума; для компьютеров – объем оперативной памяти, объем жесткого диска; для одежды – размер, рост, цвет. Платформа «1С:Предприятие» позволяет описать дополнительные характеристики объектов конфигурации прямо в дереве метаданных один раз и хранить их в свойстве Характеристики. В дальнейшем на основе этих характеристик можно строить отчеты, анализировать объемы продаж, получать другую информацию для принятия решений. Подробнее
Раздел «Использование плана видов характеристик», стр. 483.
Механизм сведений Механизм хранения сведений, реализованный в платформе «1С:Предприятие», позволяет хранить в прикладном решении произвольные данные в разрезе нескольких измерений. Например, можно хранить курсы валют в разрезе валют или цены предприятия в разрезе номенклатуры и типа цен. Кроме этого, может быть задана различная периодичность хранения сведений, что позволяет хранить не только сами значения, но и историю их изменения. Подробнее
Раздел «Хранение информации в регистрах сведений», стр. 455.
Механизм учета движения средств Механизм учета движения средств (финансов, товаров, материалов и т. д.) позволяет автоматизировать такие направления, как складской учет, взаиморасчеты, планирование. Основу этого механизма составляют регистры накопления. Регистр накопления образует многомерную систему измерений и позволяет «накапливать» числовые данные в разрезе нескольких измерений. Например, в таком регистре можно накапливать информацию об остатках товаров в разрезе номенклатуры и склада или информацию об объемах продаж в разрезе номенклатуры и подразделения компании. Информация из регистров используется в основном в различных экономических и аналитических отчетах. Для более быстрого и эффективного формирования отчетов в платформе реализован механизм агрегатов для оборотных регистров накопления. Это особенно важно для больших информационных баз, содержащих сотни тысяч и миллионы записей
30
в регистрах. Используя механизм агрегатов, система автоматически оценивает интенсивность работы пользователей с теми или иными разрезами информации и на основе накопленной статистики выбирает оптимальный состав поддерживаемых агрегатов. Подробнее
Глава 11 «Учет движения средств», стр. 545.
Механизм бухгалтерского учета Механизмы бухгалтерского учета позволяют реализовать систему двойной записи бухгалтерского учета. Они не навязывают разработчику собственно принципов ведения бухгалтерского учета и позволяют создавать модели учета, применимые как в России, так и в других странах. Можно перечислить следующие основные возможности, реализуемые механизмами бухгалтерского учета: ■■ ведение многоуровневых планов счетов с произвольной иерархией, в которых поддерживается фиксированная или переменная разрядность кодов счетов; ■■ ведение аналитического учета в нескольких разрезах и уровнях; ■■ ведение учета одновременно по нескольким планам счетов; ■■ ведение консолидированного учета по нескольким юридическим лицам; ■■ возможность указания для отдельных разрезов аналитики произвольного числа видов учета, таких как количественный, суммовой, валютный учет и т. д. Подробнее
Глава 12 «Бухгалтерский учет», стр. 613.
Механизм сложных периодических расчетов Механизм сложных периодических расчетов позволяет реализовывать различные модели расчета заработной платы. Работа механизма основана на двух составляющих. С одной стороны, механизм сложных периодических расчетов содержит средства для описания различных видов расчета, которые будут использоваться в прикладном решении. Например, это могут быть такие виды расчета, как оклад, алименты, штраф и т. д. Помимо собственно описания этих видов расчета, существует возможность задать правила, по которым одни виды расчета будут влиять на другие виды расчета. Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности прикладных решений С другой стороны, этот механизм предоставляет возможность хранения промежуточных данных, которые используются для выполнения расчетов, и конечных результатов расчетов. Расчет зарплаты является наиболее типичным применением данного механизма, но сам механизм не имеет ориентации именно на эту задачу и успешно используется для решения других задач, требующих описания периодических расчетов со сложными взаимосвязями, например, расчета дивидендов, стоимости коммунальных услуг и т. д. Подробнее
Том 2, глава 13 «Сложные периодические расчеты».
Механизм бизнес-процессов Механизм бизнес-процессов позволяет описывать, создавать и управлять выполнением бизнес-процессов в прикладных решениях. Целью этого механизма является автоматизация цепочек связанных операций, направленных на достижение общей цели, обычно в контексте организационной структуры, определяющей функциональные роли и связи. Этот механизм включает средства для описания в прикладном решении схем бизнес-процессов и их ролевой маршрутизации для формирования заданий, выполняющихся в каждой точке маршрута, для управления бизнес-процессом и организации его связи с другими функциями прикладного решения. Важно отметить, что данный механизм предлагает готовую стратегию автоматизации совместной деятельности работников предприятия. Для описания простейших бизнес-процессов достаточно визуально задать схемы маршрута и указать условия ветвления в их узловых точках. Все остальные действия выполняются системой автоматически. При реализации сложных бизнес-процессов усилия разработчика требуются в основном для тесной их увязки с функциями прикладного решения. Подробнее
Том 2, глава 14 «Бизнес-процессы».
Механизм анализа данных и прогнозирования
Этот механизм поддерживает выполнение нескольких типов анализа данных, таких как общая статистика, поиск ассоциаций, дерево решений, поиск последовательностей, кластерный анализ. Подробнее
Том 2, глава 15 «Анализ данных и прогнозирование».
Сложные отчеты, использующие систему компоновки данных Для формирования сложных экономических и аналитических отчетов платформа «1С:Предприятие» содержит мощный и гибкий механизм – систему компоновки данных. Отчеты строятся на основе схемы компоновки данных – специального макета отчета, содержащего его декларативное описание. Схема компоновки данных создается разработчиком и содержит описание наборов данных (источников информации для отчета) и связей между ними, параметров получения данных, полей отчета и т. п., а также в ней разработчик задает стандартные настройки компоновки данных – структуру отчета, порядок, отбор и др. У каждого отчета разработчик может предусмотреть несколько вариантов настроек, представляющих данные в виде диаграммы, таблицы или группировок, имеющих другой состав полей, итогов и т. п. Разработчик может описать, какие настройки отчета будут доступны пользователю (пользовательские настройки) и какие из этих настроек будут присутствовать прямо в форме отчета (быстрые пользовательские настройки). С их помощью пользователь может настроить вариант отчета под себя и сохранить его для дальнейшего использования. Система компоновки данных предоставляет широкие возможности для настройки оформления отчета и его отдельных элементов – выбор макета оформления (в том числе и собственного), настройка вывода группировок, итогов, заголовка отчета и многое другое. Таким образом, большинство отчетов может быть описано и настроено разработчиком в схеме компоновки данных и не требует написания программного кода.
Механизм анализа данных и прогнозирования позволяет реализовывать в прикладных решениях инструменты для выявления закономерностей, которые обычно скрываются за большими объемами информации.
На основе описания в схеме компоновки данных и стандартных настроек система компоновки данных компонует отчет и выводит его пользователю в виде табличного документа (программным образом данные также можно вывести в таблицу значений, дерево значений и др.).
Например, проанализировав данные о продажах товаров, можно выявить группы товаров, которые обычно покупаются вместе, и при очередной покупке рекомендовать клиенту дополнительные товары, исходя из найденных закономерностей и тех товаров, которые клиент уже выбрал.
Пользователь может выбрать вариант отчета, являющийся с его точки зрения наиболее информативным, а может, при желании и соответствующей квалификации, задать собственные настройки и получить другой отчет, основанный на той же схеме компоновки данных.
Том 1
31
Глава 2. Функциональность «1С:Предприятия» Таким образом, система компоновки данных предоставляет пользователям возможность получать разнообразные необходимые им отчеты быстро, не обращаясь к разработчикам. Система компоновки данных позволяет использовать в отчетах произвольные характеристики объектов информационной базы, предоставляет возможность расшифровывать информацию, содержащуюся в отчете, выводить в отчет иерархические данные и многое другое. Подробнее
Том 2, глава 16 «Сложные аналитические отчеты».
Механизмы презентации текстовых и аналитических данных Технологическая платформа «1С:Предприятие» содержит целый ряд объектов, которые позволяют представлять итоговую информацию в удобном для пользователя виде, обеспечивая при этом в большей или меньшей степени интерактивное взаимодействие. Одним из мощных средств презентации любой информации и вывода ее на печать является табличный документ (рис. 2.1). Он обеспечивает не только эффективную подготовку печатных документов, но и просмотр их на экране в удобном для пользователя виде. Перечислим основные возможности табличного документа:
Рис. 2.1. Табличный документ
Используя форматированный документ, можно создавать фрагменты текста, содержащие различное шрифтовое, цветовое оформление, выравнивание, включающие картинки и гиперссылки. В основном он используется для редактирования в формах в тех случаях, когда текст должен содержать различное шрифтовое, цветовое оформление, гиперссылки и картинки. Например, в формах электронных писем (рис. 2.2).
■■ оформление отчета, включая тип и размер шрифта, цвет текста и фона, тип и цвет рамки, рисунки и т. д.; ■■ использование группировок (как вертикальных, так и горизонтальных), с помощью которых можно отражать промежуточные итоги; ■■ поддержка механизма расшифровок, когда при щелчке на строке или ячейке отчета формируется более детальный отчет или открывается объект базы данных; ■■ использование примечаний, содержащих дополнительную информацию о данных, расположенных в ячейке или области документа; ■■ поддержка сводных таблиц, которые позволяют отобразить многомерные данные в виде плоской таблицы с вложенными заголовками; ■■ поддержка диаграмм различного вида для наглядного представления экономической информации в графическом виде; ■■ возможность сохранения табличного документа в различных форматах; ■■ и др. Рис. 2.2. Форматированный документ
32
Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности прикладных решений Для представления итоговых данных в разрезе их географического положения в «1С:Предприятии» используется специальный объект – географическая схема (рис. 2.3). Она позволяет создавать отчеты, иллюстрирующие, например, объемы продаж тех или иных товаров в различных регионах страны. Также географическая схема может быть использована просто для отображения тех или иных географических данных, например, схемы проезда к офису или маршрута движения транспортного средства.
Рис. 2.3. Географическая схема
■■ ■■ ■■ ■■
круговая (обычная и объемная); биржевая (обычная и «свеча»); изометрическая (обычная, непрерывная и т. д.); поверхностная (каркасная, выпуклая, вогнутая поверхность, сотовая и др.); ■■ радарная (с областями, с накоплением, нормированная и др.); ■■ измерительная диаграмма.
Рис. 2.4. Графическая схема
Графическая схема (рис. 2.4) позволяет создавать различные организационные, структурные и другие схемы для графического оформления прикладного решения. Она предназначена для оформления форм и отчетов, в которых требуется представить те или иные организационные процессы, блок-схемы и пр. Кроме этого, графическая схема может быть использована как отдельный документ, являющийся частью оформления прикладного решения. С помощью графических схем удобно создавать иллюстрации, поясняющие состав тех или иных алгоритмов, структуру тех или иных процессов, организационные схемы и пр. Еще одним объектом, используемым для графического представления данных, является диаграмма (рис. 2.5). Платформа «1С:Предприятие» поддерживает работу с различными видами диаграмм, в том числе: ■■ график (обычный, по шагам, с областями и т. д.); ■■ гистограмма (обычная, с накоплением, объемная и т. д.); Том 1
Рис. 2.5. Круговая объемная диаграмма
33
Глава 2. Функциональность «1С:Предприятия» Диаграммы акцентируют внимание пользователя на динамике изменения данных и помогают быстро производить относительное сравнение данных. Кроме этого, специализированные виды диаграмм могут отражать закономерности, обычно скрытые за большими объемами данных. Одним из специальных видов диаграмм, поддерживаемых платформой, является диаграмма Ганта (рис. 2.6). Она содержит набор интервалов, расположенных на оси времени, и отражает использование объектами (точками) ресурсов (серий). Этот вид диаграммы широко используется для визуализации хода выполнения задач, планирования ресурсов, графика рабочего времени и других данных, которые представляются не конкретными числовыми значениями, а набором временных интервалов.
В системе «1С:Предприятие» имеется целый набор средств, с помощью которых можно: ■■ создавать, обрабатывать и обмениваться данными различных форматов; ■■ осуществлять доступ ко всем объектам системы «1С:Предприятие», реализующим ее функциональные возможности; ■■ поддерживать различные протоколы обмена; ■■ поддерживать стандарты взаимодействия с другими подсистемами; ■■ разрабатывать собственные интернет-решения. Механизмы обмена данными позволяют создавать территориально распределенные информационные системы на основе: ■■ «1С:Предприятия»; ■■ других информационных систем, не основанных на «1С:Предприятии». Обмен данными в системе «1С:Предприятие» реализуется благодаря использованию ряда средств технологической платформы, которые разработчик может применять как по отдельности, так и в различных комбинациях, в зависимости от конкретной решаемой задачи. Такой подход позволяет обеспечить гибкость механизмов обмена и их «настраиваемость» на решение как можно большего круга задач.
Рис. 2.6. Диаграмма Ганта
Диаграмма Ганта имеет гибкую структуру данных. Как точки, так и серии представляют собой иерархические коллекции, что позволяет, например, представить проект как набор связанных иерархических задач. Поддерживается возможность установки связей между различными интервалами диаграммы. Таким образом, окончание одного интервала может быть связано с началом следующего интервала диаграммы. Также поддерживается возможность интерактивного перемещения и растягивания интервалов диаграммы в режиме 1С:Предприятие при помощи мыши. Подробнее
Том 2, глава 17 «Средства графического представления данных».
Средства интеграции и механизмы обмена данными Система «1С:Предприятие» является открытой системой благодаря тому, что технологическая платформа предоставляет возможности для интеграции практически с любыми внешними программами и оборудованием на основе общепризнанных открытых стандартов и протоколов передачи данных.
34
Подробнее
Том 2, глава 18 «Интеграция с другими информационными системами», глава 19 «Обмен данными».
Web-сервисы Механизм Web-сервисов позволяет использовать систему «1С:Предприятие» как набор сервисов в сложных распределенных и гетерогенных системах, а также позволяет интегрировать ее с другими информационными системами с использованием сервис-ориентированной архитектуры (SOA). Конфигурация системы «1С:Предприятие» может экспортировать свою функциональность через Web-сервисы. Web-сервисы определяются в дереве объектов конфигурации и становятся доступны произвольным информационным системам после их публикации на веб-сервере. Кроме того, система «1С:Предприятие» может обращаться к Webсервисам сторонних производителей как через статические ссылки на Web-сервисы, определенные в дереве объектов конфигурации, так и используя динамические ссылки на Web-сервисы, создаваемые с помощью встроенного языка. Подробнее
Том 2, глава 18, раздел «Web-сервисы».
Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности прикладных решений
Web-расширение Одним из средств интеграции, позволяющим расширить сферу применения «1С:Предприятия», является Web-расширение. Данный программный продукт позволяет организовать доступ через веб-интерфейс к функциональности прикладных решений новых категорий пользователей, в том числе и тех, у которых на компьютерах не установлена платформа «1С:Предприятие». Это могут быть мобильные пользователи, сотрудники территориально удаленных подразделений, посетители интернет-магазинов и веб-порталов. Web-расширение позволяет встраивать доступ к данным «1С:Предприятия» в существующие веб-сайты и веб-приложения и создавать готовые веб-приложения и веб-сервисы, использующие информационную базу «1С:Предприятия». Механизмы Web-расширения могут использоваться для решения задач нескольких уровней, в различных комбинациях с другими системами: ■■ реализация веб-доступа к информационной базе «1С:Предприятия»; ■■ встраивание прикладной функциональности «1С:Предприятия» в существующие сайты; ■■ организация доступа к данным «1С:Предприятия» для решения других задач; ■■ организация программного доступа к «1С:Предприятию» из других систем. Подробнее
Том 2, глава 20 «Web-расширение».
Механизм полнотекстового поиска Механизм полнотекстового поиска предоставляет возможность пользователю быстро находить нужную информацию в информационной базе и в справочной системе. Например, позволяет найти все вхождения заданного слова или сочетания слов в данных информационной базы, при этом найденные слова выделяются цветом (рис. 2.7). Механизм полнотекстового поиска основан на использовании двух составляющих: ■■ полнотекстового индекса, ■■ средств выполнения полнотекстового поиска. Поиск осуществляется по тем данным, которые содержатся в полнотекстовом индексе. Полнотекстовый индекс создается один раз и затем должен периодически обновляться (в зависимости от частоты модификации информационной базы). Создание и обновление полнотекстового индекса может выполняться как интерактивно, в режиме 1С:Предприятие, так и программно, средствами встроенного языка. Том 1
Рис. 2.7. Поиск данных в информационной базе
В процессе работы информационной базы система отслеживает факт изменения данных в тех объектах конфигурации, которые могут участвовать в полнотекстовом поиске. Такими объектами являются, например, планы обмена, справочники, документы, планы видов характеристик, планы счетов, планы видов расчета, регистры (сведений, накопления, бухгалтерии, расчета), бизнес-процессы и задачи. Впоследствии при создании или обновлении полнотекстового индекса система анализирует данные, содержащиеся в реквизитах этих объектов, и включает эти данные в полнотекстовый индекс. При этом система «1С:Предприятие» позволяет осуществлять выборочное включение данных прикладных объектов и их реквизитов в полнотекстовый поиск. Также существует возможность ограничить область поиска данными только указанных объектов конфигурации. Собственно полнотекстовый поиск выполняется средствами встроенного языка, например, с помощью обработки. Полнотекстовый поиск выполняется в соответствии с правами пользователя. Таким образом, если какая-то информация недоступна данному пользователю, он не сможет получить ее и при помощи полнотекстового поиска. Результаты полнотекстового поиска возвращаются порциями, и, кроме того, они отсортированы в определенном порядке. Это сделано для того, чтобы с большой долей вероятности пользователь получал требуемые ему данные в начале первой порции результатов поиска.
35
Глава 2. Функциональность «1С:Предприятия» Механизм полнотекстового поиска предоставляет возможность нечеткого поиска с указанием порога нечеткости, выполнения поиска с учетом синонимов русского, английского и украинского языков, возможность использования дополнительных словарей полнотекстового поиска и многое другое.
Механизм криптографии Механизм криптографии позволяет прикладным решениям использовать криптографические операции для обработки данных, хранящихся в информационной базе. Криптографические операции включают методы зашифровывания/расшифровывания информации, системы электронной цифровой подписи и др. Таким образом, с помощью механизма криптографии система «1С:Предприятие» обеспечивает высокую конфиденциальность и аутентичность информации, хранящейся в информационной базе. Механизм криптографии не содержит собственных алгоритмов криптографии, но при этом обеспечивает набор объектов, позволяющих взаимодействовать с внешними модулями криптографии сторонних производителей – криптопровайдерами. Для взаимодействия с криптопровайдерами в операционной системе Windows используется интерфейс CryptoAPI. Таким образом, прикладные решения могут взаимодействовать с любыми криптопровайдерами, поддерживающими этот криптографический интерфейс. Для взаимодействия с модулями криптографии в операционной системе Linux используется непосредственное взаимодействие с установленными компонентами.
Механизм разделения данных Этот механизм позволяет, например, хранить в одной информационной базе данные нескольких независимых друг от друга организаций. При этом для работы с этими данными используется одна и та же конфигурация, находящаяся в этой же информационной базе. Механизм позволяет разделять данные как полностью, так и частично. Например, какая-то информация может быть общей для всех организаций (справочник банков), а какая-то – индивидуальной, видимой и доступной только данной конкретной организации. Например, информация о хозяйственной или финансовой деятельности. Такой подход значительно облегчает администрирование и обновление прикладных решений в тех случаях, когда одно и то же прикладное решение используется для ведения учета разных организаций. Например, когда фирма оказывает услуги по ведению бухгалтерского учета для многих небольших организаций, не имеющих собственной бухгалтерии.
36
Внешние источники данных Платформа «1С:Предприятие» позволяет работать с внешними источниками данных. Это может быть необходимо для использования средств платформы для работы с базами данных, уже существующими на предприятии или для разработки прикладных решений, которым нужно получать данные из внешних баз данных. Механизм работы с внешними источниками данных позволяет получать данные из различных ODBC-источников. При этом в случае получения данных из СУБД, поддерживаемых «1С:Предприятием» (SQL Server, PostgreSQL, IBM DB2 или Oracle Database), обеспечиваются полные возможности платформы в построении запросов, отчетов и т. д. В случае использования ODBC-источников для других СУБД эти возможности могут быть ограничены стандартами самой СУБД. Внешние источники данных описываются в конфигураторе в отдельной ветви объектов конфигурации. Каждый объект, описывающий внешний источник данных, включает таблицы, поля и связи между таблицами. Внешние источники данных поддерживаются в большинстве механизмов платформы: запросы, отчеты, основанные на системе компоновке данных, динамические списки, управляемые формы, встроенный язык и др. Данные внешних источников могут использоваться только на чтение и не могут быть изменены из встроенного языка. Реквизиты объектов конфигурации (например, реквизит справочника) могут иметь ссылочный тип и ссылаться на объектную таблицу внешнего источника данных. При подключении к внешнему источнику данных используются параметры соединения, которые задаются в параметрах сеанса, параметрах пользователя или в общих параметрах. Для управления процессом подключения/отключения и настройкой параметров соединения используется стандартная обработка Управление внешними источниками данных. Кроме того, подключение к внешнему источнику данных выполняется автоматически при обращении к данным внешнего источника, например, при выполнении запроса.
Обзор функциональности средств разработки Состав средств разработки достаточно широк и разнообразен. Это позволяет выполнять полный цикл действий, от создания конфигурации и до получения тиражируемого дистрибутива прикладного решения, не прибегая к помощи каких-либо продуктов сторонних производителей (рис. 2.8). Перечислим основные средства, используемые при разработке прикладных решений «1С:Предприятия». Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности средств разработки Дерево объектов конфигурации является одним из основных инструментов для работы с конфигурацией. Оно представляет состав конфигурации в виде древовидной структуры, каждая ветвь которой описывает определенную составляющую конфигурации и позволяет выполнять различные действия над отдельными объектами конфигурации. Окно редактирования объекта конфигурации позволяет выполнять в числе прочего последовательную установку свойств объекта, что удобно (особенно для начинающих разработчиков), т. к. позволяет задать в первую очередь те свойства объекта, которые могут определять наличие или отсутствие других свойств объекта. Палитра свойств также предоставляет возможность изменять свойства объекта и получать быстрый доступ к информации, связанной с данным объектом. Палитра свойств удобна в использовании для опытных разработчиков, а также тогда, когда необходимо просмотреть или изменить одноименные свойства у различных объектов конфигурации. Окно Дополнительно служит для отображения в едином списке свойств объекта, относящихся к различным объектам конфигурации. В этом окне можно настраивать вхождение команд объекта в командный интерфейс, просматривать и изменять включение объекта конфигурации в подсистемы, редактировать связи с функциональными опциями, настраивать права и выполнять другие действия.
Конструкторы и редакторы В состав средств разработки входит довольно большое количество конструкторов и редакторов. Конструкторы позволяют автоматизировать и облегчить создание некоторых часто используемых элементов прикладного решения, модификация которых может быть формализована. Как правило, эти элементы прикладного решения могут быть созданы и без использования конструктора, но конструктор позволяет сделать это быстрее и легче. Рис. 2.8. Состав средств разработки
Объекты конфигурации и инструменты для их редактирования Прежде всего, это, конечно же, сами объекты конфигурации и инструменты для их редактирования – дерево объектов конфигурации, окно редактирования объекта конфигурации, палитра свойств и окно Дополнительно. С помощью этих инструментов выполняется добавление, удаление объектов конфигурации, изменение их свойств, установка связей с другими объектами конфигурации и пр. Том 1
Например, текст запроса может быть полностью написан самим разработчиком. Для этого разработчик должен хорошо знать синтаксис языка запросов и понимать назначение различных предложений языка запросов. В то же время текст запроса можно создать с помощью конструктора запросов. При этом используется визуальное конструирование запроса, когда с помощью мыши необходимо выбрать и перетащить нужные таблицы, поля, установить связи между ними и т. д. После нажатия кнопки ОК конструктор запроса создаст синтаксически верный текст запроса. Кроме того, можно использовать конструктор запроса с обработкой результата, который позволяет создать готовый фрагмент кода для получения данных с помощью запроса и вывода их, например, в табличный документ.
37
Глава 2. Функциональность «1С:Предприятия» Можно перечислить, например, следующие конструкторы, присутствующие в интерфейсе разработки и администрирования: ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■
конструктор запроса, конструктор запроса с обработкой результата, конструктор движений регистров, конструктор печати, конструктор ввода на основании, конструктор форм объектов конфигурации, конструктор макета, конструктор форматной строки, конструктор строк на разных языках, конструктор агрегатов, конструктор схемы компоновки данных, конструктор настроек компоновки данных, конструктор макета оформления компоновки данных, конструктор ограничения доступа к данным.
Редакторы позволяют создавать и изменять элементы прикладного решения, модификацию которых затруднительно формализовать или для которых подобная формализация не имеет практического смысла. Например, конструктор форм объектов конфигурации позволяет создать некоторую типовую форму объекта, разместить на ней необходимые поля, назначить источники данных и т. д. Этот процесс легко формализуется и потому может быть выполнен конструктором. Однако дальнейшее редактирование формы, как правило, является процессом творческим и формализации не поддается. Поэтому платформа предоставляет в распоряжение разработчика редактор форм, с помощью которого он придает форме нужный вид, располагает дополнительные элементы управления, настраивает при необходимости привязки и т. д. в соответствии с конкретным назначением формы. Можно перечислить, например, следующие редакторы, реализованные в интерфейсе разработки и администрирования: ■■ ■■ ■■ ■■ ■■ ■■ ■■
редактор форм, редактор текстов и модулей, редактор командного интерфейса конфигурации, редактор рабочей области рабочего стола, редактор командного интерфейса рабочего стола, редактор командного интерфейса, редактор «Все подсистемы»,
38
■■ ■■ ■■ ■■ ■■ ■■ ■■
редактор роли, редактор «Все роли», редактор «Все ограничения доступа», редактор табличных документов, редактор графической схемы, редактор картинок, HTML-редактор.
Синтакс-помощник Синтакс-помощник позволяет получать справку по использованию конструкций встроенного языка, свойствам, методам и событиям объектов встроенного языка (как поставляемых непосредственно платформой, так и создаваемых наследованием от прототипов объектов конфигурации), а также справку по составу таблиц, являющихся источниками данных в языке запросов. Синтакс-помощник может быть использован как самостоятельно, так и в связке с редактором текстов и модулей. Находясь в тексте модуля, можно, используя сочетание клавиш, перейти к описанию соответствующего свойства, метода, функции и т. д. в синтакс-помощнике, а конструкции встроенного языка, описанные в синтакс-помощнике, в свою очередь, могут быть перенесены в текст модуля с помощью мыши.
Отладчик и режим замера производительности Среди средств разработки, используемых наиболее часто и интенсивно, можно отметить также отладчик и режим замера производительности. Отладчик позволяет проанализировать работу прикладного решения, выполнить остановку в указанном месте кода на встроенном языке, просмотреть значения переменных, состояние используемых объектов в определенные моменты работы, выполнить фрагмент кода по шагам и т. д. Режим замера производительности используется для того, чтобы проанализировать эффективность выполнения участка кода, узнать время, затраченное на выполнение каждой строки этого участка кода (как абсолютное, так и относительное, в процентах к общему времени выполнения всего участка). Таким образом можно определить операторы, выполнение которых занимает основное количество времени, и попытаться оптимизировать используемый алгоритм. Подробнее
Том 2, глава 22, раздел «Отладка прикладных решений».
Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности средств разработки
Проверка конфигурации
Групповая разработка прикладных решений
Режим проверки конфигурации позволяет выявить ошибки, которые не являются критичными для функционирования прикладного решения в принципе, но наличие которых может существенно снизить скорость работы прикладного решения или даже привести к возникновению ошибок при работе в некоторых специальных режимах. Использование этого режима не является обязательным, но может оказаться очень полезным, например, для проверки конфигурации перед поставкой заказчику, перед выпуском тиражного решения, для проверки после массированного удаления объектов или после объединения конфигураций.
Механизм групповой разработки позволяет вести и версионировать разработку прикладных решений группе разработчиков, внося изменения в конфигурацию одновременно, по мере выполнения каждым из них своего участка работы.
Сравнение/объединение конфигураций
Механизм поставки и поддержки прикладных решений служит для автоматизации процесса поддержки разработчиками прикладного решения, используемого пользователем. Задача поставки и поддержки заключается в создании новых версий прикладного решения и обновления той версии прикладного решения, которая находится у пользователей.
Механизм сравнения/объединения конфигураций позволяет выполнять, например, детальный анализ отличий между разными версиями одного и того же прикладного решения. Также с помощью этого механизма можно выполнять переход от одной версии прикладного решения к другой версии того же или другого прикладного решения. При этом разработчик имеет возможность задать различные правила объединения для различных элементов прикладного решения, указывая, какой элемент должен быть взят из новой версии, какой оставлен без изменений, а какие элементы, например, должны быть объединены и содержать как старый, так и новый варианты. После нажатия кнопки Выполнить платформа автоматически выполнит объединение в соответствии с правилами, заданными разработчиком. Использование механизма сравнения/объединения конфигураций позволяет избежать ручной модификации конфигурации (и связанного с этим большого количества ошибок) при переносе изменений из одной конфигурации в другую, а также значительно ускорить этот процесс.
Редактирование текстов интерфейса Платформа «1С:Предприятие» позволяет создавать многоязычные прикладные решения, в которых каждый пользователь может работать с интерфейсом на своем родном языке. Для того чтобы помочь разработчику при создании многоязычных прикладных решений, в состав средств разработки входит механизм редактирования текстов интерфейса. Этот механизм позволяет найти и сгруппировать все вхождения той или иной строки в конфигурации и в одно нажатие заменить их или добавить аналог этой строки на другом языке. Кроме этого, механизм позволяет переносить строки на разных языках из одного прикладного решения в другое. Подробнее
Том 2, глава 22, раздел «Редактирование текстов интерфейса».
Том 1
Подробнее
Том 2, глава 22, раздел «Групповая разработка прикладных решений».
Поставка и поддержка прикладных решений
Подробнее
Том 2, глава 21, раздел «Механизм поставки и поддержки прикладных решений».
Создание дистрибутивов Механизм создания дистрибутивов позволяет разработчику создать комплект поставки – набор файлов, предназначенных для установки на компьютере пользователя. Комплект поставки включает в себя программу установки Setup.exe и набор файлов поставки, сжатых в архив. Для установки прикладного решения пользователю достаточно запустить на своем компьютере программу установки, входящую в комплект поставки, и следовать инструкциям, появляющимся на экране. Программа установки имеет стандартный интерфейс и помогает пользователю установить все компоненты прикладного решения. Подробнее
Том 2, глава 21, раздел «Механизм создания комплектов поставки».
Функциональные опции Функциональные опции позволяют разработчику выделить некоторую часть функциональности прикладного решения, которую можно оперативно включать или выключать на этапе внедрения и/или в процессе работы системы. Объекты конфигурации и их реквизиты можно привязать к функциональным опциям, добавленным в конфигурацию. Отображение этих
39
Глава 2. Функциональность «1С:Предприятия» объектов в интерфейсе приложения зависит от того, включена связанная с ними функциональная опция или нет. Функциональные опции могут использоваться с параметрами. В этом случае вид конкретной формы может зависеть от значения параметра, выбранного в форме. Таким образом, в зависимости от потребностей конкретной организации внедренец или администратор прикладного решения в режиме 1С:Предприятие может включить или выключить определенные функциональные опции, ограничив тем самым функциональность прикладного решения задачами, решаемыми конкретным пользователем.
Показатели производительности и режим имитации задержек при вызове сервера В процессе отладки и работы конфигурации разработчик может использовать показатели производительности и режим имитации задержек при вызове сервера в качестве инструментов для оптимизации клиентсерверного взаимодействия в разрабатываемом прикладном решении. Показатели производительности прикладного решения позволяют разработчику оценить, насколько эффективно работает прикладное решение. Они отражают информацию о количестве текущих и накопленных вызовов сервера, длительности вызовов сервера, объеме принятых и отправленных данных. Окно показателей производительности всплывает в левом нижнем углу монитора при выполнении каких-либо действий, приводящих к вызову сервера в процессе работы «1С:Предприятия». Это окно можно мышью перетащить в любое другое место экрана. При запуске сеанса «1С:Предприятия» из конфигуратора отображение показателей производительности включено по умолчанию. В текущем сеансе в режиме 1С:Предприятие также можно включить отображение окна показателей производительности. Установить данный режим можно также при запуске «1С:Предприятия» из командной строки с соответствующим параметром. Режим имитации задержек при вызове сервера позволяет разработчику оценить реальную скорость работы его прикладного решения у клиента. При включении этого режима платформа (даже в файловом варианте на локальном компьютере) будет работать с теми временными задержками, с которыми работает реальный канал связи. Установка режима имитации задержек при вызове сервера позволяет разработчику превратить быстрый канал связи в медленный. Причем сделать это можно как при запуске приложения в настройках конфигуратора, так и в процессе его работы в режиме 1С:Предприятие. При этом режим,
40
в котором было запущено приложение, не изменится. Однако включить режим имитации задержек при вызове сервера можно только для тонкого клиента и толстого клиента, запущенного в режиме управляемого приложения. Установить данный режим можно также при запуске «1С:Предприятия» из командной строки с соответствующим параметром. Подробнее
Раздел «Инструменты, используемые при оптимизации клиентсерверного взаимодействия», стр. 392.
«1С:Библиотека стандартных подсистем 8.2» «1С:Библиотека стандартных подсистем 8.2» (БСП) – это инструмент, облегчающий разработку прикладных решений. Она содержит набор универсальных функциональных подсистем и технологию для разработки прикладных решений на платформе «1С:Предприятие 8.2». С помощью библиотеки стандартных подсистем можно быстро создавать новые конфигурации с уже готовой базовой функциональностью, а также включать готовые функциональные блоки в существующие конфигурации. Подсистемы, содержащиеся в библиотеке стандартных подсистем, включают различные области разработки: администрирование информационной базы, администрирование пользователей системы, настройка доступа к данным информационной базы, ведение различной нормативносправочной информации (адресный классификатор, курсы валют, календарные графики и пр.). БСП предоставляет базовые пользовательские и программные интерфейсы для работы с задачами и бизнес-процессами, прикрепляемыми файлами и электронными цифровыми подписями, контактной информацией, дополнительными реквизитами и сведениями, почтовыми сообщениями и пр. Они могут быть использованы в разрабатываемой конфигурации как все вместе, так и по отдельности.
Обзор функциональности средств администрирования Средства администрирования, входящие в состав интерфейса разработки и администрирования, позволяют управлять составом пользователей информационной базы, осуществлять регламентные операции по ее обслуживанию и выполнять другие административные действия (рис. 2.9). Перечислим основные средства, используемые для администрирования информационных баз «1С:Предприятия».
Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности средств администрирования Система поддерживает два вида аутентификации: аутентификация «1С:Предприятия» и аутентификация операционной системы, которые могут использоваться в зависимости от конкретных задач, стоящих перед администратором информационной базы. В случае аутентификации средствами «1С:Предприятия» в конфигураторе для каждого пользователя в списке задается пароль. Для выполнения аутентификации средствами «1С:Предприятия» пользователь при начале работы с прикладным решением должен выбрать (или ввести) имя пользователя и соответствующий этому имени пароль. В случае аутентификации средствами операционной системы в конфигураторе для пользователя выбирается один из пользователей операционной системы. Система анализирует, от имени какого пользователя операционной системы выполняется подключение к прикладному решению, и на основании этого определяет соответствующего пользователя «1С:Предприятия». При этом диалог аутентификации «1С:Предприятия» не отображается, если не указан специальный параметр командной строки.
Механизм заданий
Рис. 2.9. Состав средств администрирования
Список пользователей Платформа «1С:Предприятие» позволяет вести список пользователей, которым разрешена работа с данной информационной базой. Этот список не является частью прикладного решения, а создается отдельно, в каждой конкретной организации, в которой используется прикладное решение. Существует возможность добавлять, удалять пользователей системы, назначать им различные виды аутентификации, набор ролей, доступных в системе, режим запуска приложения, язык пользователя и пр.
Механизмы аутентификации Механизм аутентификации позволяет определить, кто именно из пользователей, перечисленных в списке пользователей, подключается к прикладному решению. Эта информация может быть в дальнейшем использована для выбора соответствующего командного интерфейса пользователя, разрешения доступа к той или иной информации и пр. Том 1
Механизм заданий предназначен для выполнения административных действий по расписанию. Механизм заданий включает в себя фоновые и регламентные задания. Каждое задание представляет собой некоторую последовательность действий, описанных с помощью встроенного языка, содержащуюся в общих модулях. Фоновые задания позволяют инициализировать выполнения процедур общих модулей асинхронно (без ожидания завершения). Регламентные задания позволяют организовать автоматический вызов процедур общих модулей по расписанию. Механизм фоновых заданий реализуется средствами встроенного языка. Регламентные задания описываются на этапе конфигурирования и являются составной частью конкретного прикладного решения.
Система прав доступа Для каждого конкретного прикладного решения система «1С:Предприятие» позволяет описать наборы прав, соответствующие должностям пользователей или виду деятельности. Структура прав определяется конкретным прикладным решением. Все права, поддерживаемые системой «1С:Предприятие», можно разделить на две большие группы: основные и интерактивные. Основные права описывают действия, выполняемые над элементами данных системы или над всей системой в целом, и проверяются всегда, независимо от способа
41
Глава 2. Функциональность «1С:Предприятия» обращения к данным. Интерактивные права описывают действия, которые могут быть выполнены пользователем интерактивно. Соответственно, проверяются они только при выполнении интерактивных операций стандартными способами, причем в клиент-серверном варианте все проверки прав (кроме интерактивных) выполняются на сервере.
какие документы изменялись определенным пользователем в заданный промежуток времени. Также журнал регистрации может быть полностью или частично выгружен в формат XML для программного анализа.
Ограничение прав на уровне записей и полей
Команды загрузки/выгрузки информационной базы позволяют сохранить информационную базу в файл на диске или загрузить информационную базу из файла. Эти команды используются, например, для того, чтобы перенести базу из файлового варианта в клиент-серверный и обратно.
Среди действий над объектами, хранящимися в базе данных, есть действия, отвечающие за чтение или изменение информации, хранящейся в базе данных. К таким действиям относятся: ■■ чтение – получение записей или их фрагментов из таблицы базы данных; ■■ добавление – добавление новых записей без изменения существующих; ■■ изменение – изменение существующих записей; ■■ удаление – удаление некоторых записей без внесения изменений в оставшиеся. Для этих действий могут быть заданы дополнительные условия на данные (ограничение доступа к данным). В этом случае над конкретным объектом, хранимым в базе данных, может быть выполнено запрошенное действие только в том случае, если ограничение доступа к данным для данных этого объекта принимает значение Истина. Аналогичные условия могут быть заданы и для таблиц базы данных, не имеющих объектной природы (регистров). Ограничение доступа к данным представляет собой условие, описанное на языке, который является подмножеством языка запросов. Это условие применяется для каждой записи таблицы базы данных, над которой выполняется операция. При просмотре списков и формировании отчетов существует возможность обеспечить отображение только тех данных, доступ к которым пользователю разрешен.
Журнал регистрации Для хранения информации о событиях, происходящих в информационной базе, система «1С:Предприятие» ведет журнал регистрации. Администратор информационной базы имеет возможность настроить уровень событий, которые будут отображаться в журнале регистрации (ошибки, и/или предупреждения, и/или информация, и/или примечания). Просмотр журнала регистрации может быть выполнен с помощью специального фильтра, позволяющего отбирать информацию по большому количеству критериев. Например, можно отобрать только информацию о том,
42
Загрузка/выгрузка информационной базы
Утилита администрирования кластера серверов Утилита администрирования кластера серверов используется при работе в клиент-серверном варианте и позволяет выполнять такие действия, как: ■■ создание, изменение и удаление кластеров серверов; ■■ модификация существующих кластеров: создание, изменение параметров и удаление рабочих серверов, рабочих процессов кластера, информационных баз, входящих в состав кластера; ■■ управление списками администраторов центральных серверов кластеров и списками администраторов кластеров; ■■ мониторинг соединений пользователей с информационными базами и служебных соединений; ■■ отключение пользователей от информационной базы; ■■ мониторинг объектных блокировок «1С:Предприятия» и блокировок клиентского соединения; ■■ оперативный анализ транзакционных блокировок системы управления базами данных; ■■ управление блокировкой установки соединений пользователей с информационной базой; ■■ управление блокировкой выполнения регламентных заданий. Утилита представляет собой подключаемый модуль MMC (Microsoft Management Console) и может быть использована на компьютерах, на которых установлено соответствующее программное обеспечение (для операционных систем Windows 2000/XP/Server 2003 это программное обеспечение является стандартным). Подробнее
Раздел «Управление кластером серверов», стр. 42.
Профессиональная разработка в системе «1С:Предприятие 8»
Обзор функциональности средств администрирования
«1С:Корпоративный инструментальный пакет» Этот продукт предназначен для повышения производительности, масштабируемости и надежности информационных систем на платформе «1С:Предприятие». Он используется для нагрузочного тестирования и последующего сопровождения крупных корпоративных систем. Продукт «1С:КИП» включает в себя следующие инструменты: ■■ 1С:Центр управления производительностью – инструмент мониторинга и анализа производительности информационных систем на платформе «1С:Предприятие». Этот инструмент предназначен для оценки производительности системы, сбора подробной технической информации об имеющихся проблемах производительности и анализа этой информации с целью дальнейшей оптимизации;
Том 1
■■ 1С:Тест-центр – инструмент автоматизации многопользовательских нагрузочных испытаний информационных систем на платформе «1С:Предприятие». С его помощью можно моделировать работу предприятия без участия реальных пользователей, что позволяет оценивать применимость, производительность и масштабируемость информационной системы в реальных условиях; ■■ 1С:Центр контроля качества. Инструмент позволяет гарантировать эффективную и надежную работу системы на платформе «1С:Предприятие» за счет своевременного и правильного технического обслуживания системы. Это особенно важно для внедрений с высокими требованиями по производительности и надежности системы.
43
Глава 2. Функциональность «1С:Предприятия»
44
Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации
Глава 3. Использование встроенного языка Как уже говорилось выше, прикладное решение «1С:Предприятия» представляет собой определенную структуру метаданных, которая исполняется технологической платформой. В то же время технологическая платформа содержит в себе интерфейс разработки и администрирования, позволяющий создавать новые и модифицировать существующие прикладные решения. Разработка прикладного решения заключается по большому счету в двух основных действиях: визуальном конструировании объектов конфигурации и описании специфического поведения системы с использованием встроенного языка и языка запросов. Создание нового прикладного решения начинается с добавления новой информационной базы в список баз «1С:Предприятия». При этом платформа создает некую «базовую» структуру метаданных, которая уже представляет собой работоспособное прикладное решение. В соответствии с этой структурой метаданных платформа также создает ряд информационных структур (таблиц), обеспечивающих работу этой конфигурации и хранение данных. Информационные структуры создаются в том варианте работы, который выбран пользователем (например, файловый или клиент-серверный). Таким образом, разработчик начинает создание прикладного решения не с нуля, а с некоторой «базовой» структуры метаданных (пустой конфигурации), которую он может изменять в соответствии со своими потребностями. Следующим шагом в разработке прикладного решения является, как правило, создание структур для хранения данных. Отличительной особенностью разработки в системе «1С:Предприятие» является то, что платформа изолирует разработчика от физических деталей хранения данных, предлагая более высокий уровень абстракции – уровень объектов метаданных. Другими словами, разработчик добавляет в структуру метаданных нужные ему объекты, определяет, например, какие реквизиты и табличные части будет содержать тот или иной объект. Платформа же анализирует изменения, выполняемые разработчиком, и создает в информационной базе соответствующие информационные структуры, позволяющие хранить и эффективно использовать данные. В результате, с точки зрения разработчика, процесс создания прикладного решения в файловом или в клиент-серверном варианте выглядит совершенно одинаково, так как он Том 1
не оперирует физическими таблицами базы данных, а имеет дело с более абстрактными сущностями – объектами метаданных. Таким образом, вся структура хранимых данных описывается средствами визуального конфигурирования и не может быть изменена в процессе работы прикладного решения (в реальном режиме времени). Такой подход позволяет платформе контролировать целостность информационной базы и данных, которые в ней хранятся. Платформе известно о назначении того или иного объекта конфигурации, она знает, в каких таблицах должны храниться данные этого объекта, и обладает информацией о том, как эти данные должны взаимодействовать с данными других объектов конфигурации. Таким образом, с одной стороны ограничивая разработчика в динамической модификации структуры информационной базы, она значительно облегчает задачу создания и модификации прикладного решения, избавляя разработчика от необходимости самостоятельно контролировать правильность таблиц информационной базы и их связей. Другим положительным моментом такого подхода является то, что структура прикладного решения становится прозрачной и легко читаемой. Любому разработчику, не принимавшему непосредственного участия в разработке данного решения, достаточно взглянуть на структуру объектов метаданных, чтобы понять в общих чертах, как оно устроено. Открыв конфигуратор, он увидит привычный набор объектов метаданных, назначение каждого из которых ему хорошо известно. Ограниченный набор объектов конфигурации, которые может использовать разработчик, является еще одной особенностью прикладных решений «1С:Предприятия». Платформа поддерживает фиксированный набор прототипов объектов метаданных (например, справочник, документ, регистр накопления, бизнес-процесс и т. д.). Разработчик не имеет возможности каким-либо образом создать собственный объект конфигурации (например, просто таблицу, содержащую набор колонок). Он может только добавить в прикладное решение новый объект конфигурации, соответствующий одному из прототипов, поддерживаемых системой (например, регистр сведений, обладающий набором реквизитов). Такой подход позволяет создать среду описания прикладных решений, состоящую из логических сущностей, одинаковых для всех прикладных решений (рис. 3.1).
45
Глава 3. Использование встроенного языка В этом случае разработчик имеет возможность использовать встроенный язык «1С:Предприятия» для того, чтобы определить поведение прикладного решения, отличное от стандартного. С помощью встроенного языка разработчик может «вмешиваться» в работу прикладного решения: выполнять какие-либо алгоритмы, обрабатывать и модифицировать данные, изменять или вообще отменять стандартные действия системы в зависимости от тех или иных результатов работы. Ключевым моментом здесь является то, что подобное «вмешательство» возможно не всегда, а только в определенные моменты работы прикладного решения. Таким образом, встроенный язык не является неким универсальным языком программирования, с помощью которого создаются прикладные решения, а служит лишь для описания особенных алгоритмов работы прикладного решения.
Модули конфигурации Для размещения текста программы на встроенном языке предназначены модули прикладного решения (например, модуль приложения, общие модули, модули объектов, модули форм, модули команд, модули менеджеров и т. д.). Эти модули располагаются в различных местах конфигурации и имеют различное назначение. Рис. 3.1. Сравнение логических уровней приложения
Добавление новых объектов конфигурации в прикладное решение сразу же позволяет использовать их для ввода и модификации информации. Технологическая платформа «знает», как работать с данными того или иного объекта конфигурации, и в определенные моменты работы прикладного решения самостоятельно может сгенерировать нужные формы для работы с данными. Таким образом, все объекты конфигурации, которые может использовать разработчик, обладают некоторым базовым поведением, которое реализуется платформой без участия разработчика. В простейшем варианте создание функционального и работоспособного прикладного решения возможно исключительно средствами визуального конструирования, без написания какого-либо текста программы. Платформа проанализирует состав объектов конфигурации и обеспечит все необходимые функции для работы с ними. Однако реальные задачи, решаемые с помощью системы «1С:Предприятие», всегда требуют наличия в прикладном решении некоторых алгоритмов, специфичных для автоматизируемой области. Это могут быть, например, различные алгоритмы расчета себестоимости, контроля остатков, распределения средств и т. д. Также возникает необходимость в создании специфических форм, обладающих нестандартным поведением, поскольку удобное визуальное представление информации является одной из наиболее важных задач для любого прикладного решения.
46
Большинство модулей привязано к определенным объектам конфигурации (например, к формам) или к самому прикладному решению (например, модуль управляемого приложения). Такие модули вызываются в определенные моменты работы прикладного решения (например, модуль управляемого приложения, который запускается при запуске системы «1С:Предприятие» в режиме управляемого приложения, или модуль объекта справочника Номенклатура, который запускается при создании объекта (элемента) справочника). Таким образом, если модуль содержит некоторый код, то этот код будет выполнен и работа прикладного решения продолжена. В таких модулях могут располагаться процедуры обработки событий, определенных для различных объектов прикладного решения. Эти процедуры также будут выполняться при наступлении соответствующего события. Наряду с модулями, вызываемыми в процессе работы прикладного решения, существуют общие модули, которые сами по себе не вызываются в процессе работы прикладного решения. Они служат лишь для размещения в них текстов функций и процедур, которые могут вызываться из других модулей прикладного решения. Таким образом, код, располагающийся в общих модулях, будет исполнен только тогда, когда к нему будет выполнено явное обращение из другого модуля конфигурации или из командного интерфейса. Каждый модуль связан с остальной частью конфигурации, и эта связь называется контекстом выполнения модуля. Контекст определяет Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации «программное окружение», в котором исполняется код модуля, – набор доступных для модуля объектов, переменных, процедур и функций. Для всех программных модулей доступен глобальный контекст задачи. Он образуется значениями свойств и методов глобального контекста, а также системными перечислениями и системными наборами значений. С другой стороны, почти все модули конфигурации (за исключением модуля сеанса и модуля команды), показанные на следующей схеме стрелками, поставляют в глобальный контекст свои экспортируемые процедуры/функции (рис. 3.2).
Рис. 3.3. Программные компоненты «1С:Предприятия» в клиент-серверном варианте работы
При этом физически все программные компоненты в клиент-серверном варианте работы «1С:Предприятия» могут располагаться как на одном компьютере, так и на разных. Подробнее
Глава 5 «Клиент-серверный вариант работы», раздел «Варианты использования», стр. 121.
Наличие серверного и клиентского контекста исполнения модулей определяет следующие особенности.
Рис. 3.2. Контексты прикладного решения
Локальный контекст модуля образуется тем конкретным местом конфигурации задачи, для которого использован программный модуль. Локальный контекст виден только конкретному программному модулю и определяет для модуля набор непосредственно доступных ему объектов, их свойств и методов. Подробнее
Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 4.2 «Формат исходных текстов программных модулей».
Контекст исполнения модулей С точки зрения места исполнения модуля существует понятие «контекст исполнения модулей», определяющий программную среду, в которой выполняется модуль. Для клиент-серверного варианта работы «1С:Предприятия» таких контекстов два – контекст клиента и контекст сервера (рис. 3.3). Том 1
Во-первых, в контексте клиента (на клиенте) и в контексте сервера (на сервере) доступны разные свойства, методы и объекты встроенного языка. Все действия, связанные с доступом к данным (их чтение и запись), возможны только на сервере, а отображение этих данных пользователю и другие интерактивные действия возможны только на клиенте. Поэтому клиентские процедуры в модулях в явном виде отделяются от серверных, и в них используется ограниченный состав объектной модели встроенного языка. Во-вторых, реальным вариантом работы клиент-серверного варианта будет ситуация, когда все программные компоненты «1С:Предприятия» расположены на отдельных компьютерах. Как правило, сервер «1С:Предприятия» и сервер СУБД находятся в пределах одной локальной сети, а вот клиентский компьютер с клиентским приложением может находиться как в этой же сети, так и подключаться к серверу через Интернет с использованием самых разных каналов связи с разной скоростью передачи информации. В процессе работы «1С:Предприятия» клиентское приложение все время вызывает сервер для выполнения каких-либо действий, сервер выполняет их и возвращает управление и результат этих действий обратно, на клиента. Механизмы платформы оптимизируют клиент-серверное взаимодействие для того, чтобы обеспечить приемлемую скорость работы системы даже на низкоскоростных каналах связи. Поэтому разработчик, организующий клиент-серверное взаимодействие путем вызова серверных процедур
47
Глава 3. Использование встроенного языка из процедур, исполняющихся на клиенте, также должен стремиться к такой оптимизации. Подробнее
Раздел «Оптимизация клиент-серверного взаимодействия в формах», стр. 391.
Общий модуль В конфигурации может быть определено произвольное количество общих модулей, в том числе и ни одного. Контекст общего модуля образуется глобальным контекстом и локальным контекстом самого общего модуля, т. е. процедурами и функциями, определенными внутри общего модуля. Поскольку общий модуль не исполняется системой непосредственно, в нем отсутствует раздел описания переменных и раздел основной программы. Общий модуль может содержать только определения процедур и функций. Если процедуры или функции общего модуля определены как экспортируемые, то они становятся частью глобального контекста и будут доступны другим модулям прикладного решения (за некоторыми исключениями, о которых будет сказано далее). Если у общего модуля установлено свойство Глобальный, то экспортируемые методы общего модуля являются частью глобального контекста, и из встроенного языка можно обращаться к ним по имени, как к другим функциям, методам и свойствам глобального контекста. Если же модуль неглобальный, то при обращении к его экспортируемой процедуре или функции ее имя нужно указывать через точку от имени модуля (например, Обмен.ПолучитьПрефиксНомера()). Последний способ предпочтительнее, так как неглобальные общие модули компилируются по мере обращения к ним, а не при запуске системы, как глобальные. Поскольку общий модуль не привязан к какому-либо объекту конфигурации, а относится ко всему прикладному решению, имена экспортируемых процедур и функций должны быть различными в разных общих модулях. В противном случае будет выдана синтаксическая ошибка, т. к. глобальный контекст будет содержать повторяющиеся имена. С помощью свойств Клиент (управляемое приложение) и Сервер, а также указаний препроцессору можно организовывать выполнение различных процедур и функций общих модулей на сервере приложения или на клиентском месте. По умолчанию в свойствах общих модулей устанавливается флажок Сервер. Это означает, что все процедуры и функции общего модуля будут доступны только на сервере. Если при этом установить свойство Вызов сервера, то процедуры и функции этого общего модуля станут доступны
48
на клиенте. Соответственно, если у общего модуля установлены свойства Клиент (управляемое приложение) и/или Внешнее соединение, то экспортируемые (определенные с ключевым словом Экспорт) процедуры и функции этого общего модуля будут доступны на клиенте (тонком клиенте, веб-клиенте, толстом клиенте в режиме управляемого приложения) и/или во внешнем соединении. Если у неглобального общего модуля установлено свойство Клиент (управляемое приложение), то в контексте этого модуля будут доступны экспортируемые переменные, процедуры и функции модуля управляемого приложения. Если у неглобального общего модуля установлено свойство Внешнее соединение, то в контексте этого модуля будут доступны экспортируемые переменные, процедуры и функции модуля внешнего соединения. Также у неглобальных общих модулей доступно свойство Повторное использование возвращаемых значений. Установка этого свойства ускоряет выполнение экспортируемых функций (только функций, а не процедур) неглобальных общих модулей. Это происходит за счет использования механизма кеширования, так как значения параметров, переданных в функцию, и возвращенный ей при этом результат запоминаются и сохраняются для дальнейшего использования.
Модуль управляемого приложения Модуль управляемого приложения выполняется при запуске системы «1С:Предприятие» в управляемом режиме (свойство конфигурации Основной режим запуска установлено в значение Управляемое приложение, т. е. в режимах тонкого клиента, веб-клиента и толстого клиента в режиме управляемого приложения) или при обращении к приложению как к Automation-серверу (объект V82c.Application). Этот модуль предназначен для отработки действий, связанных с сеансом работы конечного пользователя. Помимо описания переменных и основной программы, модуль приложения может содержать описание процедуробработчиков событий, связанных с началом и окончанием сеанса работы пользователя. ПРИМЕЧАНИЕ
В конфигурации существует также модуль обычного приложения, который выполняется при запуске «1С:Предприятия» в обычном режиме. Он остался от прежних версий платформы и в рамках этой книги рассматриваться не будет. Далее везде речь пойдет об управляемом клиенте (тонком клиенте, веб-клиенте, толстом клиенте в режиме управляемого приложения), управляемом приложении и об управляемых формах, даже если слово «управляемое» опущено.
Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации В конфигурации всегда существует единственный модуль управляемого приложения, который располагается в корневом разделе конфигурации. Контекст модуля управляемого приложения (рис. 3.4) образуется: ■■ свойствами и методами глобального контекста, которые доступны в управляемых клиентах (тонкий клиент, веб-клиент, толстый клиент в режиме управляемого приложения); ■■ экспортируемыми функциями и процедурами клиентских общих модулей, у которых установлено свойство Клиент (управляемое приложение), и неглобальных серверных общих модулей, для которых установлено свойство Вызов сервера; ■■ локальным контекстом самого модуля управляемого приложения.
Рис. 3.5. Видимость модуля управляемого приложения
Модуль управляемого приложения недоступен для процедур, работающих на сервере. Также экспортируемые переменные, процедуры или функции модуля управляемого приложения недоступны для модуля внешнего соединения и глобальных общих модулей. Основными событиями, которые могут обрабатываться в модуле приложения, являются события начала и окончания работы приложения. Последовательность их вызова представлена на рис. 3.6.
Рис. 3.4. Контекст модуля управляемого приложения
Экспортируемые переменные, процедуры или функции модуля управляемого приложения (у которых в заголовке указано ключевое слово Экспорт) будут доступны (рис. 3.5): ■■ в неглобальных клиентских общих модулях с установленным свойством Клиент (управляемое приложение); ■■ клиентских процедурах и функциях модуля управляемой формы; ■■ клиентских процедурах и функциях модуля команды. Том 1
Рис. 3.6. Последовательность вызова событий модуля приложения
49
Глава 3. Использование встроенного языка Событие ПередНачаломРаботыСистемы возникает при запуске системы в управляемом режиме 1С:Предприятие до открытия главного окна. Обрабатывая это событие, разработчик имеет возможность отказаться от запуска системы в случае, если какие-либо условия не выполнены. Следует учитывать, что, поскольку это событие вызывается в тот момент, когда главное окно программы еще не открыто, будет недоступен ряд действий, требующих наличия главного окна (например, выдача сообщений, открытие форм и т. д.). Событие ПриНачалеРаботыСистемы возникает при запуске системы в управляемом режиме 1С:Предприятие после открытия главного окна. В обработчике этого события разработчик уже не может отказаться от запуска системы, зато может выполнить действия, которые обязательно должны быть выполнены при начале работы пользователя системы (например, открыть форму, содержащую справочную информацию, и т. д.). Событие ПередЗавершениемРаботыСистемы возникает при завершении работы системы в управляемом режиме 1С:Предприятие до закрытия главного окна. Обрабатывая это событие, разработчик имеет возможность отказаться от завершения работы, если какие-либо условия не выполнены. Событие ПриЗавершенииРаботыСистемы возникает при завершении работы системы в управляемом режиме 1С:Предприятие после закрытия главного окна. В обработчике этого события разработчик уже не может отказаться от закрытия приложения, но может выполнить действия, которые обязательно должны быть выполнены при окончании работы пользователя. Следует учитывать, что, поскольку это событие вызывается в тот момент, когда главное окно программы уже закрыто, будет недоступен ряд действий, требующих наличия главного окна (например, выдача сообщений, открытие форм и т. д.).
Модуль сеанса Модулем сеанса называется модуль, который автоматически выполняется при старте системы «1С:Предприятие» в момент загрузки конфигурации. Исполнение модуля сеанса происходит до начала исполнения модуля управляемого приложения или модуля внешнего соединения. Модуль сеанса предназначен для инициализации параметров сеанса и отработки действий, связанных с сеансом работы. Модуль сеанса всегда исполняется в привилегированном режиме сервера «1С:Предприятия». Установка параметров сеанса выполняется в обработчике события УстановкаПараметровСеанса().
Модуль внешнего соединения В конфигурации всегда существует единственный модуль внешнего соединения, который располагается в корневом разделе конфигурации. Контекст модуля внешнего соединения образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей (если для этих модулей установлено свойство Внешнее соединение); ■■ локальным контекстом самого модуля внешнего соединения. Модуль внешнего соединения выполняется при обращении к приложению как к COM-серверу (в режиме внешнего соединения). В режиме внешнего соединения запускается не полноценное приложение «1С:Предприятия», а «облегченный» вариант приложения, в котором недоступны все функции, так или иначе связанные с организацией пользовательского интерфейса. Поэтому в режиме внешнего соединения вместо модуля приложения исполняется модуль внешнего соединения. Этот модуль предназначен для отработки действий, связанных с сеансом работы с приложением «1С:Предприятия». Если переменные, процедуры или функции модуля внешнего соединения определены как экспортируемые, то они будут доступны другим модулям внешнего соединения, за исключением глобальных общих модулей, в которых они доступны не будут. Экспортируемые переменные, процедуры или функции модуля внешнего соединения также будут доступны для неглобальных общих модулей с установленным свойством Внешнее соединение. Помимо описания переменных и основной программы, модуль внешнего соединения может содержать описание двух процедур-обработчиков событий, связанных с началом и завершением работы: ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы. При работе в модуле внешнего соединения следует помнить о том, что ряд объектов встроенного языка, процедур и функций глобального контекста будет недоступен для использования, т. к. COM-сервер «1С:Предприятия» не содержит «интерфейсной» части приложения. Например, в режиме внешнего соединения нельзя использовать такие объекты, как диаграмма, табличный документ, недоступны функции для вызова диалога ввода данных и т. д. Точная информация о возможности использования объектов, процедур и функций в модуле внешнего соединения находится в документации, в описании конкретных объектов, процедур и функций.
Модуль сеанса может содержать только определения неэкспортируемых процедур и функций и может использовать процедуры из общих модулей конфигурации.
50
Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации
Модуль объекта Каждый прикладной объект конфигурации, данные которого могут быть модифицированы в режиме 1С:Предприятие, имеет свой модуль. Этот модуль исполняется при создании объекта встроенного языка, который позволяет модифицировать данные объекта конфигурации. Соответствующий объект встроенного языка создается, например, при вводе нового объекта, при копировании, при получении данных существующего объекта и т. д. Для различных объектов конфигурации этот модуль имеет разное название (табл. 3.1). Таблица 3.1. Название модуля объекта для различных объектов конфигурации Объект конфигурации
Название модуля
Константа Модуль менеджера значения Справочник Модуль объекта Документ Отчет Обработка План видов характеристик План счетов План видов расчета План обмена Бизнес-процесс Задача Последовательность Модуль набора записей Регистр сведений Регистр накопления Регистр бухгалтерии Регистр расчета Перерасчет
Объект встроенного языка, который расширяется модулем
КонстантаМенеджерЗначения. СправочникОбъект. ДокументОбъект. ОтчетОбъект. ОбработкаОбъект. ПланВидовХарактеристикОбъект. ПланСчетовОбъект. ПланВидовРасчетаОбъект. ПланОбменаОбъект. БизнесПроцессОбъект. ЗадачаОбъект. ПоследовательностьНаборЗаписей. РегистрСведенийНаборЗаписей. РегистрНакопленияНаборЗаписей. РегистрБухгалтерииНаборЗаписей. РегистрРасчетаНаборЗаписей. ПерерасчетНаборЗаписей.
Контекст модуля объекта (рис. 3.7) образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ свойствами и методами объекта встроенного языка, контекст которого расширяется модулем; ■■ реквизитами объекта конфигурации, которому принадлежит модуль; ■■ локальным контекстом самого модуля объекта.
Рис. 3.7. Контекст модуля объекта
Если переменные, процедуры или функции модуля объекта определены как экспортируемые, то они будут доступны в качестве свойств и методов соответствующих объектов встроенного языка. Например, пусть в модуле справочника ТиповыеАнкеты определена экспортируемая процедура (листинг 3.1). Листинг 3.1. Экспортируемая процедура в модуле справочника
Процедура ПроверитьКорректностьЗаполненияАнкеты() Экспорт // Алгоритм вывода на экран печатной формы анкеты. // … КонецПроцедуры //
Тогда возможен следующий вызов этой процедуры, например, из модуля внешней обработки (листинг 3.2). Листинг 3.2. Пример вызова экспортируемой процедуры объекта справочника
Анкета = Справочники.ТиповыеАнкеты.НайтиПоКоду("000000001").ПолучитьОбъект(); Анкета.ПроверитьКорректностьЗаполненияАнкеты();
Помимо описания переменных и основной программы, модуль объекта может содержать описание процедур-обработчиков событий, связанных с данным объектом конфигурации. Состав этих событий различен Том 1
51
Глава 3. Использование встроенного языка для разных объектов, однако есть три события, которые вызываются для всех объектов, – ОбработкаПроверкиЗаполнения, ПередЗаписью и ПриЗаписи. Последовательность их вызова представлена на рис. 3.8.
Модуль менеджера объекта Для каждого прикладного объекта существует менеджер, предназначенный для управления этим объектом как объектом конфигурации. С помощью менеджера можно создавать объекты, работать с формами и макетами. Модуль менеджера позволяет расширить функциональность менеджеров, предоставляемых системой, за счет написания процедур и функций на встроенном языке. Фактически это позволяет описать методы для объекта конфигурации (например, справочника), которые относятся не к конкретному экземпляру объекта базы данных, а к самому объекту конфигурации. Контекст модуля менеджера (рис. 3.9) образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ локальным контекстом самого модуля менеджера.
Рис. 3.8. Последовательность вызова событий модуля объекта
Событие ОбработкаПроверкиЗаполнения вызывается перед записью данных объекта, до начала транзакции записи. В обработчике этого события разработчик может реализовать собственные алгоритмы проверки заполнения реквизитов объекта, добавить в массив проверяемых реквизитов дополнительные реквизиты, чтобы платформа выполнила их проверку, или очистить массив проверяемых реквизитов, отказавшись от их стандартной проверки. Установив параметр Отказ в значение Истина, разработчик может отказаться от записи объекта, если, например, какие-то условия проверки не были выполнены. Событие ПередЗаписью вызывается перед записью данных, после начала транзакции записи, но до начала непосредственной записи данных в базу данных. В обработчике этого события разработчик имеет возможность отказаться от записи данных, если, например, не выполнены требуемые условия. Событие ПриЗаписи вызывается после того, как была выполнена запись данных в базу данных, но до окончания транзакции записи. В обработчике этого события выполняются действия над данными, неразрывно связанными с данными объекта, которые не могут быть изменены отдельно от основных данных. Здесь также разработчик может отказаться от записи данных, если, например, в результате записи этих данных в базу нарушаются какие-либо условия.
52
Рис. 3.9. Контекст модуля менеджера
Модуль менеджера исполняется только на сервере и не может иметь переменных и тела модуля. Если функции или процедуры модуля менеджера объявлены как экспортируемые, к ним можно будет получить доступ через менеджера объекта.
Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации Например, пусть в модуле менеджера справочника Контрагенты определена экспортируемая функция (листинг 3.3). Листинг 3.3. Экспортируемая функция в модуле менеджера справочника «Контрагенты»
Функция ПолучитьСписокДебиторов() Экспорт // … КонецФункции
Тогда возможен следующий вызов этой функции, например, из модуля внешней обработки (листинг 3.4). Листинг 3.4. Пример вызова экспортируемой функции справочника «Контрагенты»
Дебиторы = Справочники.Контрагенты.ПолучитьСписокДебиторов();
В модулях менеджеров объектов располагается обработчик события ОбработкаПолученияДанныхВыбора. Это событие возникает на сервере перед стандартным формированием списка при вводе по строке, автоподборе текста и быстром выборе.
Модуль управляемой формы Каждая форма, определенная в конфигурации, имеет свой собственный модуль.
■■ свойствами и методами расширения формы, определяемого основным реквизитом формы; ■■ свойствами и методами объекта УправляемаяФорма встроенного языка; ■■ реквизитами формы, которой «принадлежит» модуль; ■■ локальным контекстом самого модуля формы, скомпилированным в управляемых клиентах. Контекст серверных процедур и функций модуля управляемой формы (рис. 3.10) образуется: ■■ глобальным контекстом, в том числе экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ свойствами и методами расширения формы, определяемого основным реквизитом формы; ■■ свойствами и методами объекта УправляемаяФорма встроенного языка; ■■ реквизитами формы, которой «принадлежит» модуль; ■■ серверными процедурами и функциями самого модуля управляемой формы, а также переменными и телом модуля, скомпилированными на сервере.
Модуль управляемой формы исполняется при создании объекта УправляемаяФорма встроенного языка, а также может создаваться при открытии формы прикладного объекта (например, при открытии формы элемента справочника) либо явно получаться средствами встроенного языка (листинг 3.5). Листинг 3.5. Пример получения управляемой формы
ФормаСписка = ПолучитьФорму("Справочник.Номенклатура.ФормаСписка");
Контекст клиентских процедур и функций модуля управляемой формы (рис. 3.10) образуется: ■■ свойствами и методами глобального контекста, которые доступны в управляемых клиентах (тонкий клиент, веб-клиент, толстый клиент в режиме управляемого приложения); ■■ экспортируемыми функциями и процедурами клиентских общих модулей, у которых установлено свойство Клиент (управляемое приложение) и неглобальных серверных общих модулей, для которых установлено свойство Вызов сервера; ■■ экспортируемыми переменными, процедурами и функциями модуля управляемого приложения; Том 1
Рис. 3.10. Контекст модуля управляемой формы
53
Глава 3. Использование встроенного языка В контексте управляемой формы недоступны свойства и методы объекта, который назначен основным реквизитом формы. Получить к ним доступ можно только из серверной процедуры модуля формы, предварительно преобразовав данные формы в объект. Например, пусть в модуле объекта справочника определена экспортируемая процедура ПересчитатьЦены(), листинг 3.6. Листинг 3.6. Экспортируемая процедура в модуле объекта справочника
Процедура ПересчитатьЦены() Экспорт // … КонецПроцедура
Тогда в серверной контекстной процедуре модуля формы элемента этого справочника можно преобразовать данные формы в объект (РеквизитФормыВЗначение()) и выполнить метод этого объекта ПересчитатьЦены(). Затем, чтобы пересчитанные данные отразились в форме, нужно выполнить обратное преобразование (ЗначениеВРеквизитФормы()), конвертировав объект справочника в данные формы (листинг 3.7). Листинг 3.7. Пример вызова экспортируемой процедуры справочника из модуля формы
&НаСервере Процедура ОбновитьДанные() СправочникОбъект = РеквизитФормыВЗначение("Объект"); СправочникОбъект.ПересчитатьЦены(); ЗначениеВРеквизитФормы(СправочникОбъект, "Объект"); КонецПроцедуры
Исполнение модуля формы на клиенте и на сервере Основная особенность формы как программного объекта заключается в том, что она существует одновременно и на клиенте, и на сервере. Форма состоит из двух взаимодействующих между собой частей, каждая из которых выполняется в разных контекстах. Одна часть – в контексте сервера, а другая – в контексте клиента. По этой причине все процедуры и функции, создаваемые в модуле формы, должны иметь явное указание на то, в каком контексте они будут исполняться. Для этого используются директивы компиляции, набор которых определен во встроенном языке. Одна из возможных директив компиляции обязательно должна быть указана перед объявлением каждой процедуры или функции, находящейся в модуле формы. Например, директива компиляции и процедура могут выглядеть следующим образом (листинг 3.8).
54
Листинг 3.8. Процедура «ПриСозданииНаСервере»
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Объект.Ссылка = ПланыОбмена.УдаленныеСклады.ЭтотУзел() Тогда Элементы.Главный.Доступность = Ложь; Элементы.Склад.Доступность = Ложь; Элементы.АдресОбмена.Доступность = Ложь; КонецЕсли; КонецПроцедуры
В приведенном примере стандартная процедура, выполняемая платформой при создании формы на сервере, предваряется соответствующей директивой компиляции &НаСервере. Поскольку стандартные события вызываются платформой в заранее известных контекстах (на клиенте или на сервере), то и директивы компиляции, указываемые перед обработчиками этих событий, должны соответствовать контексту события. Что же касается контекстов исполнения собственных процедур или функций – их определяет сам разработчик в зависимости от своих нужд. Вообще в модуле формы могут быть использованы четыре различные директивы компиляции: ■■ ■■ ■■ ■■
&НаКлиенте, &НаСервере, &НаСервереБезКонтекста, &НаКлиентеНаСервереБезКонтекста.
Директива &НаКлиенте указывает, что процедура или функция будет исполняться в контексте клиентского приложения. В этой процедуре будет доступен весь контекст формы: реквизиты, элементы и параметры формы. Эта директива используется для всех обработчиков клиентских событий формы, а также для процедур, описывающих локальные команды формы. Часто такие процедуры называют клиентскими процедурами формы. Директива &НаСервере аналогична предыдущей с той разницей, что исполнение кода происходит в контексте сервера. Эта директива используется для всех обработчиков серверных событий формы. Также эту директиву часто используют разработчики для собственных процедур, чтобы передать исполнение кода на сервер. Часто такие процедуры называют серверными процедурами формы. А вызов такой процедуры из клиентской процедуры называют контекстным серверным вызовом. Директива &НаСервереБезКонтекста также определяет, что код будет исполняться в контексте сервера, но при этом контекст формы (реквизиты, элементы, параметры) будет недоступен. Эту директиву также используют разработчики для собственных процедур, чтобы передать исполнение кода на сервер. Как и в предыдущем случае, такие процедуры Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации называют серверными процедурами формы. А вот вызов такой процедуры из клиентской процедуры называют внеконтекстным серверным вызовом. И последняя директива, &НаКлиентеНаСервереБезКонтекста, определяет, что процедура или функция может исполняться как в контексте клиента, так и в контексте сервера. Эта директива используется редко. Обычно она требуется в тех случаях, когда нужно выполнять одинаковые действия, как при создании формы, так и в процессе ее жизнедеятельности на клиенте. Тогда вместо двух одинаковых процедур, одна из которых исполняется на сервере, а другая – на клиенте, создается одна процедура с директивой &НаКлиентеНаСервереБезКонтекста. Если по ошибке никакая директива компиляции не указана, то платформа считает, что используется директива &НаСервере.
Переменные модуля формы В модуле формы директивы компиляции должны быть указаны не только перед определением процедур и функций, но и перед определением переменных. Если перед описанием переменной используется директива компиляции &НаКлиенте, то такая переменная будет существовать с момента создания формы до момента ее закрытия. Причем только в клиентской части формы. Из серверных процедур формы она доступна не будет. Если перед описанием переменной используется директива компиляции &НаСервере, то такая переменная будет существовать только на период вызова и исполнения какой-либо серверной процедуры или функции. После того как исполнение кода вернется на клиента, модуль, исполнявшийся на сервере, будет уничтожен вместе с этой переменной (рис. 3.11). Почему важно понимать эту особенность? Потому что порой переменные модуля объявляются в явном виде, без указания директивы компиляции. В этом случае, как уже говорилось выше, платформа будет использовать директиву &НаСервере. Можно пытаться в одной серверной процедуре устанавливать значение этой переменной и читать ее в другой. Но так получится только в том случае, если все эти процедуры выполняются в одном серверном вызове. Если серверные вызовы разные, переменная будет инициализироваться каждый раз заново. В то же время на клиенте можно использовать переменные модуля для хранения значений на все время жизни формы, но для этого при объявлении таких переменных обязательно должна быть указана директива компиляции &НаКлиенте. Том 1
Рис. 3.11. Однократная компиляция клиентской части модуля и многократная компиляция серверной части модуля
Передавать значения с клиента на сервер с помощью переменных модуля формы нельзя. Хранить значения на сервере в переменных модуля также не получится. Для этого нужно использовать либо реквизиты формы (и выполнять контекстные серверные вызовы), либо передавать значения в параметрах вызываемой процедуры/функции.
Экспортируемые процедуры формы Разработчик может создать в модуле формы экспортируемые процедуры или функции. Они будут доступны как методы программного объекта Форма во встроенном языке. Для таких процедур/функций также нужно указывать директивы компиляции. При этом практический смысл есть, наверное, в использовании лишь единственной директивы – &НаКлиенте. Поясним почему. Как мы уже знаем, объект формы создается методами ОткрытьФорму() или ПолучитьФорму(). Оба они доступны только в контексте клиента. Поэтому созданная форма также будет существовать в контексте клиента. Соответственно, в этом же контексте должны быть определены ее экспортируемые процедуры/функции.
55
Глава 3. Использование встроенного языка В принципе программный объект формы может существовать как на клиенте, так и на сервере. Однако для чего, в какой ситуации может потребоваться обращаться к нему «извне» на сервере – сложно представить. Поэтому основное замечание этого раздела заключается в том, что при написании собственных экспортируемых процедур/функций формы нужно не забывать указывать для них директиву компиляции &НаКлиенте. Если никакая директива указана не будет, платформа будет считать, что используется директива &НаСервере, и, значит, вызвать процедуру/функцию на клиенте вы не сможете.
Клиентские и серверные обработчики событий формы Помимо описания переменных и основной программы, модуль формы может содержать описание процедур-обработчиков событий, связанных с формой. В первую очередь это событие, возникающее при создании формы на сервере. Последовательность событий, вызывающихся при создании формы уже существующего объекта информационной базы, а также открытии и закрытии окна формы, представлена на рис. 3.12.
Подробнее
Раздел «Последовательность событий при открытии формы объекта», стр. 299. Раздел «Последовательность событий при записи объекта из формы», стр. 301. Синтакс-помощник: Интерфейс (управляемый) – Управляемая форма – УправляемаяФорма – События.
Форма полностью подготавливается к открытию на сервере и затем открывается на клиенте. При открытии формы на стороне сервера вызываются два события – ПриЧтенииНаСервере и ПриСозданииНаСервере. Первое событие формы ПриЧтенииНаСервере вызывается только для существующих в информационной базе объектов. Причем поставляется это событие не самой формой, а ее расширением, определяемым типом основного реквизита формы. В обработчике этого события, в параметре ТекущийОбъект разработчику доступен прикладной объект, содержащийся в форме, со всей его функциональностью. То есть здесь можно вызвать экспортируемые методы этого объекта или получить значения его реквизитов, не конвертируя данные формы в объект. Таким образом, в обработчике этого события разработчик может подготовить данные формы, зависящие от данных объекта, к открытию. Второе событие формы ПриСозданииНаСервере вызывается всегда при открытии форм и новых, и существующих объектов. Здесь уже недоступен прикладной объект, отображаемый в форме. В обработчике этого события разработчик может полностью подготовить форму, ее внешнее представление, к открытию, в зависимости от различных условий настроить ее интерфейсные свойства. В обработчике этого события разработчик имеет возможность отказаться как от открытия формы (Отказ = Истина), так и от выполнения стандартных действий при открытии формы (СтандартнаяОбработка = Ложь), если, например, не выполнены требуемые условия. Набор стандартных действий различен для разных форм и определяется расширением формы, соответствующим основному реквизиту формы. Например, для формы списка стандартная обработка заключается в передаче параметров, указанных при открытии формы, в динамический список, а при открытии формы отчета при выполнении стандартной обработки в форму загружается вариант и пользовательские настройки отчета.
Рис. 3.12. Последовательность вызова событий модуля формы
56
После этого уже полностью подготовленная к изображению форма передается на клиента, и вызывается клиентское событие формы ПриОткрытии. Это событие возникает при открытии формы до показа ее окна пользователю. Здесь также можно отказаться от открытия формы, если по каким-то причинам она не должна быть открыта. Если форма наверняка будет открыта, то разработчик может в обработчике этого события выполнить некоторые интерактивные действия, которые невозможны на сервере: выдать предупреждение пользователю или открыть связанную форму, данные которой зависят от основной открываемой формы. Профессиональная разработка в системе «1С:Предприятие 8»
Модули конфигурации При закрытии формы на стороне клиента происходят два события – ПередЗакрытием и ПриЗакрытии (здесь не рассматриваются события, возникающие при записи объекта из формы при ее закрытии). Событие ПередЗакрытием возникает при закрытии формы до закрытия окна формы. В обработчике этого события разработчик имеет возможность отказаться как от закрытия формы (Отказ = Истина), так и от выполнения стандартных действий при закрытии формы (СтандартнаяОбработка = Ложь), если, например, не выполнены требуемые условия. Набор стандартных действий, выполняемых после события ПередЗакрытием, также различен для разных форм и определяется расширением формы, соответствующим основному реквизиту формы. Например, если элемент справочника был модифицирован, одним из стандартных действий будет запрос сохранения изменений перед закрытием формы. Событие ПриЗакрытии возникает при закрытии формы после закрытия окна формы. В обработчике этого события можно описывать алгоритмы, которые должны быть выполнены только в случае, когда форма будет наверняка закрыта. Например, если нужно закрыть вспомогательную форму, существующую только в случае, если открыта основная форма.
Контекст клиентских процедур модуля команды (рис. 3.13) образуется: ■■ свойствами и методами глобального контекста, которые доступны в управляемых клиентах (тонкий клиент, веб-клиент, толстый клиент в режиме управляемого приложения); ■■ экспортируемыми функциями и процедурами клиентских общих модулей, у которых установлено свойство Клиент (управляемое приложение), и неглобальных серверных общих модулей, для которых установлено свойство Вызов сервера; ■■ экспортируемыми переменными, процедурами и функциями модуля управляемого приложения; ■■ локальным контекстом самого модуля команды. Контекст серверных процедур модуля команды (рис. 3.13) образуется: ■■ свойствами и методами глобального контекста; ■■ экспортируемыми функциями и процедурами общих модулей, скомпилированных на сервере (для этих модулей установлено свойство Сервер); ■■ серверными методами модуля команды.
Модуль команды Для прикладных объектов конфигурации существуют подчиненные объекты Команды. Существуют также общие объекты конфигурации – объекты Общая команда. У каждой команды существует модуль команды, в котором можно написать предопределенную процедуру ОбработкаКоманды(), в которой на встроенном языке описываются действия, которые должна выполнить система при вызове этой команды. Модуль команды, так же как и модуль управляемой формы, существует и на сервере, и на клиенте. В модуле команды могут быть использованы следующие директивы компиляции: ■■
&НаКлиенте
■■ ■■
&НаСервере
клиенте;
– процедура/функция исполняется в управляемом
– процедура/функция исполняется на сервере; – процедура/функция может исполняться и в управляемом клиенте, и на сервере. Процедура ОбработкаКоманды() обязательно должна предваряться директивой компиляции &НаКлиенте, так как выполнение команды происходит в клиентском приложении. &НаКлиентеНаСервере
Из клиентских процедур модуля команды можно вызывать серверные, после их выполнения исполнение кода возвращается на клиента. Но при этом из серверных процедур/функций вызывать клиентские процедуры нельзя. Том 1
Рис. 3.13. Контекст модуля команды
Модуль команды должен содержать только описание и функций и не может иметь переменных и тела модуля.
процедур
57
Глава 3. Использование встроенного языка Хотя в модуле команды можно описывать методы с ключевым словом Экспорт, из встроенного языка невозможно получить доступ к командам и, следовательно, к их контексту тоже.
Работа встроенного языка на сервере
Организация выполнения кода на сервере или на клиенте Используя возможность управления компиляцией модулей, исполнение кода передается с клиента на сервер. После выполнения вызванной процедуры или функции система продолжит исполнение кода на клиенте. Архитектура системы ориентирована на максимальный перенос выполнения всей функциональности на сервер и максимальное «облегчение» клиента. На сервере выполняется вся работа прикладных объектов, выполняется подготовка к отображению форм (чтение объектов из информационной базы и заполнение данных формы, расположение элементов, запись данных формы после изменения) и командного интерфейса, формируются отчеты. На клиенте выполняется только отображение информации, подготовленной на сервере, выполняется взаимодействие с пользователем и вызовы серверных методов для выполнения необходимых действий. После запуска прикладного решения выполнение кода всегда осуществляется на клиенте. Передача выполнения с клиента на сервер может быть выполнена путем вызова серверных процедур, описанных с директивой компиляции &НаСервере, &НаСервереБезКонтекста из клиентских процедур модуля формы или команды, а также путем вызова процедуры общего модуля, исполняющегося на сервере. После того как вызываемая процедура завершит свою работу, выполнение будет передано обратно на клиента.
(с директивой компиляции &НаКлиенте) можно вызывать серверные (с директивой компиляции &НаСервере, &НаСервереБезКонтекста), тем самым передавая выполнение с клиента на сервер. После выполнения серверных процедур исполнение кода возвращается на клиента. Принудительно передать исполнение кода в обратную сторону, с сервера на клиента, невозможно, то есть нельзя из серверных процедур модуля формы/команды вызывать клиентские. Рассмотрим пример. Пусть в форме накладной при изменении товара нужно подставлять цену товара из регистра сведений. Работа с прикладными объектами, в частности с регистром сведений, на клиенте невозможна. В этом случае на клиенте, в обработчике события при изменении товара, можно вызвать серверную (лучше внеконтекстную) процедуру, которая возвращает актуальную цену выбранного товара на указанную дату (листинги 3.9, 3.10). Листинг 3.9. Процедура «ТоварыТоварПриИзменении()»
&НаКлиенте Процедура ТоварыТоварПриИзменении(Элемент) // … ЦенаТовара = РозничнаяЦена(Товар, Дата); КонецПроцедуры Листинг 3.10. Функция «РозничнаяЦена()»
&НаСервереБезКонтекста Функция РозничнаяЦена(ВыбранныйТовар, АктуальнаяДата) // … Возврат Цена; КонецФункции
Взаимодействие клиентского и серверного контекста исполнения в модуле формы показано на рис. 3.14.
Клиентские и серверные процедуры в модуле формы, команды Простейшим примером передачи выполнения кода на сервер может служить вызов серверных процедур, описанных с директивой компиляции &НаСервере, &НаСервереБезКонтекста из клиентских процедур модуля формы или команды. Как уже говорилось выше, модуль формы и модуль команды существуют одновременно как на клиенте, так и на сервере. Таким образом, процедуры, содержащиеся в этих модулях, исполняются или в контексте клиента, или в контексте сервера. В целом исполнение модуля формы/команды на клиенте и на сервере характеризуется тем, что из клиентских процедур модуля формы/команды
58
Рис. 3.14. Передача исполнения кода на сервер в модуле формы
Если процедура часто используется, имеет смысл поместить ее в общем серверном модуле и вызывать ее из серверной процедуры модуля формы. Профессиональная разработка в системе «1С:Предприятие 8»
Работа встроенного языка на сервере Для реализации нужной функциональности форм разработчик может использовать клиентские и серверные процедуры в модуле формы. В целях оптимизации клиент-серверного взаимодействия нужно соблюдать следующие рекомендации: ■■ основной объем кода должен содержаться в серверных процедурах (с директивой компиляции &НаСервере, &НаСервереБезКонтекста). Клиентские процедуры (&НаКлиенте) должны содержать небольшой и несложный для исполнения код; ■■ нужно стремиться к минимизации серверных вызовов, то есть ситуаций, когда из клиентских процедур вызываются серверные; ■■ везде, где возможно, нужно использовать внеконтекстные серверные вызовы (&НаСервереБезКонтекста) вместо вызовов сервера с контекстом формы (&НаСервере). Это быстрее и эффективнее. Подробнее
Раздел «Оптимизация клиент-серверного взаимодействия в формах», стр. 391.
Листинг 3.11. Передача исполнения кода на сервер путем вызова процедуры серверного общего модуля
&НаКлиенте Процедура ВыполнитьНаСервере(Команда) Серверный.ВыполнитьНаСервере(); КонецПроцедуры
После того как выполнение передано на сервер, все остальные вызовы процедур и функций будут выполняться также на стороне сервера (рис. 3.16). Например, общий модуль Расчеты, который компилируется как на стороне сервера, так и на стороне клиента, содержит экспортируемую процедуру Пересчитать(). Как видно из рисунка, сначала на клиенте в модуле формы отчета вызывается экспортируемая процедура общего серверного модуля Серверный, и управление передается на сервер. Затем из этой процедуры вызывается процедура Пересчитать(). При этом выполнение кода продолжится на сервере, и процедура Пересчитать() будет вызвана из серверного экземпляра модуля Расчеты.
Вызов процедур из серверных модулей Передача выполнения кода на сервер может быть осуществлена посредством вызова экспортируемой процедуры общего модуля, у которого установлено свойство Сервер и свойство Вызов сервера. Экземпляр этого модуля будет скомпилирован только на стороне сервера. При вызове в модуле формы отчета этой экспортной процедуры выполнение будет передано на сервер, в экспортируемую процедуру общего модуля. После ее завершения управление вернется на клиента (рис. 3.15).
Рис. 3.16. Исполнение вызовов процедур на сервере
После ее завершения управление вернется на клиента. Затем из модуля формы снова вызывается процедура Пересчитать(). Однако теперь эта процедура будет вызвана из клиентского экземпляра модуля Расчеты. Рис. 3.15. Передача выполнения кода на сервер
Например, можно вызвать процедуру неглобального серверного общего модуля (с установленными свойствами Сервер и Вызов сервера) из клиентского обработчика команды в модуле формы (листинг 3.11).
Том 1
Важно отметить, что разработчик не может «управлять» передачей выполнения с сервера обратно на клиента. Выполнение будет передано только после завершения выполнения вызванной процедуры или функции. Другими словами, если выполнение осуществляется на сервере, и вызываемая процедура не найдена в скомпилированном на стороне сервера коде, то будет выдано сообщение об ошибке даже в том случае, если вызываемая процедура присутствует в экземпляре, скомпилированном на стороне клиента (рис. 3.17).
59
Глава 3. Использование встроенного языка
Привилегированный и безопасный режимы исполнения кода В процессе функционирования прикладного решения могут возникать ситуации, когда некоторые действия нужно выполнить максимально быстро, без проверки прав пользователя на используемые данные, а при выполнении некоторых действий, наоборот, нужно оградить систему от выполнения «ненадежного» кода, представляющего потенциальную угрозу для ее безопасности. Для этого платформа поддерживает привилегированный и безопасный режимы исполнения кода.
Привилегированный режим Рис. 3.17. Исполнение вызовов процедур на сервере
Передача параметров на сервер и возврат значений При передаче выполнения кода на сервер, как правило, выполняется передача некоторых параметров вызываемой процедуры или функции. Также в случае вызова функции будет выполняться передача результата работы функции с сервера на клиента. Важно учитывать, что не все типы значений и объекты, работа с которыми возможна на сервере, могут быть переданы с клиента на сервер и обратно.
В привилегированном режиме код исполняется на сервере без проверки прав. Использование привилегированного режима позволяет, во-первых, ускорить работу, так как не будут накладываться ограничения на доступ к данным, а во-вторых, позволяет выполнять операции с данными от лица пользователей, которым эти данные недоступны. Для поддержки привилегированного режима в платформе существует несколько возможностей. Для документов прямо в свойствах конфигурации можно задать использование привилегированного режима при проведении и при отмене проведения документа. Эти свойства стандартно устанавливаются платформой для новых документов (рис. 3.18).
Точная информация о возможности использования типов значений и объектов на сервере и передаче их между клиентом и сервером находится в документации, в описании конкретных объектов. В синтакс-помощнике при описании объектов, которые могут передаваться между клиентом и сервером, содержится фраза «Возможен обмен с сервером». Поскольку на клиенте невозможна работа с объектными данными, то на сервер можно передавать ссылку на объект, а в серверной процедуре получать по этой ссылке объект и работать с ним. Обмен с сервером возможен некоторым набором типов, для которых такой обмен поддерживается, а для обмена «специфическими» данными (например, файлами, картинками, табличными частями документа) предназначено временное хранилище. Методом ПоместитьВоВременноеХранилище() сериализуемое значение сохраняется во временном хранилище, а затем методом ПолучитьИзВременногоХранилища() значение извлекается из временного хранилища по указанному адресу. Например, временное хранилище может быть использовано для передачи данных между формами, минуя клиента, что особенно эффективно в случае больших объемов передаваемых данных.
60
Рис. 3.18. Установка привилегированного режима при проведении и отмене проведения документа
Профессиональная разработка в системе «1С:Предприятие 8»
Работа встроенного языка на сервере Для бизнес-процессов также прямо в свойствах конфигурации можно задать использование привилегированного режима при создании задач. Эти свойства стандартно устанавливаются платформой для новых бизнес-процессов (рис. 3.19).
Безопасный режим Безопасный режим работы предназначен для защиты системы от выполнения на сервере «ненадежного» программного кода. Потенциальную опасность представляют внешние обработки или программный код, вводимый пользователем для использования в методах Выполнить() и Вычислить(). Безопасный режим рекомендуется включать при выполнении на сервере программного кода, надежность которого разработчик гарантировать не может. Для этого в глобальном контексте существует процедура УстановитьБезопасныйРежим(), а также функция БезопасныйРежим(), которая позволяет определить, включен безопасный режим или нет. А также при создании и подключении внешних обработок и отчетов платформа стандартно устанавливает параметр БезопасныйРежим в значение Истина. В безопасном режиме накладываются следующие ограничения:
Рис. 3.19. Установка привилегированного режима при создании задач
Привилегированный режим исполнения кода можно включить/выключить средствами встроенного языка. Для этого в глобальном контексте существует процедура УстановитьПривилегированныйРежим(), а также функция ПривилегированныйРежим(), которая позволяет определить, включен привилегированный режим или нет. Привилегированный режим рекомендуется использовать тогда, когда работа с данными от лица некоторого пользователя не нарушает установленные для этого пользователя права доступа. Например, кладовщик имеет доступ к документу, регистрирующему продажи, но не имеет доступа к самому регистру продаж, в котором содержатся движения документа, возникающие при его проведении. В этом случае использование привилегированного режима при проведении документа не делает данные регистра продаж доступными кладовщику, но позволяет проводить документ и сохранять в регистре движения документа. Можно также поместить код, не требующий проверки прав, в привилегированные общие модули, у которых установлено свойство Привилегированный. В такие модули могут быть перенесены операции, использующие данные, на которые у текущего пользователя нет прав. Подробнее
Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 5.5.4.2.
Том 1
■■ ■■ ■■ ■■ ■■ ■■
привилегированный режим отменяется, если он был установлен; попытки перехода в привилегированный режим игнорируются; запрещены операции с COM-объектами; запрещена загрузка и подключение внешних компонентов; запрещен доступ к файловой системе (кроме временных файлов); запрещен доступ к Интернету.
Подробнее
Документация «1С:Предприятие 8.2. Руководство разработчика», раздел 5.5.4.3.
Работа с метаданными Встроенный язык «1С:Предприятия» позволяет работать с метаданными. Одним из концептуальных моментов этой работы является то, что доступ к метаданным предоставляется только на чтение. Таким образом, средствами встроенного языка разработчик не может модифицировать метаданные. Изменение структуры метаданных возможно только средствами визуального конструирования в режиме Конфигуратор. Для доступа к метаданным из встроенного языка используется объект ОбъектМетаданныхКонфигурация, который доступен через свойство глобального контекста Метаданные. Этот объект предоставляет доступ как к свойствам самой конфигурации, так и к отдельным коллекциям объектов метаданных, которые описывают различные виды прикладных
61
Глава 3. Использование встроенного языка объектов, определенных в прикладном решении. Например, для доступа к коллекции объектов метаданных, описывающих документы, можно использовать следующий код (листинг 3.12). Листинг 3.12. Доступ к коллекции метаданных
МетаданныеДокументов = Метаданные.Документы;
А для того, чтобы получить доступ к объектам конфигурации, описывающим справочники, можно использовать такой вызов (листинг 3.13). Листинг 3.13. Доступ к коллекции метаданных
МетаданныеСправочников = Метаданные.Справочники;
Элементами таких коллекций являются объекты метаданных, которые позволяют получить доступ как к специфическим свойствам объектов, так и к свойствам, общим для различных объектов метаданных. Например, можно получить описание реквизитов объекта, табличных частей объекта и их реквизитов, описания форм, макетов объекта и т. д. (листинг 3.14). Листинг 3.14. Получение описаний реквизитов объектов метаданных
// Для объекта метаданных "Документ.АккредитивПереданный" можно получить: // описание реквизита "ВалютаДокумента" Объект = Метаданные.Документы.АккредитивПереданный.Реквизиты.ВалютаДокумента; // описание табличной части "РасшифровкаПлатежа" Объект = Метаданные.Документы.АккредитивПереданный.ТабличныеЧасти.РасшифровкаПлатежа; // описание реквизита табличной части "ДоговорКонтрагента" Объект = Метаданные.Документы.АккредитивПереданный. ТабличныеЧасти.РасшифровкаПлатежа.Реквизиты.ДоговорКонтрагента;
Реквизиты, табличные части объекта метаданных также представляют собой коллекцию объектов метаданных, состоящих из объектов метаданных, описывающих отдельный реквизит или отдельную табличную часть. В качестве примера на следующей схеме представлена связь объектов, описывающих реквизиты и табличные части объекта метаданных Документ.АккредитивПереданный (рис. 3.20). Таким образом, в большинстве случаев значение некоторого свойства объекта метаданных может быть получено по следующей цепочке программных объектов (рис. 3.21).
Рис. 3.20. Описание реквизитов и табличных частей документа
62
Профессиональная разработка в системе «1С:Предприятие 8»
Работа с метаданными Листинг 3.15. Пример использования метода «Содержит()»
// В качестве примера выбирается первая запись из первого набора записей, // содержащегося в движениях документа. Сообщение = Новый СообщениеПользователю; Движения = Документы.АвансовыйОтчет.НайтиПоНомеру("ТК000009", '20110101000000'). ПолучитьОбъект().Движения[0]; Движения.Прочитать(); ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Движения[0])); Если Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру накопления"; Сообщение.Сообщить(); Рис. 3.21. Цепочка объектов описания метаданных
Такой подход позволяет упростить и унифицировать работу с метаданными. Объекты метаданных имеют различный набор свойств, перечень которых можно узнать при помощи команды Конфигурация Отчет по конфигурации… Кроме этого, все коллекции объектов метаданных допускают обращение к элементам коллекции по имени или индексу. Также показанные на схеме объекты имеют набор следующих методов (рис. 3.22).
ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру сведений"; Сообщение.Сообщить(); ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру бухгалтерии"; Сообщение.Сообщить(); ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это движения по регистру расчета"; Сообщение.Сообщить(); КонецЕсли;
Поскольку метаданные имеют иерархическую структуру, объект, полученный методом НайтиПоТипу(), не всегда может находиться в первом уровне иерархии нужной коллекции объектов метаданных. В этом случае можно использовать метод Родитель() объекта метаданных для того, чтобы получить объект, находящийся на нужном уровне иерархии. Например, если некоторая универсальная процедура обрабатывает табличные части справочников по одному алгоритму, а табличные части документов – по другому, то проанализировать принадлежность табличной части определенному виду метаданных можно следующим образом (листинг 3.16). Рис. 3.22. Методы объектов описания метаданных
Объект ОбъектМетаданныхКонфигурация содержит два метода, которые позволяют найти объект метаданных, описывающий некоторое значение или тип. Полученное таким образом значение может быть использовано для того, чтобы найти его в некоторой коллекции объектов метаданных (метод Содержит() объекта КоллекцияОбъектовМетаданных) или сравнить с конкретным объектом метаданных. Например, в процессе перебора движений документа требуется определить, к какому именно виду регистров относится данная запись регистра. В этом случае для записи можно найти соответствующий объект метаданных и затем определить, в какую из коллекций объектов метаданных, описывающих регистры, входит полученный объект метаданных (листинг 3.15). Том 1
Листинг 3.16. Пример использования метода «Родитель()»
// В качестве примера получается табличная часть "Товары" // документа "АвансовыйОтчет". Сообщение = Новый СообщениеПользователю; ТабличнаяЧасть = Документы.АвансовыйОтчет.НайтиПоНомеру("ТК000009", '20110101000000'). ПолучитьОбъект().Товары; ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ТабличнаяЧасть)).Родитель(); Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это табличная часть справочника"; Сообщение.Сообщить(); ИначеЕсли Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда Сообщение.Текст = "Это табличная часть документа"; Сообщение.Сообщить(); КонецЕсли;
63
Глава 3. Использование встроенного языка Как уже говорилось выше, коллекция объектов метаданных позволяет обращаться к объектам по имени или индексу. Кроме этого, коллекция поддерживает итератор Для Каждого…, с помощью которого, например, может быть организован перебор всех элементов справочников, содержащихся в конфигурации (листинг 3.17).
64
Листинг 3.17. Использование итератора «Для Каждого»
Сообщение = Новый СообщениеПользователю; Для Каждого Справочник из Метаданные.Справочники Цикл Сообщение.Текст = Символы.ПС + Справочник.ПолноеИмя(); Сообщение.Сообщить(); МенеджерСправочника = Справочники[Справочник.Имя]; Выборка = МенеджерСправочника.Выбрать(); Пока Выборка.Следующий() Цикл Сообщение.Текст = Выборка.Наименование; Сообщение.Сообщить(); КонецЦикла; КонецЦикла;
Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные
Глава 4. Работа с данными Объектные и необъектные данные
Объектные данные
Все данные, которые хранятся в базе данных «1С:Предприятия», можно разделить на две категории: объектные и необъектные. Поскольку природа этих данных различна, различаются и способы работы с ними.
Модель хранения данных
К объектным данным относятся данные справочников, документов, планов видов характеристик, планов счетов, планов видов расчета, бизнеспроцессов, задач, планов обмена. К необъектным данным относятся данные регистров сведений, регистров накопления, регистров расчета, перерасчетов, регистров бухгалтерии и последовательностей. Также к необъектным данным относятся константы. С точки зрения системы объектные данные состоят из отдельных объектов. Каждый из этих объектов обладает внутренним уникальным идентификатором, благодаря наличию которого к некоторой совокупности значений, хранящихся в базе данных, можно обращаться как к единому целому – объекту. Например, объектом является элемент справочника или документ. Каждый объект, помимо того что он является совокупностью значений некоторых полей, имеет также определенную значимость сам по себе. Например, элемент справочника ФизическиеЛица – это некое физическое лицо, которое имеет набор характеризующих его значений: имя, фамилия, отчество, паспортные данные и т. д. У него может поменяться, например, фамилия или паспортные данные, но при этом с точки зрения системы он останется тем же самым физическим лицом – объектом. Удаление какоголибо объекта из системы приводит к тому, что состояние базы данных с точки зрения прикладного решения изменяется. Даже создав новый элемент справочника ФизическиеЛица с теми же самыми значениями реквизитов, мы получим уже другое состояние базы данных, поскольку это будет уже другой объект с другим уникальным идентификатором.
К объектным данным в «1С:Предприятии» относятся данные следующих объектов конфигурации: ■■ ■■ ■■ ■■ ■■ ■■ ■■ ■■
Справочник, Документ, План видов характеристик, План счетов, План видов расчета, План обмена, Бизнес-процесс, Задача.
Для каждой объектной сущности конфигурации система создает набор связанных между собой таблиц, в которых и будут храниться данные этого объекта. Количество и состав таблиц различны для каждого объекта метаданных. Структура хранения объектных данных всегда состоит из основной таблицы и, возможно, нескольких других таблиц (по одной таблице на каждую табличную часть объекта). Например, для документа Доверенность, который имеет некоторый набор реквизитов и табличную часть Товары (рис. 4.1), в базе данных будут созданы две таблицы.
В отличие от объектных данных, необъектные данные не имеют собственной ценности и полностью описываются значениями своих полей. Необъектные данные представляют собой записи, которые хранятся в базе данных. Для записей не поддерживаются внутренние уникальные идентификаторы. Удалив некоторую запись и создав новую с точно такими же значениями полей, мы получим то же самое состояние базы данных, которое было до удаления записи. Рассмотрим работу с объектными и необъектными данными более подробно. Том 1
Рис. 4.1. Документ «Доверенность»
65
Глава 4. Работа с данными Таблица документа будет содержать поля для каждого реквизита документа, а для табличной части будет создана отдельная таблица, содержащая поля для всех реквизитов табличной части документа (рис. 4.2).
Ссылка Значение ссылочного типа (СправочникСсылка., ДокументСсылка. и т. д.) используется везде, где требуется однозначно идентифицировать объект базы данных. Фактически такое значение представляет собой внутренний идентификатор, который хранится в поле Ссылка таблиц базы данных. Например, справочник Валюты хранится в базе данных в таблице, которая, помимо служебных колонок (стандартных реквизитов), содержит отдельные колонки для каждого реквизита справочника, заданного в конфигураторе. Поле Ссылка – это одно из служебных полей. Значение этого поля позволяет однозначно отличить один элемент справочника от другого (проще говоря, одну валюту от другой), рис. 4.3.
Рис. 4.2. Таблицы документа «Доверенность»
Отличительной особенностью этих таблиц является то, что каждая из них содержит поле Ссылка, в котором хранится внутренний идентификатор, соответствующий каждому из документов. Таким образом, объект документа представляет собой совокупность записи основной таблицы и строк табличных частей, относящихся к этому документу. Основная таблица объектных данных также содержит обязательное поле, в котором хранится текущая версия объекта. Значение этого поля изменяется при каждой записи данных объекта в базу данных. Благодаря использованию этого поля обеспечивается оптимистическая блокировка объектных данных. Подробнее
Раздел «Оптимистическая блокировка», стр. 74.
Для работы с объектными данными во встроенном языке существуют два основных типа: ссылка и объект. Рассмотрим каждый из них более подробно.
66
Рис. 4.3. Поле «Ссылка» справочника «Валюты»
Значение ссылки может, например, выбираться в полях ввода, храниться в полях других таблиц базы данных и т. д. Например, поля Организация и ФизЛицо документа Доверенность будут хранить ссылки на элементы справочников Организации и ФизическиеЛица (рис. 4.4). Значения ссылочного типа можно сравнивать между собой. Важным моментом является то, что для каждого объекта конфигурации во встроенном языке создается свой тип ссылки. Таким образом, например, ссылка на справочник Организации никогда не будет равна ссылке на справочник ФизическиеЛица, поскольку это значения разных типов. Однако две ссылки на справочник Организации могут быть равны между собой, и это будет выполняться только в том случае, если это ссылки на один и тот же объект базы данных (рис. 4.5).
Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные Листинг 4.1. Сравнение объектов «Ссылка»
Ссылка1 = Справочники.Валюты.НайтиПоКоду("000000810"); ВыборкаВалют = Справочники.Валюты.Выбрать(); Пока ВыборкаВалют.Следующий() Цикл Если Ссылка1 = ВыборкаВалют.Ссылка Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = " " + ВыборкаВалют.Код + " " + ВыборкаВалют.Наименование; Сообщение.Сообщить(); КонецЕсли; КонецЦикла;
Типы ссылок имеют значение по умолчанию – так называемую пустую ссылку. Пустая ссылка – это значение ссылки, которому не соответствует ни один объект в базе данных. Фактически такой внутренний идентификатор выглядит следующим образом: 00000000-0000-0000-0000-000000000000 Рис. 4.4. Хранение ссылок в полях базы данных
Так как тип ссылки создается для каждого объекта конфигурации, то, например, пустые ссылки на разные справочники никогда не будут равны между собой (листинг 4.2). Листинг 4.2. Сравнение пустых ссылок
ПустаяСсылкаНоменклатура = Справочники.Номенклатура.ПустаяСсылка(); ПустаяСсылкаКонтрагенты = Справочники.Контрагенты.ПустаяСсылка(); Если ПустаяСсылкаНоменклатура ПустаяСсылкаКонтрагенты Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Ссылки не равны"; Сообщение.Сообщить(); КонецЕсли;
Ссылка позволяет обращаться к свойствам объекта базы данных, а также получать сам объект. При этом выполняется чтение информации из базы данных, поскольку сама ссылка не содержит этих данных. Подробнее
Раздел «Объект», стр. 69.
Представление ссылочных значений Рис. 4.5. Сравнение объектов «Ссылка»
Ссылки, указывающие на один и тот же объект базы данных, будут равны между собой независимо от того, каким образом они получены. Например, ссылка на валюту с кодом 810 (рубли), полученная через менеджера справочника Валюты, будет равна ссылке на эту валюту, полученной из выборки справочника Валюты (листинг 4.1). Том 1
Поскольку ссылочные значения могут выбираться в поле ввода и использоваться в других элементах интерфейса системы, существует механизм формирования представлений ссылочных значений. Благодаря этому механизму, пользователь может оперировать не безличными внутренними идентификаторами, которые содержит ссылка, а вполне определенными и понятными ему данными, идентифицирующими объекты базы данных. При добавлении объектов конфигурации система самостоятельно определяет правила формирования представлений ссылочных значений,
67
Глава 4. Работа с данными и от разработчика не требуется никаких специальных действий. Однако при необходимости он может внести изменения в правила формирования представлений для ссылок на некоторые типы объектов базы данных. Например, для элементов справочников, видов характеристик, счетов, видов расчетов и узлов планов обмена представление ссылок может быть задано либо в виде кода, либо в виде наименования (рис. 4.6).
А для документов и бизнес-процессов система предоставляет только единственное неизменяемое представление ссылочных значений в виде совокупности синонима документа или бизнес-процесса, его номера и даты. Например: «Приходная накладная 000000003 от 03.05.2011 15:35:27».
Контроль ссылочной целостности «1С:Предприятие» предоставляет разработчику возможность контролировать ссылочную целостность базы данных, однако использование этой возможности не является обязательным. С точки зрения платформы в базе данных вполне могут содержаться неразрешимые ссылки (т. е. ссылки на объекты, которых не существует в базе данных), и это не является ошибкой. Необходимость поддержания ссылочной целостности базы данных определяется логикой прикладного решения, и ситуация, когда база данных содержит ссылки на несуществующие объекты, может быть вполне допустимой для данного прикладного решения. Вопрос о необходимости контроля ссылочной целостности возникает при удалении данных из базы данных. Система позволяет гибко использовать возможности контроля ссылочной целостности как при интерактивном, так и при программном удалении объектов. Интерактивное удаление объектов может быть выполнено двумя способами.
Рис. 4.6. Задание представления справочника
Для задач разработчик может выбрать между представлением ссылок в виде номера или наименования (рис. 4.7).
Во-первых, объект может быть удален непосредственно из базы данных. В этом случае не будет выполняться никаких проверок ссылочной целостности и последующее восстановление объекта будет невозможно. Возможность непосредственного интерактивного удаления регулируется правом Интерактивное удаление. Во-вторых, интерактивное удаление может быть выполнено с использованием механизма контроля ссылочной целостности. В этом случае удаление выполняется в два этапа: сначала пользователь устанавливает пометку удаления для тех объектов, которые он собирается удалить, а затем выполняет процедуру удаления помеченных объектов. При этом сначала будет выполнен поиск ссылок на удаляемые объекты в других данных, а затем для объектов, ссылки на которые отсутствуют, будет выполнено удаление.
Рис. 4.7. Задание представления задачи
68
При удалении объектов средствами встроенного языка также существует возможность использовать или не использовать контроль ссылочной целостности. Непосредственное удаление объектов может быть выполнено методом объекта Удалить(), в то время как пометка на удаление может быть установлена с помощью метода объекта УстановитьПометкуУдаления(). Последующий поиск помеченных на удаление объектов может быть выполнен при помощи функции глобального контекста НайтиПомеченныеНаУдаление(), а их удаление – глобальной процедурой УдалитьОбъекты(), которая позволяет удалять объекты как с контролем Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные ссылочной целостности, так и без. При этом следует учитывать, что удаление с контролем ссылочной целостности выполняется в монопольном режиме. При необходимости может быть выполнен отдельно только поиск ссылок на удаляемые объекты – для этого используется функция глобального контекста НайтиПоСсылкам(), которая возвращает список найденных ссылок на переданные ей объекты.
Особенности использования пометки удаления Для того чтобы отличить объекты, помеченные на удаление, от других объектов базы данных, таблицы, хранящие данные этих объектов, содержат специальное поле ПометкаУдаления. Значение этого поля может быть установлено двумя способами.
Рис. 4.8. Документ «ЗаказПоставщику»
Объект документа (ДокументОбъект.ЗаказПоставщику) будет представлять собой совокупность значений полей основной таблицы документа и полей каждой из таблиц, в которых хранятся данные его табличных частей (рис. 4.9).
Во-первых, может использоваться интерактивная установка пометки удаления или программное выполнение метода объекта УстановитьПометкуУдаления(). В этом случае кроме собственно установки значения этого поля будет выполнен ряд дополнительных действий, состав которых зависит от типа помечаемого объекта. Например, для справочника будет установлена пометка удаления для всех подчиненных элементов этого справочника и подчиненных справочников, для документа будет выполнена отмена проведения и т. д. Также будет вызвано событие объекта ПередЗаписью(), поскольку будет выполняться сохранение измененного свойства ПометкаУдаления этого объекта. Во-вторых, значение поля ПометкаУдаления может быть установлено путем непосредственной установки свойства ПометкаУдаления объекта и последующей его записи. В этом случае никаких дополнительных действий выполняться не будет, однако следует учитывать особенности работы некоторых объектов. Например, документ не может быть одновременно проведен и помечен на удаление, поэтому, если требуется пометить на удаление проведенный документ, предварительно следует установить его свойство Проведен в значение Ложь или выполнить отмену проведения документа (Записать(РежимЗаписиДокумента.ОтменаПроведения)).
Объект Тип объекта служит, прежде всего, для модификации (чтения и изменения) данных, содержащихся в объекте базы данных. Остальные объекты встроенного языка позволяют только читать информацию базы данных. Как уже говорилось ранее, объект представляет собой совокупность записи основной таблицы и строк табличных частей, относящихся к этому объекту. Например, рассмотрим документ ЗаказПоставщику, имеющий три табличные части (рис. 4.8). Том 1
Рис. 4.9. Данные объекта документа
Тип объекта используется при создании новых объектов для редактирования и удаления существующих объектов. Кроме этого, тип объекта используется для отображения и редактирования всех данных объекта в форме объекта.
69
Глава 4. Работа с данными Значения этого типа, так же как и значения ссылок, можно сравнивать между собой. Однако, в отличие от ссылок, значения этого типа будут равны между собой только тогда, когда они являются одним и тем же экземпляром программного объекта. Например, если в следующем примере (листинг 4.3) в переменную Объект1 получить экземпляр программного объекта, соответствующий элементу справочника Номенклатура и затем значение этой переменной присвоить переменной Объект2, то значения этих переменных будут равны.
Во-вторых, значение этого типа может быть получено из ссылки путем выполнения метода ПолучитьОбъект(). В этом случае будет создан экземпляр программного объекта и выполнено чтение данных из базы данных (или из кеша). При этом считываются значения всех реквизитов объекта и значения всех реквизитов всех его табличных частей (рис. 4.11).
Листинг 4.3. Сравнение объектов
Объект1 = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Объект2 = Объект1; Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Объект1 = Объект2"; Сообщение.Сообщить();
Если же в переменные Объект1 и Объект2 получить экземпляры объекта, соответствующие одному и тому же элементу справочника Номенклатура, то значения этих переменных не будут равны, несмотря на то, что в них считан один и тот же объект базы данных и совпадают все данные этого объекта (листинг 4.4). Листинг 4.4. Сравнение объектов
Объект1 = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Объект2 = Справочники.Номенклатура.НайтиПоКоду("000000001").ПолучитьОбъект(); Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Объект1 Объект2"; Сообщение.Сообщить();
Значение типа
Объект
Рис. 4.11. Получение объекта
В-третьих, значение этого типа может быть получено из выборки путем выполнения метода с аналогичным названием – ПолучитьОбъект(). В этом случае также будет создан экземпляр программного объекта, однако чтение из базы данных выполняться не будет, т. к. выборка считывает из базы данных все данные объектов, и данные созданного экземпляра объекта будут заполнены непосредственно из программного объекта выборки (рис. 4.12).
может быть получено несколькими способами.
Во-первых, значение этого типа может быть получено через менеджер объекта, с использованием соответствующего метода (например, для справочников это метод СоздатьЭлемент(), для документов – СоздатьДокумент() и т. д.). При этом будет создан новый экземпляр программного объекта, которому не соответствует ни один объект в базе данных. В дальнейшем, когда будет выполнена запись этого объекта, появится и новый объект в базе данных (рис. 4.10).
Рис. 4.12. Получение объекта
В связи с тем, что тип объекта позволяет модифицировать данные, он имеет (помимо свойств и методов) целый ряд событий, позволяющих разработчику определять собственный алгоритм обработки выполняемых действий. Среди основных событий, поддерживаемых этим типом, можно перечислить следующие. – это событие возникает перед записью объекта в базу данных, после начала транзакции записи, но до начала непосредственной записи данных. В обработчике этого события можно проанализировать необходимость (или возможность) выполнения записи данных и отказаться от нее, если какие-либо условия не выполняются. ПередЗаписью
– это событие возникает после того, как данные записаны в базу данных, но до того, как окончится транзакция записи. В обработчике этого события можно выполнять те действия, которые обязательно ПриЗаписи
Рис. 4.10. Создание нового объекта
70
Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные должны быть выполнены только в том случае, если объект записан. Здесь также разработчик может отказаться от записи данных, если, например, в результате записи этих данных в базу нарушаются какие-либо условия. – это событие возникает у нового объекта данных в том случае, если он создается путем копирования (интерактивного или программного) существующего объекта данных. ПриКопировании
– это событие также возникает у нового объекта данных при интерактивном создании нового объекта, при вводе объекта на основании (интерактивного или программного), а также при выполнении метода объекта Заполнить(). В обработчике этого события предусматривается некоторый алгоритм, позволяющий выполнять начальное заполнение реквизитов нового объекта в зависимости от типа объекта-основания. ОбработкаЗаполнения
– это событие вызывается перед записью данных объекта, до начала транзакции записи. В обработчике этого события разработчик может реализовать собственные алгоритмы проверки заполнения реквизитов объекта, добавить в массив проверяемых реквизитов дополнительные реквизиты, чтобы платформа выполнила их проверку, или очистить массив проверяемых реквизитов, отказавшись от их стандартной проверки. Разработчик также может отказаться от записи объекта, если, например, какие-то условия проверки не были выполнены. ОбработкаПроверкиЗаполнения
– это событие возникает в транзакции удаления перед непосредственным удалением объекта из базы данных. В обработчике этого события можно предусмотреть выполнение каких-либо действий перед удалением объекта, а также при необходимости отменить удаление объекта, если не выполняются какие-либо условия. ПередУдалением
Кеширование представлений и объектов При работе с объектными данными (как программно, так и интерактивно), система выполняет кеширование считываемых данных в оперативной памяти. Для этого используется кеш объектов. При любых интерактивных действиях и при программном доступе к объектным данным с использованием объектной модели прежде всего система будет выполнять обращение к кешу объектов для того, чтобы получить запрашиваемые данные. Кеш объектов состоит из двух частей: транзакционного кеша и обычного кеша. В зависимости от того, происходит ли чтение в рамках транзакции или нет, будет выполняться обращение к той или иной части кеша (рис. 4.13). В кеш объектов считываются два «вида» данных: либо все данные объекта целиком, либо значения полей, необходимые для формирования представления ссылки на данный объект. Том 1
Рис. 4.13. Обращение к кешу объектов
Значения полей, необходимые для получения представления ссылки, считываются тогда, когда возникает необходимость отобразить ссылку на объект в каком-либо элементе интерфейса, а также при явном или неявном преобразовании ссылочной переменной к типу Строка. В остальных случаях выполняется полное чтение всех данных объекта, в том числе и тогда, когда выполняется обращение к какому-либо реквизиту объекта через точку от ссылки. Эту особенность нужно учитывать при проектировании структуры объектов конфигурации. Так, например, если предполагается хранение в информационной базе картинок, образов файлов или больших текстовых данных, то рекомендуется создавать для этого отдельные структуры хранения (например, справочники или регистры сведений), а не включать эту информацию в состав реквизитов или табличных частей объектов, которым эта информация соответствует. Это позволит избежать считывания и записи больших объемов данных при работе с этими объектами. Обычный кеш
Если при обращении к обычному кешу требуемых данных в нем нет, то выполняется чтение данных объекта из базы данных и сохранение их в кеше. Уникальным идентификатором для кеша в данном случае будет являться ссылка на объект базы данных. Поэтому данные каждого считанного объекта могут существовать в кеше в одном из двух видов: либо все данные объекта, либо представление объекта. Таким образом, если мы обратимся к кешу для получения представления объекта и в кеше есть информация для нашей ссылки, данные будут взяты из кеша (если в кеше весь объект, нужное представление будет получено из данных объекта). Если в кеше нет информации для нашей ссылки, из базы данных в кеш будут считаны только поля, необходимые для формирования представления объекта.
71
Глава 4. Работа с данными Если мы обратимся к кешу для получения реквизита объекта (через точку от ссылки) и в кеше есть информация для нашей ссылки, дальнейшие действия будут зависеть от того, какие именно данные находятся в кеше. Если в кеше весь объект, значение реквизита будет получено из кеша. Если в кеше представление объекта, оно будет удалено из кеша и в кеш будут считаны все данные объекта. Если же при получении реквизита объекта в кеше нет информации для нашей ссылки, из базы данных будут считаны все поля объекта. Считанные данные будут находиться в кеше до тех пор, пока не наступит одно из четырех событий: ■■ считанные данные будут вытеснены из кеша другими считанными данными других объектов (переполнение кеша); ■■ при очередном обращении к кешу окажется, что считанные данные были изменены в базе данных; ■■ закончится интервал времени в 20 минут; ■■ данные будут изменены в базе данных. Все считанные данные помещаются в последовательную очередь, и, поскольку объем кеша ограничен, наиболее старые данные будут вытесняться из кеша последними считанными данными. При повторном обращении к кешу за данными уже считанного объекта будет анализироваться интервал времени, прошедший с момента появления данных в кеше. Если обращение происходит в пределах 20 секунд после поступления данных в кеш, данные считаются верными (валидными). Если интервал превысил 20 секунд, будет выполняться проверка на то, что версия данных, хранящихся в кеше, соответствует версии данных, находящихся в базе данных. Если окажется, что версии данных не совпадают (т. е. произошло изменение данных в базе данных), данные, находящиеся в кеше, будут удалены из него и выполнено повторное считывание данных из базы данных. Начиная с этого момента, начнется отсчет следующего 20-секундного интервала валидности этих данных. Кроме всех вышеперечисленных событий, считанные данные будут удалены из кеша по истечении 20 минут после их последнего считывания из базы данных.
На выполнение второго оператора будет тратиться гораздо меньше времени, поскольку в первом случае (с большой долей вероятности) будет выполняться обращение к базе данных и чтение всех данных объекта, а во втором – чтение из оперативной памяти (кеша объектов). Транзакционный кеш
Если обращение к данным происходит в рамках транзакции, то оно переадресуется транзакционному кешу. Транзакционный кеш по сути представляет собой ту же последовательную очередь, что и обычный кеш, за исключением того, что все данные, находящиеся в транзакционном кеше, являются валидными (гарантированно актуальными). При считывании данных в транзакционный кеш устанавливается блокировка на данные в базе данных, поэтому они гарантированно не могут быть изменены до окончания транзакции. Транзакционный кеш хранит считанные данные до тех пор, пока они не будут вытеснены более поздними считанными данными или пока не закончится транзакция. По окончании транзакции транзакционный кеш очищается, однако действия, выполняемые при этом, зависят от состояния завершения транзакции. Если транзакция завершена успешно (Commit), данные всех объектов, содержащиеся в транзакционном кеше, переносятся в обычный кеш, а транзакционный кеш очищается (рис. 4.14).
Рис. 4.14. Успешное завершение транзакции
Если был выполнен отказ от изменений (Rollback), то просто очищается транзакционный кеш (рис. 4.15).
Рассмотрим последовательное выполнение двух операторов (листинг 4.5), где Номенклатура – это ссылка на объект справочника, а Наименование и ВидНоменклатуры – реквизиты справочника Номенклатура. Листинг 4.5. Последовательное обращение к реквизитам объекта
А = Номенклатура.Наименование; В = Номенклатура.ВидНоменклатуры; Рис. 4.15. Откат транзакции
72
Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные
Оптимизированная запись объектов При записи объектов базы данных (программной или интерактивной) выполняется оптимизация записи изменений в базу данных. Так, например, если не менялись значения реквизитов самого объекта, то будет записана только минимальная информация об изменении (версия объекта).
Неопределено,
если новый элемент создается интерактивной командой из панели действий. Поэтому в алгоритме начального заполнения нового объекта полезно проанализировать этот параметр и в зависимости от его значения выполнить определенные действия. Следует учитывать, что при копировании (как интерактивном, так и средствами встроенного языка) событие ОбработкаЗаполнения не вызывается.
Если не менялись строки табличной части, то табличная часть записываться не будет.
Блокировки
Если менялись только отдельные строки табличной части или добавлялись новые строки, то будут записаны только измененные и добавленные строки. Однако если менялся порядок строк или строки удалялись, то будут записаны все строки табличной части.
При работе с объектными данными система обеспечивает два вида блокировок – пессимистическую и оптимистическую, которые позволяют выполнять целостные изменения объектов при одновременной работе нескольких пользователей.
Создание новых объектов
Пессимистическая блокировка
Зачастую при разработке или модификации прикладных решений требуется выполнять некоторые действия, сопровождающие создание тех или иных новых объектов базы данных. Например, при создании новой приходной накладной может потребоваться автоматически заполнять поле Склад, если известно, что все поступающие товары должны приходоваться только на один определенный склад. Также может потребоваться установка каких-либо других реквизитов документа по умолчанию.
Механизм пессимистической блокировки запрещает изменение данных объекта другими сессиями или данной сессией до тех пор, пока блокировка не будет снята этим объектом встроенного языка (рис. 4.16).
Прежде всего, при заполнении нового объекта данными можно во многих случаях обойтись вообще без написания какого-либо кода. Для этого у реквизитов объектов конфигурации есть свойства Значение заполнения и Заполнять из данных заполнения. Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.
Механизм пессимистической блокировки используется системой «1С:Предприятие» для блокировки объектов, редактируемых в форме. В то же время разработчик также имеет возможность задействовать этот механизм, используя средства встроенного языка.
Если этих возможностей недостаточно, то нужно использовать возможности встроенного языка. Действия с данными объекта нужно выполнять в модуле объекта, в обработчике события ОбработкаЗаполнения. Это событие возникает при интерактивном создании нового объекта, при вводе объекта на основании (интерактивном или программном), а также при выполнении метода объекта Заполнить(). В обработчике этого события предусматривается некоторый алгоритм, позволяющий выполнять начальное заполнение реквизитов нового объекта в зависимости от типа объекта-основания. При этом в параметр ДанныеЗаполнения этого обработчика могут быть переданы различные значения в зависимости от того, каким образом создается новый элемент. Например, он может иметь тип ссылки, если новый объект вводится на основании. Или он может иметь тип Структура, если новый объект создается интерактивной командой из списка, в котором установлен отбор. В этом случае структура будет содержать значения элементов отбора этого списка. Также этот параметр может иметь тип Том 1
Рис. 4.16. Пессимистическая блокировка
Если говорить о системе, то механизмом пессимистической блокировки управляют расширения форм прикладных объектов. В тот момент, когда пользователь начинает модификацию объекта в форме, расширение формы устанавливает пессимистическую блокировку. Если после этого другой пользователь, например, попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект. Когда пользователь, редактировавший объект, закроет форму объекта, расширение формы снимет пессимистическую блокировку. Поэтому пессимистическую блокировку можно рассматривать как блокировку данных для редактирования, связанную с идентификатором конкретной формы, в которой редактируется объект.
73
Глава 4. Работа с данными Расширения стандартных форм объектов устанавливают пессимистическую блокировку автоматически, но разработчик, находясь в модуле формы, может с помощью метода формы ЗаблокироватьДанныеФормыДляРедактирования() обеспечить поведение любой другой формы, аналогичное стандартному. Для снятия блокировки используется метод формы РазблокироватьДанныеФормыДляРедактирования(). При использовании этих методов блокировка будет привязана к идентификатору той формы, из которой она установлена. Кроме того, чтобы задействовать пессимистическую блокировку, разработчик может использовать методы глобального контекста ЗаблокироватьДанныеДляРедактирования() и РазблокироватьДанныеДляРедактирования(). В эти методы обязательно нужно передать ссылку на объект информационной базы или ключ записи регистра сведений, данные которого требуется заблокировать. Если блокировка устанавливается с привязкой к конкретной форме, то в метод ЗаблокироватьДанныеДляРедактирования() нужно передать также идентификатор этой формы. В этом случае для снятия блокировки методом РазблокироватьДанныеДляРедактирования() указывается этот же идентификатор.
Исключение // Нельзя модифицировать данные объекта. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Данные объекта уже заблокированы"; Сообщение.Сообщить(); Возврат Ложь; КонецПопытки; КонецФункции
Следует помнить, что попытки установить блокировку одного и того же объекта с указанием идентификатора формы и без указания идентификатора несовместимы друг с другом. Оптимистическая блокировка
Оптимистическая блокировка запрещает запись объекта в базу данных, если после считывания объекта он был изменен в базе данных (рис. 4.17).
Можно не использовать в методах глобального контекста идентификатор формы. В этом случае устанавливаемая пессимистическая блокировка не будет привязана к конкретной форме. Например, это может понадобиться в обработке, выполняющей программную модификацию данных параллельно работе других пользователей. Перед модификацией данных нужно попытаться их заблокировать. Если попытка удалась, данные можно модифицировать. Если объект уже заблокирован, то будет вызвано исключение, которое может быть обработано конструкцией Попытка … Исключение … КонецПопытки (листинг 4.6). Листинг 4.6. Пример проверки пессимистической блокировки
&НаСервере Функция ПримерМодификации() ТоварСсылка = Справочники.Товары.НайтиПоКоду("000000001"); Попытка ЗаблокироватьДанныеДляРедактирования(ТоварСсылка); // Можно выполнять модификацию данных объекта. // ... ТоварОбъект = ТоварСсылка.ПолучитьОбъект(); ТоварОбъект.Наименование = "Новое наименование"; ТоварОбъект.Записать(); Возврат Истина;
74
Рис. 4.17. Оптимистическая блокировка
Строго говоря, оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. Когда программный объект считывает данные из базы данных, в числе прочего считывается и версия объекта, хранящегося в базе данных. Предположим, что до начала редактирования данных (до установки пессимистической блокировки) данные объекта в базе данных были изменены (например, другим пользователем). В этом случае номер версии объекта, хранящийся в базе данных, также изменится. При попытке первого пользователя записать или заблокировать этот объект будет выполнена проверка соответствия версии объекта, находящегося в памяти, и версии объекта, хранящейся в базе данных. Так как версии отличаются, будет выдано сообщение об ошибке, т. е. сработает оптимистическая блокировка. Оптимистическая блокировка гарантирует, что если пользователь изменяет объект, то его изменения не «затрут» изменения, сделанные другими сессиями или другими программными объектами в этой же сессии. Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные Пессимистические блокировки и транзакции
Важным моментом является то, что пессимистическая и оптимистическая блокировки обеспечиваются не средствами базы данных, а средствами собственного менеджера блокировок, который работает «над уровнем» базы данных. По этой причине объектные блокировки абсолютно прозрачны для транзакций. Единственная особенность заключается в том, что если пессимистическая блокировка была установлена в транзакции и в результате был выполнен откат этой транзакции (rollback), то блокировка будет автоматически снята. Подробнее
стей выделяются только константы: для каждой константы в базе данных хранится одно значение. Поэтому в дальнейшем мы их рассматривать не будем; работа с ними не вызывает сложностей.
Подчинение регистратору Важным свойством всех записей является их подчинение регистратору. Регистратор – это некоторый документ, с которым связаны записи необъектных данных. Не может существовать записей, не относящихся к какому-либо регистратору. Исключение составляет лишь регистр сведений, когда для него выбран независимый режим записи (без подчинения регистратору). Поэтому любая запись всегда содержит обязательное поле Регистратор (рис. 4.18).
Раздел «Транзакции», стр. 104.
Необъектные данные Модель хранения данных К необъектным данным в «1С:Предприятии» относятся данные следующих объектов конфигурации: ■■ ■■ ■■ ■■ ■■ ■■ ■■
регистр сведений, регистр накопления, регистр бухгалтерии, регистр расчета, перерасчет, последовательность, константа.
Необъектные данные с точки зрения «1С:Предприятия» представляют собой некоторый набор записей, которые хранятся в таблице. Каждая из этих записей полностью описывается значениями своих полей. Для системы эти записи не обладают какой-либо значимостью, кроме того, что в их полях содержатся некоторые значения. Запись можно удалить, а затем создать новую, с такими же значениями полей. Состояние базы данных при этом не изменится (с точки зрения логики прикладного решения). Это принципиально отличает необъектные данные от объектных: объект нельзя создать дважды, он ценен сам по себе, самим фактом своего существования. Второе важное отличие заключается в том, что, изменив значения полей записи, мы получаем другую запись, в то время как изменение значений полей объекта не влечет за собой появление нового объекта. Большинство необъектных сущностей конфигурации имеют общий порядок работы с данными. Из всей совокупности необъектных сущноТом 1
Рис. 4.18. Поле «Регистратор»
Записи, относящиеся к одному регистратору, называются движениями этого регистратора. Движения не являются частью владеющего ими документа, при записи и чтении документа они не записываются и не считываются. Однако они тесно связаны с ним. Движения могут создаваться при проведении документов, при записи документов, могут формироваться интерактивно или в виде набора записей регистра (с отбором по регистратору). Движения не могут существовать отдельно от своих регистраторов. Поэтому при удалении документов или отмене проведения (если свойство Удаление движений установлено в значение, отличное от Не удалять) система производит поиск движений этого документа в таблицах всех регистров, для которых данный документ может быть регистратором, и удаляет их. Кроме этого, при удалении документа его движения всегда удаляются. Таким образом, время жизни записей определяется их регистратором: если регистратора нет, то и нет смысла в существовании его движений. Даже в том случае, когда записи создаются без непосредственного участия регистратора, они все равно обязательно должны быть подчинены какомулибо документу; запись нельзя записать, если в ней не указана ссылка на регистратор.
75
Глава 4. Работа с данными Наличие или отсутствие движений не связано с проведенностью документа-регистратора или с пометкой его на удаление: непроведенный документ может иметь движения, проведенный документ может не иметь движений, помеченный на удаление документ также может иметь движения. Такой подход позволяет реализовывать в системе «1С:Предприятие» различные способы регистрации изменений в учетных механизмах (регистрах). Например, движения документа могут редактироваться непосредственно в самом документе, и в этом случае понятие проведения документа просто не имеет смысла. Такой прием используется при автоматизации бухгалтерских задач, для ручного ввода проводок. Также дата движений документа не связана жестко с датой регистратора. Например, один и тот же документ может иметь движения разными датами. Эта возможность используется, например, при автоматизации задач планирования, для ввода тех или иных планируемых в будущем значений. Наиболее простой моделью использования регистров является создание движений в обработчике проведения регистратора. В этом случае вся остальная логика работы будет поддерживаться системой автоматически. Другие варианты взаимодействия движений и регистратора следует разрабатывать и описывать самостоятельно, в зависимости от конкретной прикладной задачи.
Уникальность записей Для каждого объекта метаданных в системе определен ключ записи. Данные объекта конфигурации не могут содержать записи с одинаковыми значениями ключа записи. Ключ записи формируется, как правило, из значений нескольких полей объекта конфигурации. Для разных объектов конфигурации состав ключа записи отличается, кроме этого он может быть различным для одного и того же объекта конфигурации, в зависимости от его свойств. Для всех необъектных сущностей, подчиненных регистратору, ключ записи включает ссылку на регистратор и номер строки. Номер строки, собственно, и используется для обеспечения уникальности записей, а также для упорядочивания записей в пределах регистратора. Кроме этого, в состав ключа записи могут входить и другие поля, например, период, измерения регистра – для необъектных сущностей, не подчиненных регистратору. Наличие уникального ключа требуется системе для решения различных задач. Например, это позволяет позиционироваться в табличном поле на некоторую запись.
76
Набор записей По аналогии с объектными данными, изменение которых возможно только при помощи типов объектов, наборы записей используются для модификации необъектных данных: они позволяют читать, модифицировать и удалять необъектные данные. По своей сути набор записей представляет собой коллекцию отдельных записей, принадлежащих некоторому объекту конфигурации. В зависимости от объекта конфигурации набор записей может содержать только некоторые или же все записи, принадлежащие этому объекту конфигурации. Для указания того, какие именно записи должны входить в набор записей, используется его свойство Отбор. Элементы отбора в наборе записей для того или иного объекта конфигурации создаются платформой; разработчик не имеет возможности добавлять собственные элементы отбора, но может использовать существующие, устанавливая для них условия равенства нужному значению. В таблице 4.1 представлен состав отбора в наборе записей для различных объектов конфигурации. Таблица 4.1. Поля, по которым устанавливается отбор Объект конфигурации
Поля, по которым устанавливается отбор
Регистр сведений (подчиненный регистратору) Регистр сведений (непериодический, независимый) Регистр сведений (периодический, независимый) Регистр накопления Регистр бухгалтерии Регистр расчета Перерасчет
Регистратор Набор измерений Период и набор измерений Регистратор Регистратор Регистратор и набор измерений Объект перерасчета (регистратор регистра расчета) и набор измерений перерасчета Регистратор
Последовательность
Существует следующая особенность работы системы с наборами записей: если среди элементов отбора существует отбор по регистратору, то он должен обязательно быть установлен, иначе при записи такого набора будет выдано сообщение об ошибке. Отсюда следует, что для большинства объектов конфигурации, которые хранят необъектные данные, допускается модификация этих данных только частями, «гранулами» – наборами записей, относящихся к определенному регистратору (или более мелкими, если есть возможность установки других отборов). Наряду с этим для независимых регистров сведений допускается модификация сразу всех данных, хранящихся в регистре (если ни одно из условий отбора не задано). Например, для независимого регистра сведений Комплектующие номенклатуры набор записей может включать в себя как все записи регистра (если отбор не установлен), так и лишь некоторые его записи (рис. 4.19). Профессиональная разработка в системе «1С:Предприятие 8»
Объектные и необъектные данные
Рис. 4.19. Примеры наборов записей
В то же время для регистра расчета Основные начисления, у которого обязательно должен быть установлен отбор по регистратору, набор записей может включать в себя максимум все записи, принадлежащие одному регистратору, или некоторое их подмножество (рис. 4.20).
Рис. 4.20. Примеры наборов записей
Отличительной особенностью наборов записей является то, что для них не существует понятия удаления. Набор записей можно только записать, причем запись может быть выполнена либо с замещением существующих записей, удовлетворяющих отбору, либо с добавлением новых записей к существующим. При записи с добавлением новые записи будут добавлены к существующим (рис. 4.21).
Том 1
77
Глава 4. Работа с данными не используется. Основное назначение этого типа – предоставить доступ к значениям полей записи.
Рис. 4.22. Запись с замещением
Рис. 4.21. Запись с добавлением
При записи с замещением существующие записи будут заменены новыми (рис. 4.22). Таким образом, для удаления записей необъектных данных необходимо просто записать с замещением пустой набор записей (т. е. набор записей, не содержащий ни одной записи). Набор записей представляет собой коллекцию объектов, имеющих тип записи. Перебрать все записи, входящие в набор записей, можно с помощью конструкции Для Каждого Из … Цикл. Тип записи используется только в наборах записей. Отдельно от наборов записей этот тип
78
Интерактивное редактирование наборов записей Для необъектных данных не существует механизма, аналогичного объектным блокировкам (оптимистической и пессимистической). Поэтому при использовании набора записей для интерактивного редактирования следует учитывать, что в период после считывания данных из базы данных и перед записью их обратно в базу данных они могут быть изменены в базе данных другой сессией или другим набором записей в этой же сессии. Таким образом, может возникнуть ситуация, когда изменения, внесенные одним пользователем, могут быть потеряны в результате того, что второй пользователь перезапишет их старыми данными. Профессиональная разработка в системе «1С:Предприятие 8»
Система типов
Система типов
Типы значений и типы данных Прикладное решение «1С:Предприятия» оперирует различными величинами: числами, символами, объектами. Каждая величина имеет тип. Тип величины определяет возможные значения и набор определенных для них операций. Существуют типы, определенные на уровне системы, и типы, создаваемые в конкретном прикладном решении. Например, на уровне системы определены примитивные типы, такие как Строка, Число, Булево и т. д. Также на уровне системы определены и другие типы, которые могут быть использованы в прикладном решении, например, универсальные коллекции значений (Массив, Структура, СписокЗначений), общие типы (ТекстовыйДокумент, ТабличныйДокумент, ПостроительОтчета, АнализДанных) и др. Полный перечень типов значений, которые может использовать система «1С:Предприятие», приведен в описании встроенного языка и в синтакс-помощнике. Переменные встроенного языка «1С:Предприятия» не типизированы. Это значит, что тип переменной определяется типом того значения, которое хранится в переменной в данный момент. Таким образом, в произвольные моменты работы прикладного решения переменная может иметь различные типы значения. Подробнее
Раздел «Типы значений», стр. 80.
В то же время данные «1С:Предприятия» существуют не только в оперативной памяти компьютера, где они содержатся в объектах встроенного языка, но и в базе данных, где осуществляется долговременное хранение этих данных. База данных представляет собой совокупность некоторого количества таблиц, создаваемых в соответствии со структурой объектов конфигурации прикладного решения. Таблицы базы данных состоят из полей, и для каждого поля обязательно должен быть указан тип значений, которые могут храниться в этом поле. По этой причине все объекты конфигурации, которые «отвечают» за создание тех или иных полей в базе
Том 1
данных, должны иметь совершенно определенный тип. Такими объектами являются, например, реквизиты, измерения, ресурсы и т. д. Для того чтобы указать тип объекта конфигурации, «отвечающего» за создание того или иного поля базы данных, в системе «1С:Предприятие» используются не типы значений, а более сложное понятие – тип данных. Такой подход позволяет, с одной стороны, изолировать разработчика от конкретного хранилища данных, а с другой стороны – сделать работу с данными значительно более гибкой. Отличие типа данных от типа значения заключается в том, что тип данных является характеристикой, которая может содержать описание как одного, так и нескольких типов значений. В результате у разработчика появляются две важные возможности: ■■ уточнение некоторых примитивных типов значений. Например, можно указать, что реквизит Количество будет содержать не просто числовые значения, а неотрицательные числовые значения с количеством разрядов не более 15 и дробной частью из 3 разрядов; ■■ указание одновременно нескольких возможных типов значений. Например, можно указать, что реквизит Сделка может содержать ссылку как на счет, выставленный покупателю, так и на счет, выставленный поставщику. В результате в реквизите Сделка смогут одновременно храниться как значения одного, так и другого типа. При этом тип данных этого реквизита будет всегда одним и тем же, но тип значения этого реквизита в каждый конкретный момент времени будет определяться типом значения, которое в нем хранится. Типы данных используются в системе «1С:Предприятие» не только в части, связанной с базой данных, но и в интерфейсной части. Так, например, типы данных должны быть определены для всех реквизитов форм и для всех элементов управления, расположенных в форме. Кроме этого, некоторые объекты встроенного языка в силу специфики своего использования также могут потребовать указания типа данных, которые в них хранятся. Например, указание типа данных может использоваться для списка значений, для колонок таблицы значений и дерева значений. Подробнее
Раздел «Типы данных», стр. 99.
79
Глава 4. Работа с данными
Типы значений Примитивные типы Число Числовой тип предназначен для представления десятичных чисел. Максимально допустимая разрядность числа, которая может быть сохранена в базе данных, составляет 32 знака, включая десятичную точку. Для числовых значений, хранящихся в памяти (являющихся, например, значением некоторой переменной), разрядность неограниченна.
Такое поведение таблицы позволяет создать список, который легко читается и не содержит лишней информации. Однако если есть необходимость указывать для нулевых значений определенное представление, то это можно выполнить, используя свойства Формат и ФорматРедактирования соответствующей колонки таблицы (в приведенном примере – колонки ТЗЗначение), рис. 4.24.
Литерал значения типа «Число»
Конкретные значения числового типа во встроенном языке и языке запросов могут быть заданы литералом, который представляет собой набор цифр, написанных непосредственно в тексте модуля. Этот набор цифр может начинаться с символов «+» или «-», обозначающих знак числа. В качестве разделителя целой и дробной части числа используется символ «.» (точка), табл. 4.2. Таблица 4.2. Примеры литералов типа «Число» Число
Литерал
3874 -1475,25
3874 -1475.25
Значение типа «Число» по умолчанию
Для числового типа значением по умолчанию является значение 0. По умолчанию, если не задан специальный формат, это значение будет представляться как 0.
Рис. 4.24. Установка формата колонки таблицы
Для колонки таблицы форматная строка поддерживает параметр ЧН, который задает представление нулевого значения. В результате приведенная выше таблица будет выглядеть, например, следующим образом (рис. 4.25).
Однако некоторые элементы управления, используемые в интерфейсе системы, имеют другое представление нулевого значения, что сделано для более удобного представления информации пользователю. Например, в ячейке таблицы значение по умолчанию числового типа отображается как пустое место (рис. 4.23).
Рис. 4.25. Представление нулевого значения в колонке таблицы
Аналогичного результата можно добиться средствами встроенного языка (листинг 4.7). Листинг 4.7. Установка формата колонки таблицы Рис. 4.23. Представление значения типа «Число» по умолчанию в колонке таблицы
80
Элементы.ТЗЗначение.Формат = "ЧН='---'"; Элементы.ТЗЗначение.ФорматРедактирования = "ЧН="---'";
Профессиональная разработка в системе «1С:Предприятие 8»
Система типов При задании представления нулевого значения для колонки таблицы следует иметь в виду, что концевые пробелы при выводе заданного представления нулевого значения в ячейке таблицы будут обрезаны. В поле ввода значение по умолчанию числового типа отображается в зависимости от разрядности дробной части, заданной при указании числового типа данных этого поля ввода. Подробнее
Раздел «Числовые типы данных», стр. 99.
Если количество разрядов дробной части равно нулю, то числовое значение будет отображаться как 0. Если количество разрядов дробной части отлично от нуля, то числовое значение будет отображено как 0,000 (количество нулей после запятой будет соответствовать количеству разрядов дробной части), рис. 4.26.
Таблица 4.4. Логические операции для типа «Число» Операция
Операнды
Результат
Больше или равно
Число >= Число
Равно
Число = Число
Истина, если первый операнд больше либо равен второму. В противном случае Ложь
Не равно
Число Число
Меньше
Число < Число
Больше
Число > Число
Меньше или равно Число Строка
Результат
Истина, если первая строка больше второй. В противном случае Ложь Строка >= Строка Истина, если первая строка больше либо равна второй. В противном случае Ложь Строка < Строка Истина, если первая строка меньше второй. В противном случае Ложь Строка "ača"; Сообщить(Результат);
Сообщение = Новый СообщениеПользователю; Если "истина" тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить(); Если "false" тогда Сообщение.Текст = "Истина";
Таким образом, результат выполнения логических операций над строковыми значениями будет зависеть не только от самих операндов, участвующих в выражении, но и от региональных установок информационной базы, в которой выполняется эта операция.
84
фрагмента
кода
Профессиональная разработка в системе «1С:Предприятие 8»
Система типов Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить();
В результате в окно сообщений будет выведен текст: Истина Ложь
Однако кроме этого к булевым значениям будут преобразовываться также строковые значения, соответствующие представлению булевых значений для языка, выбранного в языке интерфейса платформы. Например, если запустить «1С:Предприятие» из командной строки с литовским языком интерфейса ("C:\Program Files\1Cv82\8.2.15.310\bin\1cv8.exe" /L lt), то тогда следующий код (листинг 4.21) будет выполнен без ошибок и в окно состояния будет выведено Ложь. Листинг 4.21. Неявное преобразование к типу «Булево»
Сообщение = Новый СообщениеПользователю; Если "Ne" тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить();
Если этот же код попытаться выполнить с языком интерфейса de (Немецкий), то будет вызвано исключение, в результате того что значение ne не может быть преобразовано к типу Булево. Если же в этой ситуации строку ne заменить на Nein, что значит Нет по-немецки, то пример (листинг 4.22) отработает без ошибок и в окно сообщений будет выведено Ложь. Листинг 4.22. Неявное преобразование к типу «Булево»
Сообщение = Новый СообщениеПользователю; Если "Nein" тогда Сообщение.Текст = "Истина"; Иначе Сообщение.Текст = "Ложь"; КонецЕсли; Сообщение.Сообщить();
Явное преобразование Преобразование к типу «Число»
Встроенный язык позволяет выполнить явное преобразование значения типа Строка к типу Число при помощи встроенной функции Число(). При этом будут преобразованы только те строки, которые представляют собой правильное строковое представление литерала численного типа. Том 1
Например, может быть выполнено преобразование строки 1125.78 к числу 1125.78 (листинг 4.23). Листинг 4.23. Явное преобразование к типу «Число»
Сообщить(Число("1125.78"));
Следует заметить, что если в строке в качестве разделителя целой и дробной части будет использоваться не точка, а запятая, преобразование также будет выполнено (листинг 4.24). Листинг 4.24. Явное преобразование к типу «Число»
Сообщить(Число("1125,78"));
Преобразование к типу «Дата»
Строковое значение может быть преобразовано к типу Дата. Для этого используется встроенная функция Дата(). Она позволяет преобразовать строку, которая представляет собой части даты, записанные в определенном порядке: год, месяц, день, час, минута и секунда. Например, для того, чтобы получить дату 15 апреля 2011 года 17 часов 45 минут 34 секунды, преобразуемая строка должна иметь вид 20110415174534 (листинг 4.25). Листинг 4.25. Преобразование к типу «Дата»
Сообщить(Дата("20110415174534"));
В результате выполнения приведенного кода будет получена нужная дата: 15.04.2011 17:45:34.
Дата Тип Дата предназначен для представления значения даты и времени с точностью до секунды. Минимальным значением типа Дата является дата 01 января 0001 года 00 часов 00 минут 00 секунд. Литерал значения типа «Дата»
Конкретные значения типа Дата могут быть заданы литералом, который представляет собой последовательность цифр, заключенных в одинарные кавычки. Последовательность цифр представляет собой части даты в следующем порядке: год, месяц, день, час, минута и секунда. Части даты могут быть отделены друг от друга различными разделителями; час, минута и секунда могут быть не указаны – в этом случае предполагается, что они равны нулю (табл. 4.10).
85
Глава 4. Работа с данными Таблица 4.10. Примеры литералов типа «Дата» Дата
Литерал
15.04.2011 22:45:33 15.04.2011 0:00:00 15.04.2011 22:45:33 15.04.2011 22:45:33
'20110415224533' '20110415' '2011-04-15 22:45:33' '2011/04/15-22/45/33'
Задать собственное представление даты по умолчанию можно с помощью свойства ФорматРедактирования поля ввода (рис. 4.28).
В языке запросов для указания литералов типа Дата используется ключевое слово ДАТАВРЕМЯ, после которого в скобках последовательно указываются год, месяц, день, час, минута и секунда. Последние три указывать не обязательно (табл. 4.11). Таблица 4.11. Примеры литералов типа «Дата» Дата
Литерал
15.04.2011 22:45:33 15.04.2011 0:00:00
ДАТАВРЕМЯ(2011, 04, 15, 22, 45, 33) ДАТАВРЕМЯ(2011, 04, 15)
Значение типа «Дата» по умолчанию
Для типа Дата значением по умолчанию является 01 января 0001 года 00 часов 00 минут 00 секунд.
Рис. 4.28. Установка формата в поле ввода
В поле ввода форматная строка поддерживает параметр ДП, который задает представление значения даты по умолчанию. В результате приведенный выше пример будет выглядеть следующим образом (рис. 4.29).
При выводе значения даты по умолчанию она отображается в соответствии с используемыми региональными установками сеанса (например, 01.01.0001 0:00:00). Однако при выводе значения даты по умолчанию в некоторые элементы управления она будет представляться иначе, что обусловлено удобством ввода или отображения. Например, значение даты по умолчанию в поле ввода будет отображено в виде символов-разделителей даты, используемых при заданных региональных установках. Состав разделителей будет определяться составом даты (Дата и время, Дата, Время), указанным при описании типа данных, с которыми работает данное поле ввода (рис. 4.27).
Рис. 4.29. Отображение пустой даты в поле ввода
Аналогичного результата можно добиться, используя средства встроенного языка (листинг 4.26). Листинг 4.26. Установка формата в поле ввода
Элементы.ПолеВводаДатаИВремя.ФорматРедактирования = "ДП='01.01.2011 00:00:00'"; Элементы.ПолеВводаДата.ФорматРедактирования = "ДП='01.01.2011'"; Элементы.ПолеВводаВремя.ФорматРедактирования = "ДП='00:00:00'";
Рис. 4.27. Пустая дата в поле ввода
При выводе значения даты по умолчанию в колонку таблицы она будет отображаться как пустое место, вне зависимости от того, какой состав даты установлен при описании типа данных (рис. 4.30).
Подробнее
Раздел «Типы данных, описывающие значения типа «Дата»», стр. 101.
86
Профессиональная разработка в системе «1С:Предприятие 8»
Система типов Аналогичного результата можно добиться средствами встроенного языка (листинг 4.27). Листинг 4.27. Установка формата колонки таблицы
Элементы.ТЗЗначение.Формат = "ДП='01.01.2011 00:00:00'"; Элементы.ТЗЗначение.ФорматРедактирования = "ДП='01.01.2011 00:00:00'"; Рис. 4.30. Пустая дата в колонке таблицы
Если необходимо указывать для значений даты по умолчанию определенное представление, то это можно выполнить с помощью свойств Формат и ФорматРедактирования колонки таблицы (в приведенном примере – колонки ТЗЗначение), рис. 4.31.
Операции со значениями типа «Дата» Для значений (табл. 4.12).
типа
Дата
определены
арифметические
операции
Таблица 4.12. Арифметические операции Операция
Операнды
Результат
Сложение Вычитание
Дата + Число Дата - Дата
Вычитание
Дата - Число
Дата, увеличенная на количество секунд Число, соответствующее разнице между двумя датами, измеренной в секундах Дата, уменьшенная на количество секунд
Для значений типа Дата определены логические операции (табл. 4.13). Таблица 4.13. Логические операции Операция
Больше
Операнды
Дата > Дата
Больше или равно Дата >= Дата
Рис. 4.31. Установка формата для колонки таблицы
Для колонки таблицы форматная строка поддерживает параметр ДП, который задает представление пустой даты. В результате приведенная выше таблица будет выглядеть, например, следующим образом (рис. 4.32).
Равно
Дата = Дата
Не равно
Дата Дата
Меньше
Дата < Дата
Меньше или равно Дата Булево Булево >= Булево Булево = Булево Булево Булево Булево < Булево Булево Выборка.), имеют схожую функциональность, схожее поведение и одинаковые приемы работы с ними.
Преобразование значений типа «Тип»
1)"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Выборка.ФизЛицо + " " + Выборка.Подразделение + " " + Выборка.Должность; Сообщение.Сообщить(); КонецЦикла;
Том 1
В запросе выбирается информация по всем записям регистра, где упоминаются физические лица, соответствующие условию. Условие проверяет вхождения физических лиц в перечень, полученный вложенным запросом. Во вложенном запросе применяется группирование с применением агрегатной функции КОЛИЧЕСТВО() по полю ФизическоеЛицо, при этом условием будут отсечены те физлица, которые упоминались только один раз.
Получение данных из периодических регистров сведений Для периодических регистров сведений задачи получения информации для технологических вопросов решаются так же, как и было рассмотрено выше для непериодических регистров. Поэтому все примеры, рассмотренные в разделе «Получение данных из непериодических регистров сведений» (см. стр. 470), будут уместны и в этом случае. Единственное отличие в том, что к перечню ключевых полей добавляется поле Период, которое можно использовать в отборах. Так, метод Выбрать() для случая периодического регистра позволяет работать не только с отбором по значению измерения, но и с отбором по временному интервалу, в который могут попадать значения поля Период. Рассмотрим примеры получения информации из периодического (периодичность – В пределах дня) независимого регистра сведений ПерсонифицированныйПрайс (рис. 9.63).
Рис. 9.63. Структура регистра «ПерсонифицированныйПрайс»
Для получения выборки всех записей регистра в интервале дат между значениями, содержащимися в переменных НачалоИнтервала и КонецИнтервала, с отбором по номенклатурной позиции (содержится в переменной ВыбранныйТовар) можно использовать следующий фрагмент кода (листинг 9.28). Листинг 9.28. Пример получения записей периодического регистра сведений
// Подготовить структуру отбора по измерению "Номенклатура". СтруктураОтбора = Новый Структура("Номенклатура", ВыбранныйТовар); // Получить выборку записей. ВыборкаЗаписей = РегистрыСведений.ПерсонифицированныйПрайс.Выбрать(НачалоИнтервала, КонецИнтервала, СтруктураОтбора); Пока ВыборкаЗаписей.Следующий() Цикл
// Выполнить действие с очередной записью. // ...
КонецЦикла;
473
Глава 9. Хранение информации Необходимо помнить, что отбор при этом возможен только по одному полю и в качестве полей для отбора могут использоваться измерения или реквизиты регистра, для которых в конфигураторе установлен признак индексирования в значение Индексировать или установлен признак Ведущее.
Получение данных в этом случае можно проиллюстрировать следующей схемой (рис. 9.65).
Кроме того, для реализации необходимости включения/выключения записей «граничных периодов» нужно иметь в виду следующее: ■■ в параметр НачалоИнтервала передается начало интервала, в котором будут выбираться записи периодического регистра. Он может задаваться значениями типа Дата, МоментВремени, Граница. Если значение данного параметра не указано, то будут выбираться записи с самой ранней включительно; ■■ в параметр КонецИнтервала передается конец интервала, в котором будут выбираться записи периодического регистра. Он также может задаваться значениями типа Дата, МоментВремени, Граница. Если значение данного параметра не указано, то будут выбираться записи по самую последнюю включительно. В результате при передаче значений типа Дата или МоментВремени в выборку получим записи, включая значения НачалоИнтервала и КонецИнтервала (рис. 9.64).
Рис. 9.65. Получение записей, исключая граничные значения
Кроме того, если периодичность регистра меньше чем день (В пределах секунды или По позиции регистратора), то необходимо помнить, что дата в системе «1С:Предприятие» включает в себя и время. Даже если время не указано явно, оно принимает значение 00:00:00. То есть если в качестве параметра НачалоИнтервала передать значение «1 декабря 2009 года» (данное значение может быть получено так: '20091201'), а в качестве параметра КонецИнтервала передать «31 декабря 2009 года» ('20091231'), то в результате выборка будет построена с даты «01.12.2009 00:00:00» по дату «31.12.2009 00:00:00». То есть в результат, по сути, не войдут данные 31 декабря (рис. 9.66).
Рис. 9.64. Получение записей, включая граничные значения
Если же требуется получить записи, исключая граничные, то необходимо использовать объект Граница. Например, получение выборки в интервале дат, исключая границы, может быть выполнено следующим образом (листинг 9.29). Листинг 9.29. Пример получения записей регистра сведений
// Установить значения границ. ГраницаНачалаИнтервала = Новый Граница(НачалоИнтервала, ВидГраницы.Исключая); ГраницаКонцаИнтервала = Новый Граница(КонецИнтервала, ВидГраницы.Исключая); // Подготовить структуру отбора по измерению "Номенклатура". СтруктураОтбора = Новый Структура("Номенклатура", ВыбранныйТовар); // Получить выборку записей. ВыборкаЗаписей = РегистрыСведений.ПерсонифицированныйПрайс.Выбрать(ГраницаНачалаИнтервала, ГраницаКонцаИнтервала, СтруктураОтбора); Пока ВыборкаЗаписей.Следующий() Цикл
// Выполнить действие с очередной записью. // ...
КонецЦикла;
474
Рис. 9.66. Пример получения данных регистра сведений, когда интервал задан без явного указания времени
Для предотвращения возможных недоразумений по этому поводу удобно использовать функцию КонецДня(). Эта функция возвращает значение последней секунды дня, указанной в качестве параметра даты (листинг 9.30). Листинг 9.30. Пример использования функции «КонецДня()»
// Определить конец дня "правой" границы. КонецДняИнтервала = КонецДня(КонецИнтервала); // Получить выборку записей. ВыборкаЗаписей = РегистрыСведений.ЦеныНоменклатуры.Выбрать(НачалоИнтервала, КонецДняИнтервала); Пока ВыборкаЗаписей.Следующий() Цикл // Выполнить действие с очередной записью. // ... КонецЦикла;
Профессиональная разработка в системе «1С:Предприятие 8»
Хранение информации в регистрах сведений В результате будут получены записи с даты «01.12.2009 00:00:00» по дату «31.12.2009 23:59:59» включительно. При использовании запроса можно реализовывать не только перечисленные выше, но и гораздо более сложные условия, в том числе и по полю Период. Например, задача получения выборки данных всех записей регистра ПерсонифицированныйПрайс, которые датированы выходными днями (субботами и воскресениями), может быть решена посредством следующего запроса (листинг 9.31).
Часто встречаются задачи, в которых каждая запись периодического регистра сведений используется не как средство для хранения данных, а как средство для хранения информации истории изменения данных. Ведь в рассмотренном выше примере, если цена на товар для этого покупателя была установлена не на эту дату, а на какую-то другую, метод Получить() вернет структуру с пустыми значениями (рис. 9.67).
Листинг 9.31. Пример запроса
ВЫБРАТЬ ПерсонифицированныйПрайс.Период, ПерсонифицированныйПрайс.Покупатель, ПерсонифицированныйПрайс.Номенклатура, ПерсонифицированныйПрайс.Цена ИЗ РегистрСведений.ПерсонифицированныйПрайс КАК ПерсонифицированныйПрайс ГДЕ ДЕНЬНЕДЕЛИ(ПерсонифицированныйПрайс.Период) > 5
В запросе было применено условие с использованием функции работы с датами языка запросов – ДЕНЬНЕДЕЛИ(). Данная функция возвращает порядковые номера дней недели по переданному параметру. Рассмотрим примеры задач получения информации из периодического регистра сведений не в технологических целях, а для обслуживания задач учетных или аналитических механизмов. Если необходимо получить информацию значений ресурсов одной записи регистра, соответствующей указанным в параметрах значениям всех измерений и периода, объектная модель получения информации также позволяет использовать метод Получить().
Рис. 9.67. Пример использования метода «Получить()» для периодического регистра сведений
С прикладной точки зрения в ситуации, отображенной на схеме, при обращении к данным регистра пользователь, скорее всего, хотел получить актуальное для 12.10.2009 значение цены, а не установленное 12.10.2009. То есть в логике пользователя как само собой разумеющееся может лежать правило: «пока цена не сменилась, действует прежняя». И при обращении к данным регистра пользователь желает получить цену, установленную на некую дату, а если не установлена, то прежнюю, в общем случае – последнюю установленную.
Например, нужно сообщить, какую цену установили для покупателя Покупатель по номенклатурной позиции Товар, начиная с ДатаУстановки (листинг 9.32).
Для реализации подобной логики в функциональности периодического регистра сведений существует метод ПолучитьПоследнее(). Для тех же переменных получение последних актуальных данных может быть таким (листинг 9.33).
Листинг 9.32. Пример получения цен по номенклатурной позиции
Листинг 9.33. Пример использования метода «ПолучитьПоследнее()»
// Подготовить структуру отбора по измерениям. СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("Покупатель", Покупатель); СтруктураОтбора.Вставить("Номенклатура", Товар);
// Подготовить структуру отбора по измерениям. СтруктураОтбора = Новый Структура; СтруктураОтбора.Вставить("Покупатель", Покупатель); СтруктураОтбора.Вставить("Номенклатура", Товар);
// Получить структуру с данными ресурсов записи. СтруктураРесурсов = РегистрыСведений.ПерсонифицированныйПрайс.Получить(ДатаУстановки, СтруктураОтбора); // Сообщить цену. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(СтруктураРесурсов.Цена); Сообщение.Сообщить();
// Получить структуру с данными актуальных значений ресурсов. СтруктураРесурсов = РегистрыСведений.ПерсонифицированныйПрайс. ПолучитьПоследнее(ДатаУстановки, СтруктураОтбора); // Сообщить "последнюю" цену. Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Строка(СтруктураРесурсов.Цена); Сообщение.Сообщить();
Том 1
475
Глава 9. Хранение информации В результате получим желаемый результат (рис. 9.68).
В ходе выполнения метода СрезПоследних() платформа «1С:Предприятие» фактически выполняет запрос к базе данных. Данный запрос реализует следующий алгоритм: 1. Выбрать записи таблицы регистра, соответствующие условиям отбора по значениям измерений, у которых значение поля Период меньше или равно значению параметра КонецПериода. 2. По выбранным записям получить максимальные значения поля Период для каждой комбинации значений полей измерений. Это будут данные вложенного запроса. Получается, что в нем известны ключи последних актуальных записей, то есть наиболее близких к дате среза. 3. Соединить таблицу вложенного запроса с основной таблицей регистра по равенству значений полей измерений и поля Период.
Рис. 9.68. Пример использования метода «ПолучитьПоследнее()»
Может встретиться задача, когда пользователь заранее не знает, для каких комбинаций значений измерений ему требуется получить данные последних актуальных (на дату КонецПериода) значений ресурсов регистра. То есть хочет получить все значения для всех комбинаций измерений (или для некоторых, соответствующих условиям отбора), рис. 9.69.
Рис. 9.69. Задача получения последних значений по комбинации значений измерений
Для решения подобных задач можно использовать метод СрезПоследних(), возвращающий таблицу значений, заполненную данными записей, наиболее поздних, ближайших к дате среза (КонецПериода), табл. 9.17. Таблица 9.17. Результат получения среза последних Покупатель
Номенклатура Цена
ООО «Сигма» ООО «Сигма» Ялта-ЛТД
Пульт VX Пульт PW Пульт VX
476
120,00 218,00 135,00
4. Из полученной таблицы получить интересующие данные последних актуальных записей. Подобную функциональность можно реализовать запросом по основной таблице периодического регистра сведений (листинг 9.34). Листинг 9.34. Пример получения среза последних запросом
ВЫБРАТЬ ПерсонифицированныйПрайс.Покупатель, ПерсонифицированныйПрайс.Номенклатура, ПерсонифицированныйПрайс.Цена ИЗ (ВЫБРАТЬ ПерсонифицированныйПрайс.Покупатель КАК Покупатель, ПерсонифицированныйПрайс.Номенклатура КАК Номенклатура, МАКСИМУМ(ПерсонифицированныйПрайс.Период) КАК Период ИЗ РегистрСведений.ПерсонифицированныйПрайс КАК ПерсонифицированныйПрайс ГДЕ ПерсонифицированныйПрайс.Период 100
Рассмотрим другую задачу: требуется получить перечень документов с неактивными записями. Эта задача может быть решена посредством следующего запроса (листинг 9.41). Том 1
Зачастую у разработчиков при проектировании прикладных решений возникает вопрос: «Что лучше? Создать несколько регистров с большим количеством ресурсов или, наоборот, создать много регистров, но с меньшим количеством ресурсов?». В общем случае единого ответа на этот вопрос нет. Для того чтобы облегчить принятие решения в каждой конкретной ситуации, приведем несколько моментов, на которые следует обращать внимание при проектировании регистров сведений. Структурный подход. Каждая запись в регистре сведений содержит информацию о том, что для данной комбинации ключевых полей установлены некоторые значения ресурсов. В том числе и в периодическом регистре сведений. То есть если запись добавляется или модифицируется, это выполняется для всех значений ресурсов. Нельзя отметить, что, начиная с такого-то момента, значение такого-то ресурса не меняется, а меняются только значения других ресурсов.
479
Глава 9. Хранение информации Восприятие пользователем. При проектировании регистра важно проанализировать, как реально меняются значения данных, которые будут храниться в регистре, и выработать определенную модель отражения этих изменений в базе данных. Важно, чтобы отражение предметной области в регистре правильно воспринималось пользователем. Например, при хранении информации о курсах валют приходится иметь дело с информацией о курсе и кратности каждой валюты (24 рубля за 100 японских йен – курс 24, кратность 100). Курс Центробанка меняется ежедневно, кратность… ну, наверное, один раз в несколько десятков лет. То есть если исходить из «накладных затрат» на выполнение операций с этой информацией в регистре, то напрашивается решение о разделении ее на два регистра: КурсыВалют и КратностиВалют. Однако с точки зрения восприятия информации пользователем данные о курсе отдельно от данных о кратности – это нонсенс. Ну а поскольку работать с курсом и кратностью всегда придется одновременно, то проще реализовать задачу одним регистром с двумя ресурсами. Учет потенциальных модификаций состава регистра. Как обсуждалось выше, состав существующего регистра сведений всегда можно расширить. Одним из направлений расширения является ввод новых разрезов информации, то есть измерений. Например, принимая решение по добавлению ресурса ПредпочитаемыйЦвет, в котором будет содержаться информация о том, какого цвета товары предпочитает покупатель, для регистра ПерсонифицированныйПрайс (рис. 9.73) желательно заранее уточнить, а не потребуется ли впоследствии добавить к такому регистру измерение Договор для более детального учета обещанных покупателю отпускных цен.
Рис. 9.73. Структура регистра «ПерсонифицированныйПрайс»
Если потребуется, то лучше будет все же разделить информацию между несколькими регистрами. В одном будет храниться информация о каких-то качественных пожеланиях покупателей, в другом – информация о ценах с другим уровнем детализации. Время получения данных, необходимых для работы механизмов решения. Например, при работе некоторого механизма важно получать данные объекта и данные, связанные с данным объектом. Очевидно, что получение этих связанных данных из нескольких ресурсов одного регистра (одной таблицы) будет происходить в общем случае быстрее, нежели получение этих данных из нескольких регистров (нескольких таблиц).
480
Время записи информации в базу данных. Запись в несколько регистров сведений в общем случае будет выполняться медленнее, нежели запись одной записи с несколькими ресурсами. «Слабое звено». Если данные одного из ресурсов нужно модифицировать очень часто, то объем базы будет расти существеннее, если в составе регистра много ресурсов. Особенно если какой-нибудь из ресурсов будет являться хранилищем значений, в котором будет храниться картинка или бинарные данные. Такие данные вообще целесообразнее выделять в отдельный регистр.
Хранение дополнительных характеристик Один из часто встречающихся вопросов хранения информации – это вопрос организации хранения значений характеристик, набор которых заранее неизвестен. Таким образом, при разработке прикладного решения нет возможности создать заранее набор реквизитов объекта. Кроме этого, велика вероятность, что конкретные характеристики будут использоваться не для всех объектов, а только для некоторого ограниченного их количества. Например, для некоторых элементов справочника Номенклатура может потребоваться хранить информацию об их цвете, мощности, габаритах (для бытовой техники); для других же – о размере, росте, материале и опять же о цвете (одежда); для третьих подобная информация вообще не имеет смысла (услуги). При этом не исключена вероятность, что автоматизируемая компания станет попутно торговать еще мобильными телефонами, что потребует наличия ряда специфичных характеристик номенклатуры, таких как поддерживаемые стандарты обмена информацией, наличие цифровой камеры, тип батареи и т. д. Классическая реляционная модель предполагает, что для хранения какойлибо информации в базе данных в таблице заводится колонка (поле) с определенным типом и именем. То есть введение реквизитов является естественным способом решения подобной задачи. Однако в рассматриваемом случае подобное решение является неэффективным и зачастую неприемлемым с точки зрения требований, предъявляемых заказчиком. Неэффективность решения «в лоб» заключается в том, что подавляющее большинство характеристик используются лишь для небольшого, ограниченного количества элементов справочника Номенклатура. Это означает, что, вводя для каждой характеристики отдельный реквизит, мы тем самым необоснованно увеличиваем объем хранимой информации. В самом деле, создав реквизит Размер (тип Число), мы добавили в физическую таблицу справочника Номенклатура новую колонку. Но эта колонка будет хранить «содержательные» данные только для элементов справочника из группы Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик Одежда (которых, например, 100–150 штук). Если при этом общее количество элементов в справочнике Номенклатура будет равняться 10–15
тысячам, значит, практически для всех элементов справочника в этой колонке будет содержаться значение 0, т. к. данная характеристика для них не имеет смысла.
С практической точки зрения создание реквизитов для хранения значений характеристик в большинстве случаев может быть неприемлемо потому, что добавление нового реквизита возможно только в режиме работы Конфигуратор. В реальной ситуации, как правило, необходимо создавать новые характеристики непосредственно в процессе работы, в режиме 1С:Предприятие. Таким образом, путь ввода новых реквизитов может оказаться слишком «затратным» во всех смыслах. В данном разделе мы рассмотрим возможные варианты решения задач динамического дополнения состава информации, характеризующей объекты.
Хранение дополнительных характеристик определенного типа Рассмотрение задачи хранения дополнительных характеристик начнем с простого примера, когда все дополнительные характеристики, вводимые пользователем, имеют один и тот же тип значения. Допустим, необходимо организовать хранение дополнительной информации о контрагентах: ■■ ■■ ■■ ■■
кто из них относится к нерезидентам (зарубежные контрагенты); с кем из них можно торговать в кредит; кто относится к категории постоянных покупателей; и так далее.
Рис. 9.74. Структура регистра «КатегорииКонтрагентов»
Тип значения измерения Контрагент – СправочникСсылка.Контрагенты. Тип значения измерения Категория – СправочникСсылка.Категории. Использование справочника Категории как объекта для хранения классификатора категорий позволяет предоставить пользователям возможности динамической модификации этой информации. То есть ввод новой характеристики (категории) не требует помощи разработчика. Далее обратите внимание: в составе регистра нет ресурсов. Хотя, как описано в разделе «Хранение информации в регистрах сведений» на стр. 455, именно посредством ресурсов организуется хранение информации в регистрах сведений. Дело в том, что комбинации значений измерений обеспечивают уникальность каждой записи регистра, а наличие самой записи, по сути, и является информацией. Ведь по каждой комбинации Контрагент – Категория необходимо обеспечить хранение информации булевого типа. Если Истина, значит, контрагент относится к этой категории. Это в нашем случае реализовано просто наличием записи. Ну а значение Ложь в нашем случае будет реализовано отсутствием записи. Итак, общую схему хранения дополнительных характеристик контрагентов можно представить следующим образом (рис. 9.75).
Другими словами, необходимо обеспечить возможность ввода и хранения следующих характеристик контрагентов: ■■ Резидент (тип Булево – Истина, Ложь); ■■ ПостоянныйПокупатель (тип Булево – Истина, Ложь); ■■ (тип Булево – Истина, Ложь). Как было рассмотрено выше, вариант с булевыми реквизитами Резидент, ПостоянныйПокупатель и т. п. слишком «затратен» и неудобен. Один из вариантов решения этой задачи приведен в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске. Это использование справочника Категории для хранения видов характеристик и регистра сведений КатегорииКонтрагентов для хранения соответствия конкретной характеристики конкретному контрагенту (рис. 9.74). Том 1
Рис. 9.75. Общая схема хранения дополнительных характеристик
Дальнейшее использование этой информации в учетных или аналитических механизмах прикладного решения можно будет реализовывать посредством, например, соединений с информацией регистра.
481
Глава 9. Хранение информации Так, в составе демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, есть отчет ПродажиКонтрагентовИмеющихКатегорию, в котором пользователь может применять отборы по категориям контрагентов (рис. 9.76).
Краткий комментарий: условие отбора контрагентов по категориям реализуется во вложенном запросе по регистру сведений за счет использования языка запросов системой компоновки данных (инструкции, заключенные в {…}). Благодаря этому, вопрос организации отбора по категории берет на себя система компоновки данных. То есть пользователь сможет при необходимости обойтись вообще без отбора (тогда в отчет попадут все контрагенты из регистра сведений КатегорииКонтрагентов), организовать отбор по одной категории, по списку категорий, по всем категориям, кроме выбранных, и так далее. Реализация этой функциональности не требует усилий разработчика. Далее таблица неповторяющихся контрагентов, полученных во вложенном запросе, соединяется с таблицей оборотов регистра Продажи. Затем средствами системы компоновки данных в соответствии с настройками и структурой отчета, заданными разработчиком в схеме компоновки данных, отчет компонуется и выводится пользователю. В форме отчета пользователь может изменить отчетный период, настроить отбор, сортировку и условное оформление отчета по своему желанию и переформировать отчет. Здесь мы рассмотрели вариант отображения и отбора контрагентов с установленными категориями в отчете. От разработчика требовалось по крайней мере сформировать текст запроса.
Рис. 9.76. Отчет продажи контрагентов, имеющих категорию
Но ряд функциональных вопросов в таком решении платформа может взять на себя полностью. Так, если установить для измерений регистра КатегорииКонтрагентов свойство Ведущее, то пользователь при необходимости сможет быстро получать форму списка регистра с отбором по соответствующим значениям из форм справочников (рис. 9.77).
Сам отчет формируется при помощи системы компоновки данных. В схеме компоновки данных отчета создан набор данных – запрос, которому передается следующий текст запроса (листинг 9.42). Листинг 9.42. Пример запроса, используемого при формировании отчета
ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КоличествоОборот КАК КоличествоОборот, ПродажиОбороты.СуммаОборот КАК СуммаОборот ИЗ (ВЫБРАТЬ РАЗЛИЧНЫЕ КатегорииКонтрагентов.Контрагент КАК Контрагент ИЗ РегистрСведений.КатегорииКонтрагентов КАК КатегорииКонтрагентов {ГДЕ КатегорииКонтрагентов.Категория.*}) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты ПО ВложенныйЗапрос.Контрагент = ПродажиОбороты.Контрагент
482
Рис. 9.77. Использование команды перехода к списку регистра «Категории контрагентов» в панели навигации формы элемента справочника «Контрагенты»
Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик Кроме того, при удалении объектов, с которыми связаны записи регистра, система будет автоматически удалять такие записи. Подробнее
Раздел «Дополнительная функциональность при создании и удалении записей регистра сведений», стр. 469.
Хранение дополнительных характеристик произвольного типа
иерархию, может включать в состав своих объектов реквизиты и табличные части, возможно использование предопределенных видов характеристик, заданных разработчиком. Однако самой важной особенностью объектов планов видов характеристик, отличающей их от других объектов, является использование свойства Тип значения. Это свойство позволяет определить список возможных типов данных, используемых для отдельных видов характеристик (то есть для каждого элемента плана видов характеристик), рис. 9.78.
Рассмотрим теперь более сложную и более распространенную задачу, когда все дополнительные характеристики, вводимые пользователем, имеют произвольный тип значения. Допустим, необходимо организовать хранение дополнительных характеристик номенклатурных позиций. При этом для ряда товаров необходимо организовать хранение информации о весе, для некоторых товаров – о цвете, для некоторых – об области применения и так далее. Пример решения данной задачи с использованием регистра сведений имеет право на жизнь. Однако, в отличие от рассмотренной в предыдущем разделе («Хранение дополнительных характеристик определенного типа») ситуации, здесь будем иметь дело с информацией уже не булевого, а произвольного, заранее неизвестного типа. То есть в регистре потребуется использование поля ресурса ЗначениеХарактеристики. При попытке реализации данного регистра в конфигурации встанет один существенный вопрос: какой тип значения должен быть у ресурса ЗначениеХарактеристики? Действительно, характеристики будут иметь не только разный смысл, но и различные типы значений. Получается, что для ввода произвольных данных в поле ресурса тип значения последнего должен быть составным и включать в себя все возможные типы значений. Но для каждой характеристики тип значения должен быть персональным. Чтобы не получилось, что пользователь может ввести цвет «01.01.2010 г.», а потом пытаться понять, как с этим работать.
Использование плана видов характеристик для хранения видов характеристик Для решения задачи хранения информации о соответствии видов характеристик и типов их значений в составе конфигурации следует использовать объект План видов характеристик. План видов характеристик по своему устройству очень похож на справочник. Он поддерживает работу пользователей с видами характеристик («элементами») и списками видов характеристик, может поддерживать Том 1
Рис. 9.78. Тип значения вида характеристики
То есть для вида характеристики Цвет можно определить тип значения СправочникСсылка.Цвета, для вида характеристики Год выпуска – тип значения Дата, для Уровня шума – Число и так далее. Кроме этого, возможно использование составных типов значений, в состав которых могут входить как примитивные типы (Дата, Число, Строка, Булево), так и ссылочные типы данных (ДокументСсылка., СправочникСсылка. и так далее, включая ПланВидовХарактеристикСсылка.). Подробнее
Пример создания и использования плана видов характеристик ВидыХарактеристик приведен в составе демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске.
Для того чтобы при описании типов значений для новых видов характеристик (элементов этого плана видов характеристик) пользователь мог выбирать значения только из определенного разработчиком списка, при конфигурировании используется свойство Тип значения характеристик (рис. 9.79).
483
Глава 9. Хранение информации ■■ свойство Дополнительные значения характеристик объекта конфигурации плана вида характеристик заполняется указанием справочника ЗначенияХарактеристик (рис. 9.81).
Рис. 9.80. Справочник «Значения характеристик» Рис. 9.79. Свойство «Тип значения характеристик»
Обратите внимание: на рисунке видно, что в состав типов значений характеристик плана ВидыХарактеристик включено использование справочника ЗначенияХарактеристик. Введение подобного справочника в состав решения помогает обеспечить самостоятельный ввод новых возможных значений новых характеристик самим пользователем в тех ситуациях, когда в составе конфигурации нет объектов для отображения новой сущности. Например, в процессе эксплуатации программы возникла необходимость создания новых видов характеристик Область применения, Вариант оплетки, Формат бумаги и так далее. Вместо того чтобы под каждую сущность создавать свой справочник или перечисление, все значения таких дополнительных характеристик можно хранить в справочнике ЗначенияХарактеристик (рис. 9.80). Однако для того чтобы при выборе значений характеристик из этого справочника информация разных видов характеристик не перемешивалась, нужно подчинить элементы справочника элементам плана вида характеристик. Это реализуется следующим образом: ■■ устанавливается владелец справочника ЗначенияХарактеристик – план видов характеристик ВидыХарактеристик;
484
Рис. 9.81. Свойство «Дополнительные значения характеристик»
Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик Этого достаточно, например, для того, чтобы платформа взяла на себя вопросы реализации основной функциональности, касающейся заполнения, хранения и отображения связей между видом характеристики и возможными ее значениями (рис. 9.82).
Рис. 9.82. Использование команды перехода к списку значений характеристик в панели навигации формы плана видов характеристик
Таким образом, создав план видов характеристик, разработчик определяет возможности хранения в базе данных перечня видов характеристик и определяет область допустимых значений этих характеристик.
Описание дополнительных характеристик объектов конфигурации Естественно, характеристики объектов создаются не просто так, а для получения данных в разрезе этих характеристик. Но сначала нужно описать, где и как хранятся характеристики объектов конфигурации. Платформа предоставляет возможность сделать это прямо в дереве объектов конфигурации. Удобство такого решения очевидно: описав один раз связь между объектом конфигурации и его характеристиками, разработчику больше не придется в каждом отчете, использующем характеристики объекта, указывать, где и каким образом хранятся его характеристики. В результате все отчеты и динамические списки, в которых участвует объект конфигурации, будут «подхватывать» его характеристики. Описание характеристик объектов конфигурации содержится в свойстве Характеристики. Диалог для описания характеристик можно вызвать, нажав кнопку Характеристики на закладке Данные в окне редактирования объекта конфигурации, например, Справочник Номенклатура (рис. 9.83). Свойство Характеристики можно задать для таких объектов конфигурации, как Справочник, Том 1
Документ, Перечисление, План видов характеристик, План счетов, План видов расчета, План обмена, Задача, Бизнес-процесс. Команда Характери-
стики также доступна в контекстном меню дерева объектов конфигурации
и в палитре свойств этих объектов.
Рис. 9.83. Вызов диалога описания характеристик справочника «Номенклатура»
В диалоге описания дополнительных характеристик объекта конфигурации нужно указать, где хранятся виды характеристик и значения этих характеристик. В реальной практике часто требуется хранить дополнительные характеристики не одного, а сразу нескольких объектов конфигурации – например, справочников номенклатуры, контрагентов, различных документов и т. д. И хранить их можно по-разному. Это зависит от специфики конкретной задачи, предпочтений разработчика, пожеланий заказчика и т. п. Ниже мы рассмотрим по мере усложнения следующие варианты хранения дополнительных характеристик объектов конфигурации и их значений. 1. В качестве источника характеристик указывается план видов характеристик, а значения характеристик находятся в регистре сведений. При этом один план видов характеристик хранит виды характеристик только для одного объекта конфигурации. 2. План видов характеристик хранит виды характеристик для разных объектов конфигурации, а значения характеристик находятся так же, как и в предыдущем варианте, в регистре сведений. 3. Значения характеристик хранятся не в регистре сведений, а в справочнике, например, или в табличной части справочника. 4. В качестве источника характеристик указывается не план видов характеристик, а табличная часть справочника, которая хранит ссылки на виды характеристик.
485
Глава 9. Хранение информации
Варианты описания дополнительных характеристик Первый вариант Рассмотрим самый простой случай, когда в качестве источника характеристик указывается план видов характеристик, а значения характеристик находятся в регистре сведений. При этом один план видов характеристик хранит виды характеристик только для одного объекта конфигурации. Допустим, необходимо организовать хранение значений дополнительных характеристик номенклатурных позиций в регистре сведений. В составе демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, для этого используется регистр сведений ДополнительныеХарактеристики (рис. 9.84).
Дело в том, что в реальном решении такая связь может быть очень сложной. И хранение соответствия номенклатурных позиций и видов их характеристик может выполняться в других объектах конфигурации (например, в отдельном регистре сведений, хранящем связи «многие ко многим» между номенклатурными группами и видами характеристик, между отдельными номенклатурными позициями и группами видов характеристик и т. д.). А данные связи могут влиять на связи между видами характеристик и возможными их значениями. Поэтому реализация всех этих связей выполняется разработчиком конфигурации в рамках специфики поставленной задачи. Допустим, необходимо реализовать достаточно простой вариант, когда для любой номенклатурной позиции можно использовать любой вид характеристики, и нужно лишь обеспечить удобство редактирования записей регистра в отношениях между видом характеристики и возможными значениями. В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, пример реализации этой задачи сделан с использованием свойств Связь по типу и Связи параметров выбора ресурса ЗначениеХарактеристики регистра сведений ДополнительныеХарактеристики.
Рис. 9.84. Структура регистра сведений «ДополнительныеХарактеристики»
Измерение Объект имеет тип значения СправочникСсылка.Номенклатура, свойство – Ведущее. Тип значения измерения ВидХарактеристики – ПланВидовХарактеристикСсылка.ВидыХарактеристик, свойство – Ведущее. Тип значения ресурса ЗначениеХарактеристики – Характеристика.ВидыХарактеристик. В результате регистром сведений будет поддерживаться уникальность записей по набору значений измерений Объект – ВидХарактеристики, а для значений ресурса ЗначениеХарактеристики тип значения будет определяться теми значениями, которые указаны в составе соответствующего плана видов характеристик. Однако необходимо понимать, что мы описали все необходимое для хранения характеристик, но не для организации заполнения. С точки зрения системы измерения Объект и ВидХарактеристики никак не связаны между собой. А при вводе значений в поле ресурса по умолчанию никак не учитывается выбранный в поле измерения вид характеристики – система будет предлагать заполнять поле любым из типов, описанных в плане видов характеристик. В описании структуры регистра никак не задается информация о логической связи полей, в которых хранятся виды характеристик и значения характеристик. Более того, зачастую это сделать было бы просто невозможно.
486
Для ограничения типов значений характеристики типами конкретного выбранного вида характеристики у ресурса ЗначениеХарактеристики в качестве значения свойства Связь по типу выбрано измерение регистра ВидХарактеристики, а свойство Связи параметров выбора ресурса ЗначениеХарактеристики установлено как Отбор.Владелец(ВидХарактеристики). Для этого при нажатии кнопки выбора из списка возможных реквизитов регистра измерение ВидХарактеристики перенесено в список параметров выбора (рис. 9.85). В результате значения, вводимые в поле Значение характеристики, будут соответствовать типу вида характеристики, выбранной в поле Вид характеристики. Кроме того, при выборе значений характеристики, содержащихся в справочнике Значения характеристик, для выбора будут предлагаться только те значения, которые относятся к выбранному виду характеристики (рис. 9.86). Подробнее
Остальная функциональность вопросов ввода, модификации, удаления данных посредством менеджера записи регистра реализуется системой и описана в разделе «Создание, изменение, удаление записей регистра сведений», стр. 462.
Таким образом, схему организации хранения дополнительных характеристик номенклатуры в рассмотренном решении в общем виде можно представить так (рис. 9.87). Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик В этом случае описание характеристик номенклатуры примет следующий вид (рис. 9.88).
Рис. 9.88. Описание дополнительных характеристик справочника «Номенклатура»
Рис. 9.85. Свойства «Связь по типу» и «Связи параметров выбора» ресурса «ЗначениеХарактеристики»
После описания характеристик в свойствах объектов конфигурации в настройках отчетов и динамических списков объектов конфигурации можно использовать их характеристики. Например, в отчете, отражающем остатки номенклатуры на складах, можно настроить отбор по характеристикам номенклатуры (рис. 9.89).
Рис. 9.86. Соответствие вида характеристики и ее значений
Рис. 9.89. Настройка отбора в отчете с использованием характеристик номенклатуры
В результате отчет примет следующий вид (рис. 9.90).
Рис. 9.87. Общая схема хранения дополнительных характеристик одного объекта конфигурации
Том 1
487
Глава 9. Хранение информации
Рис. 9.90. Отчет «Остатки на складах» с отбором по характеристике номенклатуры «Цвет»
Второй вариант
Рис. 9.92. Реквизит «ВидОбъектов» плана видов характеристик
Усложним задачу. Пусть план видов характеристик хранит виды характеристик для разных объектов конфигурации, например для справочников номенклатуры, контрагентов и организаций. При этом значения характеристик находятся так же, как и в предыдущем варианте, в регистре сведений.
В регистре сведений ДополнительныеХарактеристики, хранящем значения характеристик, указывается, что тип измерения Объект будет составным и будет включать ссылки на справочники номенклатуры, контрагентов и организаций – СправочникСсылка.Номенклатура, СправочникСсылка. Контрагенты, СправочникСсылка.Организации (рис. 9.93).
В этом варианте в план видов характеристик необходимо ввести реквизит, позволяющий отделять характеристики одного объекта конфигурации от другого, а при описании характеристик каждого объекта указывать данный реквизит и его значение в полях Поле отбора видов и Значение отбора видов, чтобы отбирались характеристики именно этого объекта. Для реализации данного решения в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компактдиске, создано перечисление ВидыОбъектов (рис. 9.91).
Рис. 9.91. Перечисление «ВидыОбъектов»
В план видов характеристик ВидыХарактеристик добавлен реквизит ВидОбъектов типа ПеречислениеСсылка.ВидыОбъектов (рис. 9.92).
488
Рис. 9.93. Тип измерения «Объект» регистра сведений «ДополнительныеХарактеристики»
Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик Схему организации хранения дополнительных характеристик различных объектов конфигурации в рассмотренном решении в общем виде можно представить так (рис. 9.94).
Рис. 9.96. Заполнение реквизита «ВидОбъектов» плана видов характеристик Рис. 9.94. Общая схема хранения дополнительных характеристик различных объектов конфигурации
После
В этом случае описание характеристик одного из справочников, например, справочника контрагентов, примет следующий вид (рис. 9.95).
доступны дополнительные характеристики, относящиеся к справочнику контрагентов (ВидОбъектов – Справочник "Контрагенты"), в данном случае – Категория (рис. 9.97).
этого
при
настройке
списка
контрагентов
по
команде
Все действия Настроить список в списке доступных полей будут
Рис. 9.95. Описание дополнительных характеристик справочника «Контрагенты»
То есть при описании характеристик для справочника Контрагенты в Поле отбора видов указывается реквизит ВидОбъектов плана видов характеристик ВидыХарактеристик, а в поле Значение отбора видов указывается значение перечисления ВидыОбъектов – СправочникКонтрагенты. Для справочников Номенклатура и Организации значение поля Поле отбора видов будет таким же, а в поле Значение отбора видов нужно указать соответствующее значение перечисления ВидыОбъектов – СправочникНоменклатура или СправочникОрганизации. Теперь в режиме 1С:Предприятие останется только заполнить реквизит ВидОбъектов плана видов характеристик соответствующими значениями (рис. 9.96). Том 1
Рис. 9.97. Настройка динамического списка с использованием характеристик контрагентов
Например, при условии, что в регистре ДополнительныеХарактеристики присутствуют записи о контрагентах с выбранной категорией, список контрагентов примет следующий вид (рис. 9.98).
489
Глава 9. Хранение информации
Третий вариант Теперь рассмотрим случай, когда значения характеристик хранятся не в регистре сведений, а в табличной части справочника. Виды характеристик будут храниться по-прежнему в плане видов характеристик. В процессе работы прикладного решения для одного объекта (например, элемента справочника) может потребоваться указывать сразу несколько значений одной и той же характеристики. Так, для некоторых номенклатурных позиций может понадобиться указать сразу несколько значений характеристики Область применения: Связь, Медицина, Обучение и т. д. Это значит, что элемент справочника относится сразу к нескольким областям применения. Рис. 9.98. Список контрагентов с отбором по характеристике «Категория»
В рассмотренном примере Категория – это дополнительная характеристика справочника контрагентов, имеющая тип СправочникСсылка.Категории. Для того чтобы при вводе значений в регистр ДополнительныеХарактеристики пользователь мог выбирать из справочника Категории, нужно указать этот справочник в составе свойства Тип значения характеристик плана видов характеристик ВидыХарактеристик (рис. 9.99).
В этом случае уже не получится хранить значения характеристик, как раньше, в регистре сведений, потому что регистр сведений не позволит сделать запись с неуникальными значениями измерений (один и тот же объект и одна и та же характеристика). И значит, их можно хранить, например, прямо в табличной части этого самого элемента справочника. Как в этом случае для справочника будут описываться характеристики, мы сейчас и рассмотрим. В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, к справочнику Номенклатура добавлена табличная часть ДополнительнаяИнформация, включающая в себя реквизиты ДополнительноеСвойство (тип значения ПланВидовХарактеристикСсылка.ВидыХарактеристик) и ЗначениеСвойства (тип значения Характеристика.ВидыХарактеристик), рис. 9.100.
Рис. 9.100. Структура справочника «Номенклатура»
Рис. 9.99. Тип значения характеристик
В заключение отметим, что если для справочника Организации реализовать первый вариант описания характеристик (без указания полей Поле отбора видов и Значение отбора видов), то даже при условии заполнения реквизита ВидОбъектов в плане видов характеристик при настройке списков и отчетов, в которых участвует данный справочник, все дополнительные характеристики будут представлены «общей кучей», без разбивки на виды объектов конфигурации.
490
В результате в самом объекте справочника можно указывать сразу несколько значений для одной и той же характеристики (рис. 9.101). Для обеспечения того, чтобы данные в табличной части вводились корректно, выполнены доработки, аналогичные рассмотренным в разделе «Первый вариант» на стр. 486. То есть задействованы свойства Связь по типу и Связи параметров выбора для реквизита ЗначениеСвойства табличной части ДополнительнаяИнформация. В целом схему организации хранения произвольных дополнительных характеристик номенклатуры в самом объекте можно представить так (рис. 9.102). Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик что это «служебное» поле, мы можем его использовать (и используем) при описании того, где хранятся значения характеристик. Т. к. для каждой табличной части справочника существует отдельная таблица в базе данных, то записи этой табличной части всех элементов справочника хранятся в этой таблице. И именно по значению поля Ссылка можно определить, к какому же именно элементу справочника относятся эти записи. Поэтому при описании места хранения значений характеристик в качестве поля объекта мы указываем поле Ссылка, чтобы система отбирала из таблицы только те записи, которые относятся именно к этому элементу. Таким образом, табличная часть ДополнительнаяИнформация будет хранить значения характеристик номенклатуры так же, как и регистр сведений. Виды характеристик будут храниться по-прежнему в плане видов характеристик ВидыХарактеристик (рис. 9.104). Рис. 9.101. Форма элемента справочника «Номенклатура»
Рис. 9.104. Хранение дополнительных характеристик в табличной части справочника «Номенклатура» Рис. 9.102. Схема хранения значений дополнительных характеристик
В этом случае описание характеристик номенклатуры примет следующий вид (рис. 9.103).
В результате в отчете по остаткам номенклатуры на складах можно вывести значения дополнительных полей – характеристик, введенные в табличной части элементов номенклатуры (рис. 9.105).
Рис. 9.103. Описание дополнительных характеристик справочника «Номенклатура»
В отличие от предыдущих вариантов, где все поля мы создавали самостоятельно, тут в табличной части справочника используется поле Ссылка, которое мы не создавали. Это поле создает сама платформа, когда мы указываем, что у справочника будет табличная часть. Несмотря на то, Том 1
Рис. 9.105. Отчет «Остатки на складах» с дополнительными полями-характеристиками номенклатуры «Цвет», «Вес»
491
Глава 9. Хранение информации
Четвертый вариант В заключение рассмотрим случай, когда в качестве источника характеристик указывается не план видов характеристик, а табличная часть справочника, которая хранит ссылки на виды характеристик. А значения характеристик содержатся в регистре сведений. На практике одна и та же характеристика может использоваться одновременно для нескольких объектов конфигурации (например, как для справочника Номенклатура, так и для справочника Контрагенты). А такого рассмотренные выше способы описания характеристик не позволяют сделать. При использовании одного плана видов характеристик для всех объектов конфигурации (вариант 2) в его специальном реквизите мы указывали единственный объект конфигурации, к которому применяется эта характеристика. Значит, если есть необходимость применять эту характеристику и к другому объекту конфигурации, придется дублировать вид характеристики и в ней указывать другой объект конфигурации. Если для каждого объекта конфигурации использовать собственный план видов характеристик, то тоже придется дублировать вид характеристики, но уже в другом плане видов характеристик. Чтобы избежать такого дублирования, характеристики объединены в наборы характеристик, свойственные каждому объекту конфигурации. Эти наборы хранятся в отдельном справочнике, табличная часть которого и содержит описание характеристик каждого набора.
Рис. 9.107. Предопределенные элементы справочника «НаборыДополнительныхХарактеристик»
Схему организации хранения дополнительных характеристик различных объектов конфигурации в рассмотренном решении в общем виде можно представить так (рис. 9.108).
Для реализации данного решения в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, создан справочник НаборыДополнительныхХарактеристик с табличной частью ДополнительныеСведения, включающей в себя реквизит Свойство (тип значения ПланВидовХарактеристикСсылка.ВидыХарактеристик), рис. 9.106.
Рис. 9.108. Схема хранения значений дополнительных характеристик
Рис. 9.106. Структура справочника «НаборыДополнительныхХарактеристик»
Справочник НаборыДополнительныхХарактеристик содержит предопределенные элементы, ссылки на которые позволяют создавать наборы характеристик, в которых одна и та же характеристика может применяться к различным объектам конфигурации (рис. 9.107).
492
В этом случае описание характеристик одного из справочников, например, справочника номенклатуры, примет следующий вид (рис. 9.109). При описании табличной части справочника НаборыДополнительныхХарактеристик в качестве источника характеристик в Поле ключа указывается поле Свойство табличной части, в Поле отбора видов – поле Ссылка справочника, в поле Значение отбора видов – значение ссылки на предопределенный элемент справочника НаборыДополнительныхХарактеристик. Профессиональная разработка в системе «1С:Предприятие 8»
Хранение дополнительных характеристик
Рис. 9.109. Описание дополнительных характеристик справочника «Номенклатура»
На приведенном выше рисунке важна только вторая запись. Именно о ней мы и говорим. А первая запись осталась от предыдущего примера. Но в принципе этот рисунок показывает и то, что характеристики объекта конфигурации могут находиться в разных местах, по-разному храниться, и все это можно описать в диалоге описания характеристик объекта конфигурации, в одном месте, с помощью нескольких записей. Таким образом, для каждого предопределенного элемента справочника НаборыДополнительныхХарактеристик в режиме 1С:Предприятие можно ввести свойственные ему наборы характеристик (рис. 9.110). Как видно из рисунка, сами характеристики содержатся в плане видов характеристик, а табличная часть элементов справочника хранит только ссылки на него. После этого при настройке динамических списков и отчетов, в которых участвует данный объект конфигурации, будут доступны его характеристики, указанные в табличной части справочника НаборыДополнительныхХарактеристик.
Том 1
Рис. 9.110. Набор дополнительных характеристик справочника «Номенклатура»
493
Глава 9. Хранение информации
494
Профессиональная разработка в системе «1С:Предприятие 8»
Место документов в концепции системы «1С:Предприятие»
Глава 10. Документы и последовательности Место документов в концепции системы «1С:Предприятие» При создании бизнес-приложений для решения задач учета, планирования, принятия решений, управления и т. д., как правило, используются определенные информационные модели. И, как правило, одно из центральных мест любой подобной модели занимает понятие события. Например, один из наиболее активно используемых вариантов исторически сложившейся информационной модели учетных решений можно представить в виде следующей схемы (рис. 10.1).
ного перебора записей событий и подсчета их влияния на показатели. Поэтому отражение результата влияния зарегистрированных событий на показатели обычно производится заранее. То есть не в момент, когда потребуется отчет, а в момент, когда событие только регистрируется. Для запоминания же состояния учитываемых таким образом показателей используются специальные регистры учета. Например, для классического бухгалтерского учета посредством двойной записи итоги хозяйственной деятельности в виде сальдо «оседают» на бухгалтерских счетах. Рассмотрим, что предлагает платформа «1C:Предприятие» для реализации информационных моделей бизнес-приложений. Платформа «1С:Предприятие» позволяет строить прикладные решения, оперируя совокупностями объектов: ■■ соответствующими прикладным сущностям, ■■ выбираемыми из набора жестко определенных в платформе классов объектов. Общую схему возможных вариантов взаимодействия прикладных объектов системы для решения той или иной задачи можно представить следующим образом (рис. 10.2).
Рис. 10.1. Информационная модель учетного решения
Основа учета – регистрация событий, происходящих с учитываемыми показателями. Она может выполняться посредством внесения записей в журналы, записью проводок и т. д. В общем, посредством документирования. Причем документирование должно производиться не в «вольной» форме, а согласуясь с заранее разработанными и стандартизованными обозначениями, зачастую сведенными в виде неких классификаторов. Конечно же, документирование нужно не как самоцель, а как обоснование информации, предоставляемой о состоянии учитываемых показателей. Так называемой отчетной информации. При выдаче же отчетной информации большое значение придается наглядности, удобству и быстроте ее получения. Для того чтобы обеспечить максимальную быстроту получения отчетной информации, идеально было бы получать ее сразу, минуя этап длительТом 1
Рис. 10.2. Варианты взаимодействия прикладных объектов
Можно отметить, что данная схема позволяет полностью реализовать функциональность предыдущей и при этом может обеспечить существенное расширение и дополнение ее.
495
Глава 10. Документы и последовательности Фактически она позволяет строить модели на более высоком уровне абстрагирования. Например, справочники, планы видов характеристик, перечисления, константы, планы счетов и планы видов расчетов могут использоваться не только для обеспечения заполнения документов, но и для заполнения некоторых видов регистров напрямую. А вообще – для хранения информации, не привязанной ко времени. Документы предназначены для ввода первичной информации, связанной с регистрацией событий, воздействующих на учитываемые в системе показатели. Если посмотреть на прикладные решения, то подавляющее большинство документов используют привязку ко времени – поле Дата, которое есть у всех документов. То есть можно говорить, что документы – это объекты для регистрации информации, для которой важна привязка ко времени. Для облегчения обеспечения действий, связанных с вводом, отображением, логикой учета документов, при необходимости используются такие объекты, как нумераторы, журналы документов, последовательности. Отчеты и обработки могут обеспечивать не только вывод информации в удобном для пользователя виде, но и ввод. То есть могут использоваться для обеспечения интерфейса выполнения воздействий на объекты, отвечающие за хранение информации. Однако сами для хранения информации не используются. Регистры же можно воспринимать как объекты, предназначенные для хранения «вторичной» информации о состоянии показателей со сложными привязками к моментам времени и периодам. Обычно эта информация получается в процессе переработки исходной информации, вводимой документами. Например, факт болезни нужно регистрировать посредством документа Больничный. Информация документа при его проведении будет отражена в регистре расчета зарплаты с тем, чтобы впоследствии, после проведения расчетных операций (включающих, например, вытеснение оклада за период болезни), из регистра можно было взять информацию о начисленном по болезни пособии и о начисленной заработной плате вообще. Однако опять же можно смотреть на использование регистров шире. Есть возможность использования регистров сведений (периодических или непериодических) с независимым режимом записи. То есть если это оправдано с точки зрения решения прикладной задачи, для таких регистров данные могут вводиться непосредственно, минуя этап работы с документом. Итак, подведем краткий итог: документирование событий – основа практически любой модели бизнес-приложений. Без документирования информация, получаемая из системы, была бы необоснованной, а значит, возможно, недостоверной. Таким образом, основное назначение документов – регистрация информации о происходящих событиях с привязкой ко времени.
496
Документы
Функциональность документов Для выполнения задач своего предназначения документы имеют соответствующий состав и обеспечивают возможность следующих основных действий: ■■ ■■ ■■ ■■ ■■ ■■ ■■
заполнение, запись, проведение, формирование движений по регистрам, расположение на оси времени, пометка на удаление, удаление.
Такой набор функциональности заложен в систему и обеспечивает быструю разработку и удобство использования документов. Разберем эти возможные действия подробнее.
Заполнение документов Заполнение документа может производиться разными способами в зависимости от прикладной задачи и необходимого уровня сервиса для пользователя. Самый простой вариант заполнения – ручной ввод документа (рис. 10.3). Данный вариант обеспечивается чаще всего посредством формы, имеющей в качестве основного реквизита объект документа. Тогда ряд элементов формы обеспечивает отображение и ввод значений в реквизиты формы, а ряд – инициацию процесса записи документа, когда данные реквизитов формы записываются в сами объекты. Формы, основным реквизитом которых назначен объект документа, и элементы этих форм обладают расширениями, позволяющими реализовывать специфичное поведение системы для облегчения работы разработчика с документами. Копирование. Вариант, когда новый документ создается копированием существующего, причем его данные заполняются данными существующего документа (рис. 10.4). Может инициироваться интерактивными действиями пользователя или программно – методом Скопировать(). Оба действия приводят к одному событию ПриКопировании и могут быть перехвачены обработчиком события, располагаемым в модуле документа. В самом обработчике может быть реализовано заполнение нового документа в зависимости от требуемого алгоритма (не обязательно только данными исходного документа). Профессиональная разработка в системе «1С:Предприятие 8»
Документы
Рис. 10.5. Создание документа вводом на основании
Рис. 10.3. Ручной ввод документа
Также в механизме заполнения участвуют свойства реквизитов объектов конфигурации Значение заполнения и Заполнять из данных заполнения. Если свойство реквизита Заполнять из данных заполнения установлено в значение Истина, то процедура стандартной обработки заполнения будет заполнять реквизит из данных заполнения (например, платформа автоматически будет заполнять реквизиты документов, по которым установлен отбор в форме списка). Если в данных заполнения нет данных для заполнения этого реквизита или свойство имеет значение Ложь, то реквизит будет заполнен из свойства Значение заполнения, если оно установлено. Программное заполнение документов. Может выполняться за счет операций присвоения значений реквизитам документа (рис. 10.6). В данном случае выбор элементов формы и событий, при обработке которых будут производиться эти действия, предоставлен разработчику конфигурации. Создание нового документа при этом может производиться посредством метода СоздатьДокумент() на сервере или ОткрытьФорму() на клиенте.
Рис. 10.4. Создание документа копированием
Заполнение. Вариант создания нового документа, который инициируется в следующих случаях: ■■ командой Создать в панели действий приложения или в форме списка документов (см. рис. 10.3); ■■ командой ввода на основании СоздатьНаОсновании (рис. 10.5); ■■ при программном вызове методов глобального контекста ОткрытьФорму() и ПолучитьФорму(); ■■ при программном вызове метода Заполнить(). Поскольку можно заполнять документ на основании данных любого объекта, то говорить об однозначном соответствии данных источника и документа-получателя не приходится. Поэтому само заполнение данных документа осуществляется в рамках обработчика события ОбработкаЗаполнения. Процедура обработчика располагается в модуле документа и содержит в качестве параметра объект-источник. Том 1
К данному способу прибегают обычно в случаях, когда создание нового документа должно производиться не вручную, не копированиемзаполнением, а в результате выполнения каких-либо программных алгоритмов.
Рис. 10.6. Программное заполнение документа
497
Глава 10. Документы и последовательности
Расположение на оси времени Поскольку документ является регистратором события, одной из важных задач документа является фиксация времени, когда событие имело место. Поэтому все документы имеют поле Дата. И, более того, система не позволяет записать документы с неустановленной датой (равной значению даты по умолчанию). Согласно значениям этого поля все записанные документы могут быть расположены на единой временной оси в хронологическом порядке (рис. 10.7).
Кроме того, в случаях, когда требуется обеспечить ввод и проведение документов реальным временем, можно воспользоваться возможностями механизма оперативного проведения документов и оперативной отметки времени. Это позволяет распределять документы на временной оси автоматически с соблюдением как минимум секундного интервала. подробнее
Раздел «Проведение документов», стр. 498.
Запись документов Запись объекта документа – физический процесс, заключающийся в сохранении значений реквизитов документов в базе данных. Может инициироваться интерактивными действиями пользователя или программно – методом Записать().
Рис. 10.7. Расположение документов на оси времени
Причем даже если ряд документов имеет одинаковое значение поля Дата, система «1С:Предприятие» имеет средства для обеспечения однозначного хронологического порядка – объект МоментВремени, содержащий дату и ссылку на документ (рис. 10.8).
Запись документа имеет несколько возможных режимов (просто – запись, проведение, отмена проведения). О происходящих при этих режимах записи процессах будет рассказано ниже. Общий же смысл использования этих режимов – обеспечение логических процессов бизнес-решения с использованием определенных «сценариев», заложенных в систему (удаление существующих движений, формирование новых, установка значения поля Проведен и прочее). Разработчик вправе принимать решения о необходимости применения того или иного сценария или механизма (рис. 10.9).
Рис. 10.8. Использование момента времени
Объект МоментВремени используется системой автоматически при решении задачи отображения списков документов в хронологическом порядке. Также его используют, когда требуется получить данные из регистров именно на момент времени документа. Однако необходимо заметить, что за счет использования момента времени можно только получить хронологию расположения документов, изменить же ее в пределах одной секунды невозможно. Хронологический порядок документов определяется системой при обращении к данным – по датам, а для одинаковых дат – по ссылкам документов. И для документов с одинаковым временем не зависит ни от порядка создания документов, ни от номера документа, ни от чего-то подобного. Если необходимо изменить хронологию документов, нужно менять значения поля Дата документов, «разводя» их в разные секунды.
498
Рис. 10.9. Запись документа
Проведение документов Обсуждая это действие, необходимо разделять два понятия: ■■ «Проведен» – состояние документа; ■■ «Проведение» – как процесс. Проведенность как состояние может быть установлена различными способами. Может классически – в результате выполнения процесса проведения, а может просто присвоением значения Истина свойству документа Проведен. Профессиональная разработка в системе «1С:Предприятие 8»
Документы С прикладной точки зрения документ считается проведенным, если обработка данного документа полностью завершена и принято решение, что данный документ должен участвовать в учете. То есть событие, регистрируемое документом, полностью описано и учтено в информационной модели. Для отражения этого состояния документа используется системное поле Проведен. Процесс проведения документа в системе является частным случаем записи документа. Если состояние проведения было достигнуто в процессе проведения документа, то, значит, были обработаны все события, связанные с записью документа в режиме проведения. А именно в обработчиках этих событий обычно и содержатся указания, что, где и как должно измениться в объектах информационной базы для реализации бизнес-логики, заложенной в решение (рис. 10.10).
Рис. 10.11. Отмена проведения документа
Рис. 10.12. Использование свойства «Проведен»
Формирование движений по регистрам Рис. 10.10. Проведение документа
Кроме того, зачастую используется процесс, обратный проведению, – отмена проведения. Выполнение этого процесса приводит к записи документа с отменой проведения. При этом выполняются обработчики, связанные с ним (рис. 10.11). Если же свойство Проведен просто установлено или снято для документа и документ был записан, то в результате для такого документа был выполнен процесс обычной записи документа. То есть часть событий не произошла для такого документа, а значит, не были обработаны соответствующим образом обработчики этих событий (рис. 10.12). Однако для каких-нибудь регламентных или вспомогательных обработок может оказаться важной такая возможность: получить проведенные документы без процесса проведения или непроведенные документы без процесса отмены проведения.
Том 1
По своему назначению регистры служат для запоминания и переработки информации, внесенной в систему, как правило, документами. Поэтому для записей любых регистров (за исключением регистров сведений с установленным режимом записи Независимый) обязательно наличие заполненного поля Регистратор. В этом поле должна находиться ссылка на документ, которому подчинен этот набор записей. Такие наборы записей называют движениями (рис. 10.13). Поведение системы во многом определяется наличием связи документов и подчиненных им движений. Например, движения отдельно от своих регистраторов существовать не могут. Поэтому при удалении документов или отмене проведения (если свойство Удаление движений установлено в значение, отличное от Не удалять) система производит поиск движений этого документа в таблицах всех регистров, для которых данный документ может быть регистратором, и удаляет их. Именно поэтому, например, не рекомендуется «про запас» указывать регистры, для которых документ может быть регистратором. Нужно указывать только те, которые действительно требуются для обеспечения бизнес-логики, заложенной в решение.
499
Глава 10. Документы и последовательности Для отслеживания различных стадий обработки этого документа используется регистр сведений ОперативноеУправлениеЗаказами (рис. 10.14).
Рис. 10.14. Регистр сведений «ОперативноеУправлениеЗаказами»
Заполнение регистра производится при реализации промежуточных операций обработки документа (рис. 10.15).
Рис. 10.13. Движения документа
Сами же движения могут: ■■ создаваться при проведении документов; ■■ создаваться при записи документов; ■■ формироваться в виде набора записей регистра (обязательно с отбором по регистратору); ■■ формироваться интерактивно (например, документом РучнаяОперация). То есть и непроведенные документы могут иметь движения по регистрам. Это обеспечивает возможность достаточно гибкого отражения ситуаций, возникающих в автоматизируемых задачах, и может быть использовано, когда обработка документа пользователем еще не завершена, но документ уже должен изменить некие учетные данные. Например, так может выглядеть задача последовательной обработки документа ЗаказПокупателя различными подразделениями компании.
500
Рис. 10.15. Промежуточные операции обработки документа
Сначала документ выписывается менеджером и записывается. При этом в регистре сведений ОперативноеУправлениеЗаказами формируется запись, указывающая, что данный заказ находится в стадии КФинансовомуКонтролю. Далее ответственный сотрудник финансового отдела проверяет возможность удовлетворения данного заказа с точки зрения допустимости долга покупателя и соблюдения ценовых порогов. В случае положительного решения выставляется флажок Отпуск разрешен. При записи документа с этим установленным флажком модифицируется запись в регистре Профессиональная разработка в системе «1С:Предприятие 8»
Документы сведений ОперативноеУправлениеЗаказами. Теперь для данного документа актуально состояние КРазмещению. Далее обработку документа выполняет менеджер отдела запасов. Он работает со всеми заказами, имеющими статус КРазмещению. Если принимается решение об отгрузке из наличных свободных остатков, устанавливается флажок Отгрузка из свободных остатков, и заказ записывается. При записи такого заказа его статус меняется на значение КРезервированию. Если же будет принято решение о выборе варианта Размещение в заказе поставщику, выполняется проведение документа с формированием движений по регистру ЗаказыПоставщикам.
Пометка на удаление документа Так же как и при работе с проведением, необходимо различать: ■■ состояние документа «ПометкаУдаления»; ■■ процесс «ПометкаУдаления». Документ считается помеченным на удаление в том случае, если в системное поле документа ПометкаУдаления записано значение Истина. Поведение документа, помеченного на удаление, имеет свои особенности. Например, такой документ не может быть проведен (рис. 10.16).
Заказы покупателей, перечисленные в регистре сведений ОперативноеУправлениеЗаказами и имеющие статус КРезервированию, проверяются и окончательно проводятся уже товароведом на складе. В таких случаях формируются движения по регистру Резервы (табл. 10.1). Таблица 10.1. Промежуточные операции обработки документа № Пользователь Стадия обработки
Движения по регистрам
Комментарий
Рис. 10.16. Проведение документа, помеченного на удаление
1
Менеджер
Заполнение
Регистр сведений
Формирование записи по заказу: статус К финансовому контролю
2
Финансовый отдел
Регистр сведений
Модификация записи по заказу: статус
3
Отдел запасов
Контроль кредитной линии Решение об отгрузке из свободных остатков или заказе поставщику
Регистр сведений
Модификация записи по заказу: статус К резервированию, если принято решение об отгрузке из свободных остатков Проведение документа с формированием движений по регистру Заказы поставщикам (движения по регистру Оперативное управление заказами автоматически удаляются) Проведение документа с формированием движений по регистру Резервы (движения по регистру Оперативное управление заказами автоматически удаляются)
Сам же процесс «ПометкаУдаления» обычно инициируется интерактивно или методом объекта документа УстановитьПометкуУдаления(ИСТИНА) и приводит к тому, что документ записывается с соответствующим значением поля ПометкаУдаления. При этом если документ был проведен, инициируется еще отмена проведения документа и удаление движений данного документа (рис. 10.17).
4
Склад
Оперативное управление заказами Оперативное управление заказами Оперативное управление заказами
Регистр остатков
Заказы поставщикам
Отметка Регистр остатков о постановке Резервы в очередь на отгрузку
К размещению
Обратите внимание: хотя движения по регистрам для обрабатываемого заказа формируются на каждой стадии обработки, «финальное проведение» выполняется только на последней стадии. Причем разработчик может выполнять его в рамках обработчика события ОбработкаПроведения, а может и самостоятельно, очищая старые движения, формируя новые и устанавливая свойство Проведен данного документа. Рис. 10.17. Установка пометки на удаление
Том 1
501
Глава 10. Документы и последовательности Обратите внимание: отмена проведения и удаление движений производятся при установке пометки удаления, только если документ был проведен. Если документ не был проведен, но имел движения, то при установке пометки удаления удаление движений не будет произведено. Если же для помеченного на удаление документа интерактивно снимается пометка удаления или применяется метод УстановитьПометкуУдаления(ЛОЖЬ), то инициируется запись документа с изменением значения на Ложь в поле ПометкаУдаления (рис. 10.18).
действия можно выполнить в обработчиках событий, связанных с записью документа. Например, если для документа ПоступлениеТоваров требуется «перехватить» изменение значения свойства ПометкаУдаления для уже записанного документа, можно поступить следующим образом (листинг 10.1). Листинг 10.1. Обработчик события «ПередЗаписью»
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Рис. 10.18. Снятие пометки удаления
Кроме того, значение свойства ПометкаУдаления объекта документа можно устанавливать программно и просто записывать документ. В таких случаях инициация события ОбработкаУдаленияПроведения не происходит. И если при этом документ был изначально не проведен, он записывается помеченным на удаление. Если же подобные действия выполняются для проведенного документа, то система выдает предупреждение о невозможности записи документа и проведенного, и помеченного на удаление (рис. 10.19).
// Ограничить действия: только для записанных документов. Если Не ЭтоНовый() Тогда
// Получить пометку удаления текущего документа из базы данных. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПоступлениеТоваров.ПометкаУдаления |ИЗ | Документ.ПоступлениеТоваров КАК ПоступлениеТоваров |ГДЕ | ПоступлениеТоваров.Ссылка = &ТекущийДокумент";
Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Выборка.Следующий();
// Сравнить текущее значение пометки удаления // и взятое из базы данных. Если ПометкаУдаления Выборка.ПометкаУдаления Тогда Если ПометкаУдаления Тогда
// Выполнить действия при установке пометки удаления. // ...
Иначе
// Выполнить действия при снятии пометки удаления. // ...
КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры Рис. 10.19. Использование свойства «ПометкаУдаления»
А вот возможность помеченного на удаление документа иметь движения может быть полезной, если по какой-то причине необходимо отражать в учете данные документа, готовящегося к удалению. Например, пока не будет проведен документ, его заменяющий. Сами события «Установка пометки на удаление» и «Снятие пометки удаления» с точки зрения документа выделенными процессами не являются. Поскольку в любом случае идет речь о записи помеченного на удаление документа (или со снятой пометкой), то все необходимые
502
Удаление документов Удаление документов может производиться в составе механизма контроля ссылочной целостности. А может иметь место и непосредственное удаление объектов. Использование механизма контроля ссылочной целостности при удалении объектов или неиспользование определяется разработчиком и администратором конфигурации. Если документ имеет движения по регистрам, то при непосредственном удалении документа система автоматически удалит их. Профессиональная разработка в системе «1С:Предприятие 8»
Документы Событие ПередУдалением может обрабатываться в модуле объекта документа. Например, если требуется позволить непосредственное удаление только тех документов, которые не имеют движений, достаточно сделать следующее (листинг 10.2). Листинг 10.2. Обработчик события «ПередУдалением»
Процедура ПередУдалением(Отказ) Для Каждого НаборЗаписейРегистра из Движения Цикл
// Прочитать движения по каждому регистру. НаборЗаписейРегистра.Прочитать();
// Проверить наличие записей в движениях по конкретному регистру. Если НаборЗаписейРегистра.Количество()>0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Документ" + Метаданные().Представление() + " № " + Номер + " от " + Дата + " имеет движения!"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли;
КонецЦикла;
КонецПроцедуры
Состав документов Что в себя включают документы? Рассмотрим этот вопрос, учитывая области абстрагирования, использующиеся для работы с объектами в системе. Потому что в каждой области абстрагирования документ описывается по-разному. Можно говорить о составе документа как прикладного объекта, используемого для организации прикладного решения. Можно как об объекте конфигурации, позволяющем организовать работу в отношении реализации прикладной задачи в рамках конфигурации. Можно о составе таблиц, полей, индексов, посредством которых организовано непосредственное хранение данных документов (рис. 10.20).
Рис. 10.20. Понятие «Документ»
Том 1
Поскольку основной задачей документов как объектов прикладной области является регистрация событий, структура документов определяется именно этой задачей. Тогда что за информацию можно отражать в системе при регистрации события? Прежде всего, сам факт того, что событие произошло и когда оно произошло. Поэтому, как правило, для каждого события необходимо регистрировать порядковый номер этого события и дату происхождения. Соответственно, в состав любого документа включаются поля Номер и Дата. Это минимально возможный состав регистратора события. Действительно, могут иметь место ситуации, когда больше никакой информации относительно данных документа и не требуется. Например, для документов, отражающих регламентные операции («завершение периода», «снятие итогов» и т. п.). Для ситуаций, когда при регистрации события необходимо запоминать информацию, имеющую единичные значения для одного события, должны использоваться реквизиты документов. Например, Поставщик при регистрации факта поставки товаров. Для ситуации, когда при регистрации события необходимо запоминать информацию, имеющую множественные значения, необходимо использовать табличные части документов. Например, табличная часть Товары при регистрации факта поставки множества товаров. Как объект конфигурации для обеспечения решения задач прикладной области документ обладает свойствами (автонумерация, проведение и т. д.) и имеет в своем составе подчиненные объекты: ■■ Реквизиты документов – объекты, используемые для запоминания информации об объекте (документе), имеющей единичные значения для каждого экземпляра документа; ■■ Табличные части документов – объекты, используемые для запоминания дополнительной информации об объекте, представляемой в виде таблиц; ■■ Формы – объекты, используемые для обеспечения интерактивного ввода, просмотра и редактирования информации; ■■ Команды – объекты, используемые для разработки командного интерфейса документа. В модулях команд находятся обработчики для их выполнения; ■■ Макеты – объекты (например, табличные документы), обычно используемые при формировании печатных форм объекта. Для обеспечения возможности манипулирования данными при написании алгоритмов обработки информации документов используются соответствующие объекты встроенного языка. На самом нижнем уровне абстрагирования используются объекты информационной базы, обеспечивающие выполнение задач вышестоящих уровней.
503
Глава 10. Документы и последовательности
Структура таблиц базы данных На уровне объектов базы данных информация о документах хранится в следующих таблицах:
Допустим, в конфигурации для регистрации контактов – деловых встреч, звонков, писем – используется документ Событие (рис. 10.21).
■■ основная таблица документа, для каждого объекта конфигурации Документ; ■■ таблица табличной части документа, для каждой табличной части каждого объекта конфигурации Документ. Структура полей этих таблиц следующая. Основная таблица документа: ■■ Ссылка – уникальный идентификатор, позволяющий однозначно определить данную запись; ■■ ВерсияДанных – версия записи (изменяется после каждого обновления данной записи); ■■ ПометкаУдаления – Булево; ■■ Проведен – Булево; ■■ Дата – дата/время регистрируемого документа; ■■ Номер – номер регистрируемого документа (поле существует, если документ как объект конфигурации имеет длину номера, отличную от нуля); ■■ ПрефиксНомера – начало периода уникальности номера. Поле определено, если в конфигурации для документа задана поддержка уникальности номера в пределах периода; ■■ Реквизит1 – тип значения поля определяется типом значения реквизита; ■■ … ■■ РеквизитN – … Таблица табличной части документа: ■■ Ссылка – ссылка на документ, которому подчинена данная запись. Содержит то же значение, что и поле Ссылка основной таблицы документов; ■■ Ключ – ключ записи табличной части в рамках одного объекта базы данных; ■■ НомерСтроки – предопределенный реквизит табличной части, тип значения Число; ■■ Реквизит1 – тип значения поля определяется типом значения реквизита; ■■ … ■■ РеквизитN – …
504
Рис. 10.21. Документ «Событие»
В базе было записано 4 документа. 01.03.2010 был оформлен документ с номером Т-001, в котором зафиксировано проведение переговоров с контрагентом КомбиТранс и сторонней организацией Баязет. Далее 02.03.2010 был зафиксирован телефонный звонок Баязет документом Т-0002. Затем задним числом был введен документ Т-003, в котором зафиксирован выезд к заказчику Коринф. Последним документом с номером Т-004 был зафиксирован случайный звонок в офис. Данные этого документа в информационной базе будут храниться в таблице документа и таблице табличной части документа. Таблица документа будет иметь следующий вид (табл. 10.2). Таблица 10.2. Таблица документа «Событие» (левая часть) Ссылка
Пометка Удаления
Проведен
Дата
Номер
Док1 Док2 Док3 Док4
Ложь
Истина
Ложь
Истина
Ложь
Истина
Истина
Ложь
01.03.2010 10:00:00 02.03.2010 11:00:00 01.03.2010 13:00:30 02.03.2010 15:00:00
Т-001 Т-002 Т-003 Т-004
Таблица 10.2. Таблица документа «Событие» (правая часть) Вид События
Контрагент
Описание События
Ответственный
Переговоры Телефонный звонок Выезд к заказчику Телефонный звонок
КомбиТранс Баязет Коринф
Переговоры Выяснение реквизитов Переговоры Ошиблись номером
Иванов Петров Иванов Иванов
Обратите внимание: записи в самой таблице упорядочены согласно хронологии ввода информации. Таблица табличной части документа будет содержать записи только для тех документов, у которых она была заполнена (табл. 10.3). Профессиональная разработка в системе «1С:Предприятие 8»
Документы Таблица 10.3. Таблица табличной части документа «Событие» Ссылка НомерСтроки Контрагент
Лицо
Док1 Док1
Семенов Горбунков
1 2
Баязет Баязет
Если к реквизитам документа добавить еще реквизит, система при изменении конфигурации базы данных добавит к таблице документа еще одну колонку. Причем для «старых» записей значения этого поля будут заполнены соответствующими типу значения реквизита значениями по умолчанию. Аналогичные действия в отношении таблицы табличной части документа будут произведены, если к реквизитам табличной части документа добавить еще один реквизит.
Поле
Тип
Назначение
Представление
Строка
МоментВремени
МоментВремени
Произвольный, определяется типом реквизита
РезультатЗапроса
Виртуальное поле, не хранится в базе данных. Строковое представление, содержащее имя документа, его номер и дату. Не может использоваться для операций сравнения в тексте запроса Виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ссылку на документ) Каждое из полей содержит значения реквизитов документа. Имена полей совпадают с названиями реквизитов, заданными для объекта конфигурации Каждое из полей содержит табличные части документа. Имена полей совпадают с названиями табличных частей, заданными для объекта конфигурации. Сами значения полей содержат результаты запросов по табличным частям документа. Результат запроса к табличной части состоит из колонок с именами, соответствующими именам реквизитов табличной части документа и колонки НомерСтроки
Чтобы обеспечить должное быстродействие при обращении к данным информационной базы, для таблиц хранения информации документов создаются следующие индексы: ■■ Ссылка; ■■ Дата + Ссылка; ■■ Номер + Ссылка – если для данного документа длина номера не равна нулю; ■■ Реквизит + Ссылка – если для данного реквизита свойство Индексировать установлено в значение Индексировать; ■■ Реквизит + Дата + Ссылка – если для данного реквизита свойство Индексировать установлено в значение Индексировать с доп. упорядочиванием; ■■ Реквизит – если документ включен в критерий отбора через данный реквизит; ■■ ПрефиксНомера + Номер + Ссылка – если для данного документа длина номера не равна нулю. Табличная модель обращения к данным (посредством запросов) дает возможность получения информации из этих таблиц в виде таблицы документа (табл. 10.4). Таблица 10.4. Состав таблицы документа Поле
Тип
Ссылка
ДокументСсылка. Содержит ссылку на документ
ВерсияДанных
Строка
ПометкаУдаления
Булево
Номер
Число, Строка
Дата
Дата
Проведен
Булево
Том 1
Назначение
Содержит версию данных документа Содержит признак пометки на удаление Содержит номер документа Содержит дату документа Содержит признак проведенности документа
Отдельные вопросы типового использования документов Нумерация документов Для решения бизнес-задач зачастую серьезным вопросом является нумерация документов. Например, существует даже такое понятие, как «документы строгой учетности», предъявляющие определенные требования к порядку ведения нумерации документов. Для обеспечения этого и других вопросов в системе созданы следующие возможности: На уровне свойствами:
объекта
конфигурации
Документ
можно
управлять
■■ Длина номера – определяет разрядность поля, отводимого под номер документа; ■■ Контроль уникальности – определяет необходимость контроля неповторяемости номеров средствами системы перед записью объекта; ■■ Автонумерация – определяет необходимость формирования новых номеров средствами системы при попытке создания новых объектов; ■■ Периодичность (Непериодический, В пределах года, В пределах квартала, В пределах месяца, В пределах дня) – определяет границы периодов контроля уникальности и повторяемости номеров автонумерации;
505
Глава 10. Документы и последовательности ■■ Тип номера (Строка, Число) – определяет тип поля Номер; ■■ Нумератор – используется для возможности организации сквозной нумерации документов разных видов.
Автоматическая нумерация Автоматическая нумерация позволяет создавать новые документы с заведомо уникальными номерами в пределах указанной периодичности. Для включения этой возможности достаточно установить флажок Автонумерация. Тогда система будет присваивать каждому новому документу номер, на единицу больше самого большого номера среди документов данного вида в пространстве префикса документа, в том периоде, к которому относится дата документа. Причем независимо от того, создается этот новый документ интерактивно или программным способом. Механизм автонумерации позволяет работать в двух режимах: в режиме с возвратом неиспользованных номеров и в режиме без возврата неиспользованных номеров. Режим устанавливается свойством объекта метаданных Конфигурация РежимАвтонумерацииОбъектов. Режим автонумерации прикладных объектов конфигурации определяет, использовать или нет автоматически полученные номера объектов, если они не записаны в базу данных. Для документов, требующих непрерывной нумерации, которая будет реализована при записи, свойство РежимАвтонумерацииОбъектов необходимо установить в значение НеОсвобождатьАвтоматически (этот режим устанавливается стандартно), а значение ОсвобождатьАвтоматически можно использовать для обеспечения механизма нумерации, использующегося в предыдущих версиях платформы «1С:Предприятие». За выдачу номеров отвечает специальный менеджер автонумерации. Его использование позволяет существенно повысить параллельность работы за счет отсутствия блокировок базы данных.
Далее определяется самый большой номер с данным префиксом. Именно он впоследствии будет инкрементироваться для определения следующего номера. Приведем пример работы данного алгоритма. Допустим, в таблице документов содержатся записи со следующими номерами (табл. 10.5). Таблица 10.5. Номера документов Номер
АТ0001 МП_0009 АТР-3 Ф002
Наибольший по алфавиту префикс – Ф. Поскольку самый старший номер с таким префиксом Ф002, то автонумерацией будет создан следующий номер: Ф003. При первом получении номера по определенному пространству номеров и префиксу выполняется неблокирующее чтение максимального номера из базы данных, т. е. механизм автонумерации использует базу данных для получения максимального номера по определенному пространству номеров и префиксу только один раз. При последующих попытках получить очередной номер механизм автонумерации использует максимальный номер по данному пространству номеров и префиксу, как было описано ранее. Ниже на схемах показаны возможные варианты использования автонумерации. Если у свойства Периодичность документа установлено значение Непериодический, то в результате автонумерации будем видеть такую картину (рис. 10.22).
Механизм автонумерации выдает номера в разрезе пространств номеров и префиксов. Пространство номера в зависимости от типа объекта может содержать метаданные, владельца, период и др. В пределах пространства номеров номер выдается в разрезе префиксов. Префикс документа определяется системой путем приведения строковых номеров к числу. Причем к числовому формату цифры номеров приводятся от последней к первой, пока процесс не дойдет до символа, который невозможно распознать как число. После этого символы левой части номера считаются префиксами.
Рис. 10.22. Непериодическая автонумерация
Если у свойства Периодичность документа установлено значение В пределах года, то в результате автонумерации будем видеть такую картину (рис. 10.23).
По каждому префиксу хранится максимальный выданный номер, на основании которого выдается следующий номер. Один и тот же максимальный номер может соответствовать нескольким префиксам. Для получения максимального номера по пустому префиксу система определяет наибольший префикс по порядку алфавитного возрастания.
506
Рис. 10.23. Автонумерация в пределах года
Профессиональная разработка в системе «1С:Предприятие 8»
Документы Однако нельзя забывать о том, что при автонумерации следующий номер, выдаваемый системой, всегда на единицу больше самого старшего. Например, если в последнем примере (с периодичностью год) изменить дату «прошлогоднего документа», то можно получить такую картину: дата документа с номером 00118 была изменена на 01.01.2010. В результате последующие номера, формируемые автонумерацией, начинаются от 00119 (рис. 10.24).
Листинг 10.3. Установка нового номера в пределах префикса автонумерации
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс) Префикс = Организация.Префикс; КонецПроцедуры
Событие ПриУстановкеНовогоНомера вызывается при записи документа, только если для данного документа назначена автонумерация и только в транзакции записи, между событиями ПередЗаписью и ПриЗаписи объекта Документ (рис. 10.26).
Рис. 10.24. Работа автонумерации при изменении даты документа
Использование лидирующих нулей Если автонумерация применяется для номеров строкового типа, то в этом случае используются лидирующие нули в составе номера. Все пробелы перед самим номером замещаются нулями. Например, 00031. Это необходимо для обеспечения корректности поиска и сортировки по номеру. Иначе документ с номером 31 располагался бы раньше документа с номером 7 (рис. 10.25). Рис. 10.26. Установка нового номера документа в транзакции записи документа
Рис. 10.25. Использование лидирующих нулей
Параллельное ведение нумераций документов одного вида Например, выписываемые от разных юридических лиц накладные должны иметь нумерации, сквозные в пределах каждого отдельного юридического лица. Для решения этой проблемы устанавливается строковый тип номеров документа и автонумерация. Далее необходимо программно назначать префиксы автонумерации в обработчиках соответствующих событий. В результате система формирует новый номер по вышеописанным правилам, но только еще в пределах назначенного префикса автонумерации. Для назначения префикса автонумерации можно использовать обработчик события ПриУстановкеНовогоНомера или метод объекта документа УстановитьНовыйНомер(). Например, если необходимо установить новый номер в пределах префикса автонумерации, значение которого хранится в реквизите Префикс организации, указанной в реквизите документа Организация, можно поступить следующим образом (листинг 10.3). Том 1
Если в процедуре-обработчике этого события параметру Префикс назначить значение, то именно это значение и будет использовано в качестве префикса автонумерации для установки нового номера. Если же, кроме того, номер документа необходимо менять в ответ на изменение значения реквизита Организация, то в соответствующем обработчике события можно применить метод объекта документа УстановитьНовыйНомер(). Он устанавливает новый номер документа в пределах периода, в соответствии с установленной датой документа для заданного префикса автонумерации (листинг 10.4). Листинг 10.4. Обработчик события «ПриИзменении» элемента формы документа «Организация»
&НаКлиенте Процедура ОрганизацияПриИзменении(Элемент) // Установить новый номер согласно префиксу организации. УстановитьНовыйНомерНаСервере(); КонецПроцедуры
507
Глава 10. Документы и последовательности Из обработчика события, возникающего при изменении элемента формы Организация, вызывается метод объекта документа УстановитьНовыйНомерНаСервере() (листинг 10.5). Листинг 10.5. Использование метода документа «УстановитьНовыйНомерНаСервере()»
&НаСервере Процедура УстановитьНовыйНомерНаСервере() Документ = РеквизитФормыВЗначение("Объект"); Документ.УстановитьНовыйНомер(Объект.Организация.Префикс); ЗначениеВРеквизитФормы(Документ, "Объект"); КонецПроцедуры подробнее
Эти примеры приведены в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, для документа ПриходныйКассовыйОрдер.
В результате подобных действий можно добиться того, что вне зависимости от порядка оформления документов по разным организациям нумерация будет сквозной именно по каждой из организаций. Вернее по префиксу каждой организации (рис. 10.27).
Рис. 10.28. Использование нумераторов
Для
решения
Нумератор.
такой
задачи
используется
объект
конфигурации
В нем описываются: ■■ ■■ ■■ ■■
Длина номера, Контроль уникальности, Периодичность, Тип номера.
Далее у всех документов – объектов конфигурации, для которых нужна сквозная нумерация, указывается этот нумератор и устанавливается свойство Автонумерация. В результате формирование нового номера производится при обращении уже не к одной таблице документов информационной базы, а к таблицам документов, которым назначен данный нумератор.
Запись документов Запись документа может производиться как из формы документа, так и не из формы документа. Рис. 10.27. Автонумерация с использованием префиксов
Хотелось бы упредить от попыток использования префиксов, которые целиком входят в состав других префиксов, например, АИ и А. В этом случае, как разбирали выше, при попытке формирования нового номера с префиксом А получим следующий номер от префиксации АИ. Дело в том, что механизм автонумерации считает префикс А зависимым от префикса АИ и изменяет максимальный номер зависимых префиксов в соответствии с номером того префикса, в состав которого они входят.
Организация сквозной нумерации при помощи нумераторов Кроме разделения нумерации может возникнуть обратная задача – обеспечение общей сквозной нумерации. Обычно это требуется, когда имеется несколько видов документов для отражения похожих хозяйственных операций, но необходимо организовать для них сквозную нумерацию, невзирая на вид документа (рис. 10.28).
508
В первом случае запись документа инициируется расширением формы документа (для функционирования этого расширения необходимо, чтобы основным реквизитом формы был объект документа). Работа расширения формы обеспечивает специфичное, удобное для пользователя поведение формы при редактировании и записи документа. Во втором случае форма документа не используется, а обращение идет непосредственно к объекту документа. При реализации записи документа из формы, кроме самой записи, выполняются еще стандартные действия, определяемые расширением формы: установка даты документа, установка режима проведения, запрет определенных действий пользователя и т. д. подробнее
Раздел «Особенности работы формы документа», стр. 520.
При записи документа не из формы выполняется только запись документа (рис. 10.29). Профессиональная разработка в системе «1С:Предприятие 8»
Документы Причем если модифицированы были значения реквизитов документа, а не табличной части документа, то данное действие вообще не выполняется; ■■ Запись данных в таблицы журналов, если данные документа используются в этих журналах; ■■ Запись данных в таблицы регистрации изменений планов обменов, если данный документ входит в состав обмениваемых данных. Причем сама запись документа может вызываться интерактивно или программно. Рис. 10.29. Запись документа
При выполнении самой записи документа производятся следующие действия: ■■ Контроль уникальности номера документа. Выполняется, если у документа как объекта конфигурации установлено свойство Контроль уникальности. При этом если у документа установлено свойство Автонумерация, при попытке редактирования номера документа будет получено предупреждение: «Номер заполняется при записи автоматически. Продолжить редактирование?». Затем, если номер документа был изменен, в транзакции записи между событиями ПередЗаписью и ПриЗаписи объекта Документ выполняется контроль уникальности номера документа, и, если номер не уникальный, транзакция записи отменяется; ■■ Проверка версии документа. Проверяется идентичность версий объекта документа и версии записей базы данных, хранящих данные этого документа. Если версии не совпадают, транзакция прерывается и выдается предупреждение: «Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно запись была изменена или удалена)!». Это необходимо, например, при следующей ситуации: некой обработкой программно было обеспечено, что для двух пользователей были открыты формы одного и того же документа. Первый пользователь изменил значение Контрагента в документе, второй – значение Номенклатуры. На момент первой попытки записи измененного документа версии объекта документа и записей базы данных совпадут – документ будет записан. Но при попытке записи документа другим пользователем версии не совпадут, и система не позволит записать параллельно измененный документ, поскольку данное действие может породить коллизии; ■■ Запись данных в таблицы документов; ■■ Запись данных в таблицы табличных частей документов. Данное действие оптимизировано по скорости исполнения. Это происходит за счет автоматического различения ситуаций, когда необходимо записать (модифицировать) данные всех записей, подчиненных записываемому документу, или только одной записи. Том 1
Интерактивно запись инициируется действиями пользователей, приводящими к выполнению системных действий: ■■ ■■ ■■ ■■
«Записать», «Провести и закрыть»/«Записать и закрыть», «Провести», «Отмена проведения».
Программно в контексте формы документа запись может быть инициирована посредством метода Записать() расширения формы документа. Причем методу может быть передана структура ПараметрыЗаписи, содержащая предопределенные параметры записи РежимЗаписи и РежимПроведения. Параметр
РежимЗаписи содержит значения из системного перечисления РежимЗаписиДокумента: Запись, ОтменаПроведения, Проведение. В зави-
симости от значения параметра поведение системы будет различным. Например, для значения Запись будет вызвана запись данного документа без проведения, для значения Проведение – запись с проведением, для значения ОтменаПроведения – запись с отменой проведения. Параметр РежимПроведения используется в случае записи документа с проведением и содержит значения из системного перечисления РежимПроведенияДокумента: Неоперативный, Оперативный. Для значения Неоперативный будет выполнено неоперативное проведение документа, т. е. проведение выполняется не в реальном времени (например, проведение задним числом), для значения Оперативный будет выполнено оперативное проведение документа, т. е. проведение выполняется в реальном времени (например, при этом может быть выполнен контроль текущих остатков).
Действие «Записать» При записи документа, вызванной интерактивным действием Записать или применением метода Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Запись), кроме самой записи инициируется последовательность событий. Для непроведенного документа последовательность событий при записи из формы документа будет следующей (рис. 10.30а).
509
Глава 10. Документы и последовательности
Рис. 10.30а. Вызов событий при выполнении действия «Записать» для непроведенного документа
Следует иметь в виду, что для расширения формы документа платформа по умолчанию устанавливает свойство ПриЗаписиПерепроводить. То есть при записи проведенного документа будет автоматически выполняться его перепроведение. В этом случае для проведенного документа последовательность событий при записи из формы документа будет следующей (рис. 10.30б).
Рис. 10.30б. Вызов событий при выполнении действия «Записать» для проведенного документа
Если свойство ПриЗаписиПерепроводить у расширения формы документа не установлено, то последовательность событий при записи в форме для проведенного документа будет такой же, как и у непроведенного документа (см. рис. 10.30а). Для документа, у которого запрещено проведение (свойство Проведение установлено в значение Запретить), последовательность событий при записи из формы документа будет следующей (рис. 10.30в). Часть событий относится к контексту формы документа, и они могут быть перехвачены соответствующими обработчиками событий, располагаемыми в модуле формы документа. Часть событий относится к контексту объекта документа, и они могут быть перехвачены там. Заметьте, что при записи проведенного документа с перепроведением (см. рис. 10.30б) и при записи документа, у которого запрещено проведение (см. рис. 10.30в), кроме самой записи в контексте формы и в контексте объекта вызывается также событие ОбработкаПроверкиЗаполнения, которое вызывается расширением формы при необходимости проверки заполнения реквизитов при записи или при проведении документа в форме. В обработчиках этого события в модуле формы или в модуле объекта разработчик может самостоятельно реализовать проверку заполнения данных формы.
510
Рис. 10.30в. Вызов событий при выполнении действия «Записать» для документа, у которого запрещено проведение
Профессиональная разработка в системе «1С:Предприятие 8»
Документы В обработчиках события ПередЗаписью посредством установки параметру Отказ значения Истина можно предотвратить последующий набор действий. То есть, например, если установлен отказ в записи документа на уровне контекста формы документа, то последующие в показанной выше схеме события уже не произойдут, поскольку платформа прекращает выполнение данной последовательности действий.
Действие «Отмена проведения» В случае записи документа, вызванной системным действиями «Отмена проведения» или применением метода Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.ОтменаПроведения), кроме самой записи инициируются следующие события (рис. 10.32).
Действия «Провести и закрыть», «Провести» В случае записи документа, вызванной интерактивными действиями Провести и закрыть (если у документа не запрещено проведение), Провести или применением метода Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение), кроме самой записи инициируются следующие события (рис. 10.31).
Рис. 10.32. Вызов событий при выполнении действия «Отмена проведения»
То есть в этом случае появляется еще событие ОбработкаУдаленияПроведения. Процедура-обработчик этого события также может располагаться только в модуле объекта документа, содержит указание действий, которые должны быть выполнены при отмене проведения, и имеет параметр Отказ. Применение этого параметра аналогично разобранным выше случаям. Рис. 10.31. Вызов событий при выполнении действий «Провести и закрыть», «Провести»
То есть добавляется еще одно событие – ОбработкаПроведения. Процедура-обработчик этого события может находиться только в модуле объекта документа, предназначена для указания действий, которые нужно выполнить при проведении документа, и также имеет параметр Отказ. Действия с ним аналогичны предыдущему случаю. То есть последующие события уже не выполняются, если параметру Отказ установлено значение Истина. Том 1
Если запись документа производится не в форме, отличия состоят в том, что при выполнении этого действия не задействуются события, связанные с формой. Например, программная запись с проведением будет производиться следующим образом (рис. 10.33).
511
Глава 10. Документы и последовательности
Рис. 10.34. Последовательность работы с документом
Свойство «Проведение» объекта конфигурации Свойство Проведение объекта конфигурации значения Разрешить или Запретить.
Рис. 10.33. Последовательность событий при программной записи объекта документа с проведением
Проведение документов Ввод информации в документ в общем случае может осуществляться не за один раз. Кроме того, часть информации, необходимой для полной регистрации события в учетных механизмах, может становиться известной не сразу, а часть информации может быть получена в результате анализа и обработки исходной. Поэтому в системе есть возможность различать состояния документа – «введен» и «проведен». Для этого чаще всего разделяются операции ввода первичной информации (заполнение документа) и отражения данных документа в учете (обработка первичной информации и формирование движений), рис. 10.34. Обработку информации для отражения в учете и формирование движений по регистрам обычно выполняют при проведении документа. Данный механизм удобен для выполнения подобных действий.
Документ
может иметь
В первом случае поведение документа соответствует вышеописанному (разделение операций заполнения документа и отражения его данных в учетных механизмах). То есть именно для таких документов имеют смысл работа с полем Проведен и процесс Проведение. Если же свойство объекта конфигурации Проведение имеет значение Запретить, это означает, что такой документ вообще не должен проводиться. Такая ситуация может использоваться: ■■ для документов, для которых нет необходимости в индикации того, что выполнены изменения в учетных механизмах, либо когда такие изменения документами не производятся; ■■ для документов, которые используются для интерактивного ввода движений (например, документ Ручная операция). Поскольку в случае ручной операции нет разделения информации на исходную (информацию документа) и обработанную (информация, записываемая в регистр со ссылкой на документ), информация сразу же вводится в регистр (рис. 10.35).
Рассмотрим более подробно варианты проведения документов. Их использование определяется значениями свойств документа как объекта конфигурации, а именно: ■■ ■■ ■■ ■■
Проведение, Оперативное проведение, Удаление движений, Запись движений при проведении.
512
Рис. 10.35. Ручная операция
Профессиональная разработка в системе «1С:Предприятие 8»
Документы Для документов, у которых запрещено проведение, системное поле Проведен при записи получает значение Ложь. Но во всех таблицах, отображающих данные динамических списков документов или журналов документов, пиктограмма документов, у которых запрещено проведение, похожа на пиктограмму проведенных документов. Таким образом, система подсказывает пользователю, что больше никакой обработки для данных документов не требуется (рис. 10.36). Рис. 10.37. Общие случаи регистрации событий
Оперативное проведение используется в ситуациях, когда есть необходимость отличать проведение в реальном режиме времени (оперативное) от другого и выполнять различные действия для одного и другого режимов. Рис. 10.36. Пиктограмма документа, для которого запрещено проведение
Поведение форм, основным реквизитом которых является объект или список документа, учитывает значение свойства Проведение. Например, в командной панели формы документа с запрещенным проведением система не создает кнопок с действиями «Провести» или «Отмена проведения».
Вариант использования данного механизма может, например, включать разделение случаев (рис. 10.38): ■■ когда документ проводится в реальном времени и есть необходимость, например, проконтролировать остаток товаров на складе при проведении документа; ■■ когда проведение документа просто отражает уже свершившийся факт и нужно просто зафиксировать в учетных механизмах совершенное событие.
Однако система не запрещает попыток программной записи таких документов с проведением или с отменой проведения. Не запрещает, но все подобные попытки реализует по схеме обычной записи документа без проведения.
Свойство «Оперативное проведение» объекта конфигурации Свойство Оперативное проведение объекта конфигурации Документ может иметь значения Разрешить или Запретить. Для документов, у которых данное свойство имеет значение Разрешить, разрешено использование механизма оперативного проведения. Поскольку посредством документов производится регистрация событий, причем на временной оси, то в общем случае положение проводимого документа может быть отнесено к прошлому, настоящему или будущему. Как правило, документы, относимые к прошлому, регистрируют уже произошедшие события. Обычно такой способ регистрации называют «задним числом». В настоящем регистрируются события, которые только-только происходят. Такой способ регистрации называют «реальным временем». Кроме того, бывают ситуации, когда событие должно быть зарегистрировано в будущем. Например, при решении задач планирования (рис. 10.37). Том 1
Рис. 10.38. Оперативное и неоперативное проведение
С точки зрения технологических средств механизм оперативного проведения включает в себя: ■■ запрет проведения будущей датой; ■■ использование механизма оперативной отметки времени для принудительного изменения значения даты документа в случаях, когда это требуется. В ситуации, когда пользователи системы находятся в разных часовых поясах, в пределах одной информационной базы может существовать несколько последовательностей оперативных отметок времени, каждая – для своего часового пояса; ■■ передачу в обработчик события ОбработкаПроведения параметру РежимПроведения значения Оперативный системного перечисления РежимПроведенияДокумента.
513
Глава 10. Документы и последовательности В каких случаях можно намеренно не использовать механизм оперативного проведения? В любых, когда его использование не требуется логикой решаемой задачи. Например: ■■ когда нет нужды использовать разные алгоритмы проведения документов для оперативного или неоперативного режимов; ■■ когда не требуется при проведении документов обеспечивать их расположение в определенном порядке на временной оси посредством выдачи оперативных отметок времени. При отказе от использования механизма оперативного проведения главное – не нарушить логику его использования для других документов. Например, если для проведения документа Поступление товаров используется один и тот же алгоритм для любого вида проведения, это еще не означает, что можно установить запрет использования режима оперативного проведения. Его проведение будущей датой изменит данные оперативных итогов регистров именно будущей датой. То есть будет различие между актуальными итогами регистров и итогами на момент оперативной отметки времени. Это может привести к нарушению логики использования механизма оперативного проведения для документов Реализация товаров.
Свойство «Удаление движений» объекта конфигурации Свойство Удаление движений объекта конфигурации Документ может иметь значения Удалять автоматически при отмене проведения (стандартное значение), Удалять автоматически или Не удалять автоматически. В случае значения Удалять автоматически при отмене проведения для свойства Удаление движений движения, связанные с документом, удаляются автоматически только при удалении и отмене проведения документа. При проведении документа движения не удаляются, а перезаписываются. Такое поведение является стандартным для платформы «1С:Предприятие». Используя два других значения свойства Удаление движений, разработчик может реализовывать нестандартные сценарии проведения документа. В случае значения Удалять автоматически для свойства Удаление движений платформа сама автоматически удаляет старые записи движений, связанных с данным документом, в следующих ситуациях: ■■ при записи документа с проведением (старые записи удаляются, а новые формируются); ■■ при пометке документа на удаление (процесс, а не состояние); ■■ при отмене проведения документа (процесс, а не состояние).
514
В случае же значения Не удалять автоматически для свойства Удаление движений автоматическое удаление движений для этих ситуаций производиться не будет. Например, ответственность за правильность оформления заказов покупателей лежит на отделе продаж. Однако заказы выборочно контролируются финансовым отделом. При обнаружении нарушений в назначении цен документ снимается с проведения, что означает необходимость его дальнейшей доработки. Но движения по регистрам учета при этом удаляться не должны, чтобы не исключать данный заказ из учета вообще.
Свойство «Запись движений при проведении» объекта конфигурации Свойство Запись движений при проведении объекта конфигурации Документ может иметь значения Записывать выбранные (стандартное значение) или Записывать модифицированные. В случае значения Записывать выбранные разработчик должен в обработчике проведения документа в явном виде указать, какие наборы движений документа следует записывать. Для этого нужно установить свойство набора записей Записывать в значение Истина. После выхода из обработки проведения те наборы записей, у которых свойство Записывать все еще имеет значение Истина, будут автоматически записаны платформой. При выполнении записи движений, например, при оперативном проведении документа методом Записать(), свойство Записывать у записанных наборов движений сбрасывается в значение Ложь. Такое поведение является стандартным для платформы «1С:Предприятие» и оптимизирует запись измененных наборов записей без удаления движений в начале проведения. В случае значения Записывать модифицированные для свойства Запись движений при проведении после выхода из обработки проведения все модифицированные наборы записей будут автоматически записаны платформой.
Свойства «Привилегированный режим при проведении», «Привилегированный режим при отмене проведения» объекта конфигурации Для ускорения работы с документом платформа стандартно устанавливает свойства документа Привилегированный режим при проведении и Привилегированный режим при отмене проведения. В результате проведение и отмена проведения документа выполняются на сервере, без контроля прав, максимально быстро.
Профессиональная разработка в системе «1С:Предприятие 8»
Документы
Использование механизма оперативного проведения Рассмотрим, как работает механизм при интерактивном проведении из формы документа. Пусть документу как объекту конфигурации разрешено оперативное проведение (свойство Оперативное проведение имеет значение Разрешить), и свойство ИспользоватьРежимПроведения расширения формы документа имеет значение Автоматически. При этом значении режим проведения документов из формы будет подбираться системой автоматически, исходя из даты документа, позиции документа по отношению к оперативной отметке времени и других параметров.
Запрет проведения будущей датой При проведении документа система прежде всего проверит положение даты документа относительно текущей даты сеанса. Текущая дата сеанса равна системной дате компьютера, приведенной к часовому поясу сеанса. В свою очередь, часовой пояс сеанса изначально равен часовому поясу информационной базы (если он установлен – УстановитьЧасовойПоясИнформационнойБазы()) или часовому поясу сервера. Часовой пояс сеанса можно установить программно – УстановитьЧасовойПоясСеанса().
Рис. 10.39. Использование оперативной отметки времени
Если дата документа на день позже текущей даты сеанса, пользователь получит предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!». Проведение при этом не состоится. Если дата документа на день меньше текущей даты сеанса, документ будет проведен неоперативно. Если обе даты определяют один и тот же день, система принимает решение, что документ может быть проведен оперативно, то есть реальным временем.
Механизм оперативной отметки времени
Рис. 10.40. Формирование оперативной отметки времени
Для того чтобы документы располагались последовательно и не попадали внутрь одной секунды (внутри одной секунды порядок следования не будет зависеть от разработчика), система выполняет автоматическое изменение времени документа. Дата документа получает значение оперативной отметки времени, которая рассчитывается системой по определенному алгоритму.
Если одновременно проводить оперативно несколько документов, то результат работы данного механизма можно представить следующим образом (рис. 10.41).
Далее управление передается обработчику события ОбработкаПроведения, при этом параметр РежимПроведения получает значение РежимПроведенияДокумента.Оперативный (рис. 10.39). Механизм оперативной отметки времени позволяет при параллельной работе пользователей записывать оперативно проводимые документы с возрастающей последовательностью значений свойства Дата. Дата оперативно проводимого документа получается равной текущей дате сеанса или на секунду больше предыдущей выданной оперативной отметки времени (рис. 10.40). Том 1
Рис. 10.41. Использование оперативной отметки времени
515
Глава 10. Документы и последовательности Как уже говорилось выше, в пределах одной информационной базы может существовать несколько последовательностей оперативных отметок времени. Если все пользователи работают в одном и том же часовом поясе, то тогда последовательность оперативных отметок времени будет однаединственная. Если же есть пользователи, работающие в других часовых поясах, тогда таких последовательностей будет несколько, каждая для своего часового пояса. Последняя выданная оперативная отметка времени для каждого часового пояса сеанса хранится до момента выхода из программы последнего пользователя (включая и режим работы Конфигуратор). В клиент-серверном варианте работы системы эти отметки хранятся на сервере, в оперативной памяти. Хранение и выдачу оперативных отметок времени на сервере поддерживает сервис времени. В файловом варианте работы системы такие отметки хранятся в специальной служебной таблице информационной базы. Получение оперативной отметки времени может выполняться не только автоматически, но и разработчиком посредством метода ПолучитьОперативнуюОтметкуВремени(), листинг 10.6. Листинг 10.6. Получение оперативной отметки времени
НоваяОперативнаяОтметкаВремени = ПолучитьОперативнуюОтметкуВремени();
Хотелось бы обратить внимание на ограничение формирования даты документа при интерактивном проведении документа в пределах дня. Если в рамках одного дня уже выдана оперативная отметка времени со временем 23:59:59, то следующий оперативно проводимый документ того же дня выдаст пользователю сообщение о невозможности провести данный документ оперативно (в рамках того же дня) – «Дата документа не соответствует текущей дате или дате последнего оперативно проведенного документа. Документ не может быть проведен оперативно!», и проведение документа не состоится (рис. 10.42).
тивно или же иметь возможность провести документ неоперативно. Однако для того, чтобы пользователь мог выбирать режим проведения, свойство ИспользоватьРежимПроведения расширения формы документа должно быть установлено в значение Запрашивать, и у пользователя должно быть право на неоперативное проведение. Если же свойство ИспользоватьРежимПроведения имеет значение Автоматически или Оперативный, то платформа будет пытаться выполнить оперативное проведение документа, что приведет к сообщению об ошибке. подробнее
Раздел «Установка режима проведения», стр. 521.
Налицо определенное ограничение, накладываемое системой. Однако в практике ввода документов реальным временем столкнуться с ним почти невозможно. Для воспроизведения такой ситуации требуется, чтобы, например, 61 одновременно работающий пользователь в течение последней минуты уходящего дня начал проведение оперативно проводимых документов. Если же все же подобная ситуации при автоматизации некоего предприятия с ночным режимом работы имеет место, 61-й и последующие документы, скорее всего, можно уже датировать следующим днем либо обеспечить их возможность проведения в неоперативном режиме. Ведь невозможность оперативного проведения еще не означает невозможность проведения вообще. Кроме того, запись документов с проведением может еще вызываться и программно. В таком случае можно указать режим проведения в параметре РежимПроведения (листинг 10.7). Листинг 10.7. Указание режима программного проведения документа
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
Тогда поведение системы в отношении установки даты документа и передачи параметра обработчику события ОбработкаПроведения будет соответствовать оперативному проведению. Однако необходимо помнить, что дата документа при этом должна соответствовать дню текущей даты сеанса. Иначе обработка проведения пойдет по схеме неоперативного проведения. Рис. 10.42. Получение оперативной отметки времени следующим днем
Сделано это потому, что дата документа может иметь юридическое значение. Поэтому в такой ситуации у пользователя есть два варианта: изменить дату документа следующим днем и провести документ опера-
516
Проблемы выдачи оперативной отметки времени после 23:59:59 при программной записи документов с оперативным проведением нет. Поскольку программное проведение означает вмешательство неких алгоритмов в ход формирования, заполнения и записи документов, то в данном случае может оказаться, что некому реагировать на предупреждение Профессиональная разработка в системе «1С:Предприятие 8»
Документы о невозможности оперативного проведения в рамках того же дня. Поэтому система для подобного документа просто сформирует дату на секунду больше последней оперативной отметки времени. Если потребуется не допустить формирования и проведения документов с датой будущего дня, это можно обеспечить программно, в составе соответствующих обработчиков.
Передача значения «Оперативный» в параметр «РежимПроведения» обработчика события «ОбработкаПроведения» Итак, при оперативном проведении документов система позволяет добиться расстановки документов в идеальной хронологической последовательности (каждое событие зарегистрировано на момент его отражения в учете) и, кроме того, известить об этом обработчик проведения. То есть с точки зрения отражения документа в учете сам механизм оперативного проведения не выполняет никаких действий, он только передает параметр в обработчик проведения. Что это дает разработчику? Дает возможность отличать ситуации проведения документов реальным временем от иных ситуаций. А это уже впоследствии может быть использовано для решения прикладных задач. Может использоваться следующая градация действий при проведении документов: ■■ при оперативном проведении – помощь пользователю посредством контроля возможности операции и правильности ее оформления, после этого – отражение ее в учетных механизмах; ■■ при неоперативном проведении – отражение в учетных механизмах факта свершившегося события без всякой обработки. То есть, например, при проведении документа РеализацияТоваров алгоритм обработки оперативного проведения будет контролировать остатки товаров, перечисленных в табличной части документа, на складе, указанном в документе. Для этого в процедуре обработки проведения после записи движений документа будут получены актуальные остатки расходуемых товаров из регистра накопления ТоварыНаСкладах. В случае отрицательных остатков какого-либо товара на складе (а значит, невозможности отгрузки) пользователь будет получать соответствующее сообщение, и документ проводиться не будет. Если пользователь проводит документ, соответствующий уже произошедшему событию (неоперативно), нужда в контроле остатка отпадает. Например, вчера отключилось электричество, и не успели отразить в программе операцию отгрузки двух холодильников со склада. Вводя сегодня данные о событии вчерашней отгрузки, контролировать возможность данной операции уже бессмысленно, поскольку холодильники уже отгружены (листинг 10.8). Том 1
подробнее
Пример алгоритма проведения документа РеализацияТоваров содержится в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске. Листинг 10.8. Пример процедуры «ОбработкаПроведения»
Процедура ОбработкаПроведения(Отказ, РежимПроведения) // Укажем, по каким регистрам нужно записывать движения. Движения.ТоварыНаСкладах.Записывать = Истина; Движения.Продажи.Записывать = Истина; // Создать менеджер временных таблиц. МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; // Укажем, какой менеджер временных таблиц использует этот запрос. Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровСостав.Номенклатура, | РеализацияТоваровСостав.Номенклатура.Услуга КАК Услуга, | СУММА(РеализацияТоваровСостав.Количество) КАК | КоличествоВДокументе, | СУММА(РеализацияТоваровСостав.Сумма) КАК СуммаВДокументе |ПОМЕСТИТЬ НоменклатураДокумента |ИЗ | Документ.РеализацияТоваров.Состав КАК РеализацияТоваровСостав |ГДЕ | РеализацияТоваровСостав.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РеализацияТоваровСостав.Номенклатура, | РеализацияТоваровСостав.Номенклатура.Услуга";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Запрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ; Запрос2.Текст = "ВЫБРАТЬ | НоменклатураДокумента.Номенклатура, | НоменклатураДокумента.Услуга, | НоменклатураДокумента.КоличествоВДокументе, | ЕСТЬNULL(НоменклатураДокумента.СуммаВДокументе, 0) | КАК СуммаВДокументе |ИЗ | НоменклатураДокумента КАК НоменклатураДокумента"; Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда // Установим необходимость блокировки данных в регистре ТоварыНаСкладах. Движения.ТоварыНаСкладах.БлокироватьДляИзменения = Истина; // Запишем пустые наборы записей, чтобы читать остатки без // учета данных в документе. Движения.ТоварыНаСкладах.Записать(); КонецЕсли;
Результат = Запрос2.Выполнить();
517
Глава 10. Документы и последовательности
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Если НЕ ВыборкаДетальныеЗаписи.Услуга Тогда // Сформировать движения по регистру ТоварыНаСкладах (расход). Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Склад = Склад; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; КонецЕсли; // Сформировать движения по регистру Продажи. Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Контрагент = Контрагент; Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе; Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаВДокументе; Движение.ВидОперации = ВидОперации; КонецЦикла;
Движения.Записать();
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда // Проверить отрицательные остатки. Запрос3 = Новый Запрос; Запрос3.МенеджерВременныхТаблиц = МенеджерВТ; Запрос3.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОстатки.Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | Номенклатура В | (ВЫБРАТЬ | НоменклатураДокумента.Номенклатура | ИЗ | НоменклатураДокумента) | И Склад = &Склад) КАК ТоварыНаСкладахОстатки |ГДЕ | ТоварыНаСкладахОстатки.КоличествоОстаток < 0"; Запрос3.УстановитьПараметр("Склад", Склад); РезультатСНехваткой = Запрос3.Выполнить(); ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать(); Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не хватает " + Строка( ВыборкаРезультатаСНехваткой.КоличествоОстаток) + " единиц товара """ + ВыборкаРезультатаСНехваткой.Номенклатура + """ на складе """ + Склад + "."; Сообщение.Сообщить(); Отказ = Истина; КонецЦикла; КонецЕсли; КонецПроцедуры
518
Рассмотрим подробно последовательность действий в процедуре боткаПроведения.
Обра-
Сначала в обработчике указываются наборы записей, содержащие движения документа по регистрам, которые должны быть записаны при проведении документа. Для этого нужным наборам записей устанавливается свойство Записывать в значение Истина (например, Движения.ТоварыНаСкладах.Записывать = Истина). Затем данные табличной части документа РеализацияТоваров помещаются во временную таблицу. Эти данные посредством менеджера временных таблиц будут затем использованы в запросе для формирования движений документа и в запросе к регистру накопления для контроля остатков товаров на складах. Заметьте, что данные табличной части документа группируются по полям Номенклатура и Услуга, чтобы суммировать поля Количество и Сумма при наличии в документе нескольких строк с одинаковой номенклатурой. Затем в случае оперативного проведения документа (РежимПроведения = РежимПроведенияДокумента.Оперативный) данные регистра ТоварыНаСкладах блокируются путем установки свойства БлокироватьДляИзменения в значение Истина. Это делается для того, чтобы заблокировать остатки от чтения другими транзакциями до тех пор, пока не будет завершена текущая транзакция. А также движения данного документа в регистре очищаются путем записи пустого набора данных (Движения.ТоварыНаСкладах.Записать()). Это обеспечивает чтение остатков без учета существующих движений документа (в случае его перепроведения). Далее выполняется запрос к временной таблице, содержащей перечень расходуемых товаров, и в цикле выборки результата запроса формируются движения по нужным регистрам. Затем движения документа в регистрах записываются в явном виде (Движения.Записать()). Метод Записать() выполняет запись всех наборов движений, у которых свойство Записывать установлено в значение Истина. И, наконец, при оперативном проведении выполняется контроль достаточности остатка товаров на складе. Для этого после записи движений выполняется запрос для получения отрицательных остатков номенклатуры, содержащейся во временной таблице, и на складе, указанном в документе. После этого выборка записей запроса обходится в цикле, и, если есть такие записи, сообщение о них выводится пользователю. В результате документ не проводится, т. к. параметру Отказ присваивается значение Истина. Если каждый документ, формирующий движения в количественном учете, будет проводиться с поддержкой механизма оперативного проведения и движения его будут датироваться именно датой документа, то можно быть уверенным в двух фактах: ■■ не будет ситуации, когда два документа претендуют на одно и то же время (механизм выдачи оперативной отметки времени распределит их с интервалом в секунду); Профессиональная разработка в системе «1С:Предприятие 8»
Документы ■■ текущий проводимый документ находится на временной оси всегда позже последнего оперативно проведенного документа. А это важно при получении остатков из регистров. Так как кроме движений и помесячных остатков таблицы регистров хранят еще подсчитанные итоги, актуальные на момент времени последней записи в них. И если мы уверены, что «за» оперативной отметкой времени не было движений, то тогда для получения актуальных данных контроля остатка можно использовать виртуальную таблицу остатков регистра без указания параметра Период (или с указанием значения Неопределено в качестве его значения). Данная операция будет выполняться быстрее, если в качестве параметра передать значение момента времени документа. Потому что при отсутствии параметра система не будет пытаться обращаться к таблице записей регистра для «досчета» остатков до нужной временной точки, а сразу возьмет данные последних актуальных итогов из таблицы итогов данного регистра (рис. 10.43).
Листинг 10.9. Оперативное программное проведение документа
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
И если документ пытаются записать в будущем, выдается соответствующее предупреждение о невозможности выполнения данной операции. Но вот программное неоперативное проведение документов система не запрещает. Кроме того, при формировании движений можно добиться ситуации, чтобы Период движения не совпадал со значением Дата документа. То есть в принципе движения могут быть сформированы будущей датой. Ответственность за недопущение подобных фактов – на разработчике. В завершение хотелось бы отметить, что использование механизма оперативного проведения может быть составной частью более сложных алгоритмов. Например, для того, чтобы во время активного ввода информации сократить количество действий по отражению документов в учете (а значит, обеспечить большую скорость проведения документов), часть этих действий не выполняется при неоперативном проведении, а часть относится на действия, выполняемые регламентными обработками. Стратегия отражения документов в учетных механизмах выглядит тогда следующим образом:
Рис. 10.43. Получение итогов регистра
Но нужно понимать, что для корректности использования механизма оперативного проведения при данном алгоритме работы необходимо сделать так, чтобы никакими способами не были сформированы движения в будущем. Иначе использование актуальных итогов регистров в обработке проведения будет невозможно (вернее придется рассчитывать регистры на момент времени документа, но тогда какой смысл в оперативной работе, если при этом итоги регистров не будут актуальны на момент оперативно проводимого документа). В основном это обеспечивается системой: стандартные команды форм не позволяют пользователю оперативно проводить документы будущей датой и не предлагают в таких случаях проводить документы неоперативно. Кроме того, система при выполнении попытки программной записи с проведением в оперативном режиме (листинг 10.9) сначала выполняет проверку положения даты документа относительно дня оперативной отметки времени. Том 1
■■ при оперативном проведении – помощь пользователю посредством контроля возможности операции и правильности ее оформления, отражение совершаемого события только в механизмах, обеспечивающих контрольные функции при оперативном проведении других документов; ■■ при неоперативном проведении – отражение факта свершившегося события без всякой обработки и только в учетных механизмах; ■■ при проведении специальной регламентной обработкой – отдельно для каждого зарегистрированного события контроль возможности и правильности его оформления, отражение данного события во всех оставшихся учетных механизмах. Примером подобного использования механизма оперативного проведения можно считать задачу проведения документа, отражающего реализацию товаров со склада не только в количественном, но и в количественностоимостном учете. Постановка задачи может быть следующей: при реализации товаров со склада реальным временем (оперативное проведение) необходимо предварительно выполнить ряд проверок правомерности этой операции (наличие достаточного остатка на складе, контроль предоплаты со стороны покупателя). Эти проверки и сама регистрация факта отгрузки в количественном учете товаров на складе выполняются в обработке проведения документа. Если же требуется проведение документа реализации задним числом (неоперативное проведение), это означает необходимость отражения уже свершившегося факта. Тогда не требуется проверять предоплату и наличие
519
Глава 10. Документы и последовательности товаров на складе, поскольку товар уже отгружен клиенту. Нужно просто отразить факт отгрузки в количественном учете товаров на складе при проведении документа. Окончательное же отражение произошедших событий в механизме количественно-стоимостного учета товаров на складе производится посредством отдельной регламентной обработки, которая будет выполняться не в период активного ввода первичной информации, а впоследствии. При ее выполнении будут собраны все необходимые данные для всех еще не полностью отраженных событий, проведены все необходимые проверки и расчеты, и приписаны необходимые движения к документам реализации. Периодичность выполнения этой обработки определяется пользователем. Например, чтобы быть достаточной для получения регламентной отчетности (рис. 10.44).
Особенности работы формы документа Если
основной
реквизит формы имеет тип значения то для данной формы действует расширение формы документа. Посредством него решаются вопросы специфичной функциональности формы документа. Расширение помогает обрабатывать различные команды пользователя, выполнять предварительные проверки и другие сервисные действия. ДокументОбъект.,
Кроме того, действие расширения формы документа распространяется и на механизмы записи и проведения документа. При этом не важно, была вызвана запись документа интерактивными действиями пользователя в форме документа или средствами языка методом Записать(). Рассмотрим ряд примеров работы этих механизмов.
Установка даты документа при открытии формы Если дата документа изначально не установлена, то при открытии формы нового документа происходит установка дате документа значения текущей даты сеанса. Причем время документа будет установлено в зависимости от следующих настроек. Если свойство АвтоВремя расширения формы документа имеет значение НеИспользовать, то время документа будет установлено по значению текущей даты сеанса. В остальных случаях дате документа присваивается время начала дня (00:00:00), рис. 10.45.
Рис. 10.44. Проведение документа «Реализация товаров»
В случаях отказа от использования оперативного проведения разработчику достаточно лишь установить свойству Оперативное проведение документа как объекта конфигурации значение Запретить. И тогда все необходимые элементы работы механизма проведения придется реализовывать самостоятельно. То есть, например, при проведении документа предварительно проводить контроль даты документа, контроль возможности проведения документа и т. д.
520
Рис. 10.45. Установка даты нового документа при открытии формы документа
Профессиональная разработка в системе «1С:Предприятие 8»
Документы
Установка даты нового документа при записи нового документа в форме При записи документа в режиме оперативного проведения значение даты документа устанавливается согласно выданной оперативной отметке времени. Тут настройки свойств расширения формы не играют роли. Но если время документа «нулевое» (0:00:00), то при неоперативном проведении документа оно будет изменено согласно настройкам свойства АвтоВремя (рис. 10.46). Исключение – когда АвтоВремя имеет значение НеИспользовать. Тогда время документа не меняется.
Рис. 10.47. Данные документа «РеализацияТоваров» и движения документа в регистре «ТоварыНаСкладах»
Предотвращение подобных ситуаций достигается за счет установки свойства расширения формы документа ПриЗаписиПерепроводить в значение Истина. Тогда отказ в обработке проведения приведет к откату транзакции – документ не будет перезаписан.
Установка режима проведения
Рис. 10.46. Установка даты нового документа при записи документа в форме
Запрет интерактивной записи проведенного документа без проведения (перепроведения) Запрет интерактивной записи документа без проведения (перепроведения) используется, чтобы не создавалась, например, такая ситуация: сначала документ реализации был заполнен и проведен, при проведении сформированы движения по регистру с указанием количества, соответствующего количеству в документе. После этого пользователь исправил данные документа и сохранил без проведения (рис. 10.47). В результате таких манипуляций в документе будут записаны новые данные, а в движениях по регистру останутся данные от прошлого проведения документа, то есть они никак не будут соответствовать текущим данным документа. Том 1
При проведении документа из формы система проверяет наличие у пользователя соответствующих прав (Проведение, Интерактивное проведение, Интерактивное проведение неоперативное). Если их нет, то выдается сообщение о невозможности проведения документа, и запись с проведением документа из формы отменяется. Мы будем рассматривать только возможность отсутствия/наличия прав на неоперативное проведение, в зависимости от которого система может менять свое поведение, так как если нет первых двух прав, то документ не может быть проведен из формы в принципе. Если интерактивное проведение разрешено, сам выбор варианта проведения должен быть обусловлен логикой применения механизма установки режима проведения из формы. То есть в некоторых ситуациях система должна выбирать режим жестко, в некоторых право выбора режима можно предоставить пользователю. Для этого разработчик обладает рядом возможностей, предоставляемых системой посредством разграничения прав и расширениями формы документа. При записи документа из формы расширение формы документа выполняет установку режима проведения документа. Для реализации данного функционала система использует вариант (Автоматически, Оперативный, Неоперативный, Запрашивать), указанный в качестве значения свойства ИспользоватьРежимПроведения расширения формы документа.
521
Глава 10. Документы и последовательности Вариант «Автоматически»
Вариант «Оперативный»
Вариант Автоматически устанавливается посредством выбора значения Автоматически у свойства ИспользоватьРежимПроведения расширения формы документа. Платформа стандартно устанавливает это значение для новой формы.
Вариант Оперативный устанавливается посредством выбора значения Оперативный у свойства ИспользоватьРежимПроведения расширения формы документа.
При использовании данного варианта, в зависимости от ситуации и настроек, происходит первичный подбор режима проведения из вариантов Оперативный или Неоперативный. Для проводимого документа происходит проверка положения даты документа относительно текущей даты сеанса. Если дата документа (без учета времени) равна текущей дате сеанса, то система автоматически выбирает вариант проведения Оперативный. Если дата документа (без учета времени) больше текущей даты сеанса, пользователю выдается предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется.
В данном варианте, если дата документа (без учета времени) меньше текущей даты сеанса, выдается предупреждение: «Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется. Если дата документа (без учета времени) равна текущей дате сеанса, производится запись документа с оперативным проведением. Если дата документа (без учета времени) больше текущей даты сеанса, выдается предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется (рис. 10.49).
Если дата документа (без учета времени) меньше текущей даты сеанса, выбирается вариант проведения Неоперативный. При этом если у пользователя нет права на неоперативное проведение, выдается предупреждение: «Недостаточно прав для неоперативного проведения», и проведение документа отменяется (рис. 10.48).
Рис. 10.49. Использование режима проведения «Оперативный»
Вариант «Неоперативный»
Вариант Неоперативный устанавливается посредством выбора значения Неоперативный у свойства ИспользоватьРежимПроведения расширения формы документа. Рис. 10.48. Использование режима проведения «Автоматически»
522
При использовании данного варианта проведение документа из формы всегда производится в неоперативном режиме, независимо от положения даты документа по отношению к текущей дате сеанса. Профессиональная разработка в системе «1С:Предприятие 8»
Документы При этом если у пользователя нет права на неоперативное проведение, выдается предупреждение: «Недостаточно прав для неоперативного проведения», и проведение документа отменяется (рис. 10.50).
Рис. 10.50. Использование режима проведения «Неоперативный»
Вариант «Запрашивать»
Вариант Запрашивать устанавливается посредством выбора значения Запрашивать у свойства ИспользоватьРежимПроведения расширения формы документа. Данный вариант реализован в системе для того, чтобы помочь пользователю принять решение о выборе режима проведения для каждой конкретной ситуации. В данном варианте пользователь перед началом проведения должен будет выбрать режим проведения документа в специальном системном окне (рис. 10.51).
Рис. 10.51. Выбор режима проведения
Поведение системы при этом варианте определяется прежде всего положением даты документа (без времени) по отношению к текущей дате сеанса. При равенстве этих дат далее проверяется, имеет ли пользователь право проводить документ неоперативно. Если пользователь такого права не имеет, система проводит данный документ в оперативном режиме. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора режима проведения система проводит документ соответственно в оперативном или неоперативном режиме (рис. 10.52). Том 1
Рис. 10.52. Использование режима проведения «Запрашивать» при условии равенства даты документа и текущей даты сеанса
Если дата документа (без учета времени) меньше текущей даты сеанса, поведение системы определяется опять же наличием права на неоперативное проведение у пользователя. Если пользователь таким правом не обладает, выдается предупреждение: «Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора неоперативного режима проведения система проводит документ в неоперативном режиме. Если же пользователь выберет оперативный режим проведения, выдается предупреждение: «Дата оперативно проводимого документа меньше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется (рис. 10.53). Если дата документа (без учета времени) больше текущей даты сеанса, система не позволяет проводить документ оперативно. Поэтому если права неоперативного проведения нет, сразу выдается предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменяется. Если право на неоперативное проведение есть, пользователю выдается диалог с режимом выбора проведения. После выбора неоперативного режима проведения система проводит документ в неоперативном режиме. Если же пользователь выберет оперативный режим проведения, будет
523
Глава 10. Документы и последовательности выдано предупреждение: «Дата оперативно проводимого документа больше текущей. Документ не может быть проведен оперативно!», и проведение документа отменится (рис. 10.54).
Прочие функции Кроме выбора режима проведения и установки даты документа, расширение формы документа реализует также следующий функционал: ■■ при открытии формы проведенного документа, если у пользователя нет права Интерактивное изменение данных, форма переводится в режим ТолькоПросмотр; ■■ при открытии формы документа, в которой находятся таблицы, отражающие движения основного реквизита (объекта документа), эти движения автоматически считываются из базы данных и отображаются; ■■ при записи из формы (даже если и программной – посредством Записать()) система выполняет проверку прав на интерактивное проведение или интерактивную отмену проведения.
Ввод на основании
Рис. 10.53. Использование режима проведения «Запрашивать» при условии, что дата документа меньше текущей даты сеанса
Рис. 10.54. Использование режима проведения «Запрашивать» при условии, что дата документа больше текущей даты сеанса
524
Ввод на основании является одним из вариантов реализации заполнения нового объекта данными другого объекта. Чаще всего это действие применяется для документов, но может использоваться для ряда других объектов (Справочники, Планы видов характеристик, Планы счетов, Планы расчетов, Планы обменов, Бизнес-процессы, Задачи). Причем в общем случае вводится любой объект на основании любого.
Рис. 10.55. Пример использования ввода на основании
Профессиональная разработка в системе «1С:Предприятие 8»
Документы Механизм работы ввода на основании включает в себя формирование нового объекта и вызов обработчика события ОбработкаЗаполнения создаваемого объекта. Например, необходимо реализовать заполнение документа, реализующего отгрузку товаров, на основании объекта, содержащего информацию о том, что именно нужно отгрузить. Исходным объектом, применяемым в конкретном случае, может быть, например, документ ЗаказПокупателя или элемент справочника ДоговорыКонтрагентов (рис. 10.55). Ввод на основании может быть организован за счет интерфейсных средств или программно.
Интерактивный ввод на основании Интерфейсные возможности реализуются за счет соответствующих расширений форм и элементов форм. Кроме того, необходимо, чтобы в свойствах объекта конфигурации было указано, на основании каких объектов он может вводиться (рис. 10.56).
Рис. 10.56. Указание объектов, являющихся основанием для ввода
В результате: ■■ разработчику будет доступен вызов конструктора ввода на основании для документа РеализацияТоваров; ■■ в автозаполняемых командных панелях форм, у которых основным реквизитом является объект документа ЗаказПокупателя и объект элемента справочника Договоры, а также в командных панелях форм списков данных объектов появляется новое подменю СоздатьНаОсновании (рис. 10.57) с действием РеализацияТоваров. Если же данное подменю уже было, то к нему просто добавится указанное действие. Том 1
Рис. 10.57. Кнопка «Ввести на основании»
Посредством конструктора ввода на основании (или без его использования) в составе модуля объекта документа РеализацияТоваров может быть реализована процедура – обработчик события ОбработкаЗаполнения. Поскольку параметром ДанныеЗаполнения данной процедуры система передает ссылку на объект-источник, то у разработчика появляется возможность заполнить данные документа информацией объекта-источника. Для нашего примера ее текст может быть таким (листинг 10.10). Листинг 10.10. Пример процедуры «ОбработкаЗаполнения»
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда // Заполнение шапки. Договор = ДанныеЗаполнения.Договор; Контрагент = ДанныеЗаполнения.Контрагент; ОснованиеРеализации = ДанныеЗаполнения.Ссылка; // Заполнить табличную часть данными табличной части основания. Для Каждого ТекСтрокаСостав Из ДанныеЗаполнения.Состав Цикл НоваяСтрока = Состав.Добавить(); НоваяСтрока.Количество = ТекСтрокаСостав.Количество; НоваяСтрока.Номенклатура = ТекСтрокаСостав.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСостав.Сумма; НоваяСтрока.Цена = ТекСтрокаСостав.Цена; КонецЦикла; ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.ДоговорыКонтрагентов") Тогда // Заполнение шапки. Контрагент = ДанныеЗаполнения.Владелец; ДатаПоставки = ДанныеЗаполнения.ДатаПоставки; Договор = ДанныеЗаполнения.Ссылка; ОснованиеРеализации = ДанныеЗаполнения.Ссылка; // Заполнить табличную часть данными табличной части основания. Для Каждого ТекСтрокаСпецификация Из ДанныеЗаполнения.Спецификация Цикл НоваяСтрока = Состав.Добавить(); НоваяСтрока.Количество = ТекСтрокаСпецификация.Количество; НоваяСтрока.Цена = ТекСтрокаСпецификация.Цена; НоваяСтрока.Номенклатура = ТекСтрокаСпецификация.Номенклатура; НоваяСтрока.Сумма = ТекСтрокаСпецификация.Сумма; КонецЦикла;
КонецЕсли;
КонецПроцедуры
525
Глава 10. Документы и последовательности подробнее
Данный пример приведен в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компактдиске.
В результате, если пользователь в соответствующей форме выберет из подменю СоздатьНаОсновании действие РеализацияТоваров, произойдет создание нового документа и вызов обработчика события ОбработкаЗаполнения. То есть произойдут следующие события (рис. 10.58).
Сообщение.Текст = "Не заполнено поле 'Контрагент'!"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры
В случае выполнения условий, то есть если объектом-источником будет документ ЗаказПокупателя с невыбранным контрагентом, произойдет выдача сообщения пользователю и отказ от создания формы нового документа, вводимого на основании.
Программный ввод на основании Программный способ заполнения документа данными из других объектов реализуется посредством метода Заполнить(). Например, если в переменной СсылкаНаИсходныйОбъект содержится ссылка на некий заказ покупателя или на некий договор контрагента, то программное создание документа РеализацияТоваров с заполнением данных из исходного объекта и последующая его запись могут быть выполнены следующим образом (листинг 10.12). Листинг 10.12. Пример создания нового документа на основании
Рис. 10.58. Последовательность событий при интерактивном вводе на основании
Кроме того, произойдет заполнение значения параметра Основание расширения формы документа. Ему также будет присвоено значение ссылки на объект-источник. Это свойство можно активно использовать в обработчиках событий формы. Например, требуется запретить интерактивный ввод документа РеализацияТоваров на основании документа ЗаказПокупателя, если у последнего не заполнен контрагент. Для реализации этой задачи достаточно написать процедуру обработчика создания формы документа РеализацияТоваров, например, следующим образом (листинг 10.11). Листинг 10.11. Пример процедуры «ПриСозданииНаСервере»
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если ТипЗнч(Параметры.Основание) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда Если Параметры.Основание.Контрагент.Пустая() Тогда Сообщение = Новый СообщениеПользователю();
526
НовыйДокумент = Документы.РеализацияТоваров.СоздатьДокумент(); НовыйДокумент.Дата = ТекущаяДата(); НовыйДокумент.Заполнить(СсылкаНаИсходныйОбъект); НовыйДокумент.Записать();
Сначала новый документ будет создан в оперативной памяти, заполнено свойство Дата текущим временем, далее посредством метода Заполнить() управление будет передано обработчику события ОбработкаЗаполнения. Обратите внимание: в результате применения программного заполнения документов контекст формы не задействуется (рис. 10.59). После заполнения документ записывается. Событие ПриУстановкеНовогоНомера произойдет в транзакции записи, только если для документа используется автонумерация. Причем в соответствии с установкой параметров метода Записать() по умолчанию в данном примере документ будет записан без проведения. Следует заметить, что событие ОбработкаЗаполнения есть не только у объектных данных (документов, справочников и т. п.), но и у регистра сведений, и оно располагается в модуле объекта РегистрСведенийНаборЗаписей..
Профессиональная разработка в системе «1С:Предприятие 8»
Документы
Рис. 10.60. Цепочка документов, введенных на основании
– объект конфигурации, представляющий собой одну из составляющих механизма отборов информации. Критерии отбора позволяют разработчику реализовать предопределенные правила отборов информации за счет создания дополнительных индексов в таблицах объектов в базе данных. КритерийОтбора
Рис. 10.59. Последовательность событий при программном вводе на основании
Получение документов, введенных на основании Кроме того, при решении прикладных задач иногда возникает необходимость получения всех документов, связанных с неким исходным объектом. Например, в рамках некоего договора был оформлен ЗаказПокупателя, на основании документа ЗаказПокупателя был введен документ РеализацияТоваров, на основании РеализацииТоваров были введены СчетФактура и ПриходныйКассовыйОрдер. Впоследствии часть товара была возвращена, то есть на основании РеализацииТоваров был введен ВозвратТоваровОтПокупателя. Кроме того, аналогичная цепочка документов может быть оформлена в отношении другого ЗаказаПокупателя (рис. 10.60).
Для вышеприведенного примера можно создать новый критерий отбора ДокументыПоДоговору. Тип критерия отбора указывается в соответствии с типом данных, по которым будут отбираться объекты. То есть в данном примере – СправочникСсылка.ДоговорыКонтрагентов, но в общем случае может быть и составным. В составе критерия отбора указываются реквизиты объектов, по которым нужно будет производить отбор. В данном случае это реквизит Договор документов ЗаказПокупателя, ПриходныйКассовыйОрдер, РеализацияТоваров (рис. 10.61).
Поскольку все события происходили в рамках договорных отношений одного договора, пользователю может оказаться необходимо увидеть все документы, касающиеся этого договора, в одном списке. Для реализации этого в состав всех объектов, которые нужно отобрать по данному договору, можно включить реквизит, ссылающийся на данный договор. Пусть он называется Договор. Далее для реализации отбора подчиненных договору документов можно использовать запросы или, например, критерии отбора. Том 1
Рис. 10.61. Состав объектов, входящих в критерий отбора «ДокументыПоДоговору»
527
Глава 10. Документы и последовательности В результате для таблиц объектов (в данном случае для таблиц документов) в базе данных будут созданы индексы по полям, хранящим значения этих реквизитов. Обратите внимание: в состав критерия отбора можно включить несколько реквизитов одного и того же документа или несколько реквизитов табличной части документа. Согласно информации о типе критерия отбора в группе Перейти панели навигации форм объектов, имеющих соответствующий тип, платформа создает команды для открытия списка критерия отбора. В приведенном выше примере такие команды будут созданы в группе Перейти панели навигации формы элемента справочника ДоговорыКонтрагентов. По умолчанию эта команда невидима, но можно включить ее видимость на закладке Командный интерфейс в форме элемента (рис. 10.62).
Рис. 10.62. Команда открытия критерия отбора из формы элемента справочника «ДоговорыКонтрагентов»
В результате, открыв какой-либо элемент справочника ДоговорыКонтрагентов, можно перейти к списку документов, в которых указан данный договор (рис. 10.63).
Также разработчик может сам вставить команду для открытия списка критерия отбора в форму списка объекта соответствующего типа (в данном случае справочника ДоговорыКонтрагентов). Для этого нужно найти соответствующую глобальную параметризируемую команду на закладке редактора формы списка – Команды Глобальные команды Параметризуемые Элементы Список Имя критерия отбора(Элементы.Список.ТекущиеДанные.Ссылка), рис. 10.64.
Рис. 10.64. Открытие списка критерия отбора «Документы по договору» по текущему элементу справочника
Если же требуется обеспечить переходы другими средствами, то это можно реализовать программно. Достаточно лишь иметь в наличии ссылку на значение отбора. То есть для вышеприведенного примера критерия отбора и переменной СсылкаНаЗначениеОтбора это может быть реализовано так (листинг 10.13). Листинг 10.13. Пример использования критерия отбора
Рис. 10.63. Открытие списка критерия отбора «Документы по договору» по текущему элементу справочника
528
&НаКлиенте Процедура ОткрытьСписокКритерияОтбора(Команда) // Открыть форму списка критерия отбора с отбором по договору. ЗначениеОтбора = Новый Структура("Значение", СсылкаНаЗначениеОтбора); ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора); ОткрытьФорму("КритерийОтбора.ДокументыПоДоговору.ФормаСписка", ПараметрыФормы); КонецПроцедуры
Профессиональная разработка в системе «1С:Предприятие 8»
Документы Краткий комментарий: сначала создается структура отбора ЗначениеОтбора со значением реквизита формы СсылкаНаЗначениеОтбора, содержащим ссылку на договор, и добавляется в структуру параметров формы ПараметрыФормы. Эти параметры передаются в форму списка критерия отбора ДокументыПоДоговору, и форма открывается с отбором по полю Значение списка критерия отбора, указанному в форме обработки ОткрытьФормуКритерияОтбора.
не предусмотрено специальных документов (в бухгалтерском учете их обычно называют ручными операциями). Либо когда при регистрации события пользователь заполняет ровно те поля, которые требуется заполнять в регистре. И ввод этой учетной информации не требует никакой дополнительной обработки.
Кроме того, может возникнуть потребность программного получения коллекции подчиненных документов (или других объектов), то есть соответствующих отбору по определенному значению. Это можно реализовать посредством объектной техники (листинг 10.14) или посредством запроса (листинг 10.15).
Например, в рамках демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, создан документ РучнаяОперация, данными которого будут только Дата и Номер. Поскольку проведение данного документа не предусматривается, свойству Проведение данного документа указано значение Запретить. Однако в разделе свойства Движения отмечен регистр, для которого данный документ может быть регистратором (ТоварыНаСкладах), рис. 10.65.
Листинг 10.14. Пример использования объектной техники
МассивСсылокНаОбъекты = КритерииОтбора.ДокументыПоДоговору.Найти(СсылкаНаЗначениеОтбора);
Рассмотрим подробнее возможность интерактивного формирования движений.
Листинг 10.15. Пример использования запроса
ВЫБРАТЬ ДокументыПоДоговору.Ссылка ИЗ КритерийОтбора.ДокументыПоДоговору(&Значение) КАК ДокументыПоДоговору
В качестве значения параметру Значение необходимо будет передать ссылку на значение отбора. Для функционирования конкретного критерия отбора в базе данных для исходных таблиц были созданы соответствующие индексы. Поэтому обеспечивается достаточно быстрая работа этого механизма.
Специальные случаи использования документов. Ручная операция
Рис. 10.65. Документ «РучнаяОперация»
Кроме типовой стратегии использования документов в конфигурации, когда движения формируются при проведении документов, система допускает и другие варианты участия документов в учетных механизмах. Так, в частности, допускается программное и интерактивное изменение записей регистров, в том числе и подчиненных регистратору. Причем от регистратора может использоваться только ссылка для определения отбора по регистратору. Остальное может быть выполнено вообще без использования данных документа.
Далее при создании формы документа в окне элементов формы необходимо разместить таблицу, отображающую данные Объект.Движения.ТоварыНаСкладах (рис. 10.66).
Такая возможность не нарушает общую модель использования документов и регистров, а лишь дополняет ее для решения нестандартных задач. Например, когда пользователям нужно предоставить возможность отражения в учетных механизмах операций, для которых в конфигурации
Однако необходимо иметь в виду, что поведение подобного документа может быть неожиданным для пользователей, привыкших работать с документами по стандартной схеме.
Том 1
Пользователь при работе с данным документом сможет интерактивно формировать или модифицировать движения данного документа по регистру ТоварыНаСкладах и записывать документ. При записи документа данные, отображаемые в этой таблице, будут записаны в регистр (рис. 10.67).
529
Глава 10. Документы и последовательности Кроме того, возможна ситуация, когда необходимо, чтобы движения существовали, но не участвовали в получении итогов регистра. Для этого можно снять активность записей движений. Необходимо помнить, что хотя Активность является свойством записей, однако она может быть установлена или снята только для всего набора записей данного регистратора по данному регистру. Программно это (листинг 10.16).
может
быть
выполнено
следующим
образом
Листинг 10.16. Изменение активности записей
Движения.ТоварыНаСкладах.УстановитьАктивность(Ложь);
Кроме того, «неожиданным» для пользователя может оказаться тот факт, что при копировании подобного документа содержимое таблицы движений автоматически копироваться не будет. Ведь там отображаются движения документа по регистру, а они не относятся к данным документа. Данный вопрос должен прорабатываться разработчиком. Рис. 10.66. Источник данных таблицы формы, отображающей движения документа в регистре «ТоварыНаСкладах»
Для реализации подобной функциональности необходимо воспользоваться обработчиком события ПриКопировании объекта документа (листинг 10.17). Листинг 10.17. Использование обработчика события «ПриКопировании»
Процедура ПриКопировании(ОбъектКопирования) // Перебрать движения документа-источника. ДвиженияОбъектаКопирования = РегистрыНакопления.ТоварыНаСкладах. ВыбратьПоРегистратору(ОбъектКопирования.Ссылка); Пока ДвиженияОбъектаКопирования.Следующий() Цикл Рис. 10.67. Схема документа «Ручная операция»
Например, при установке пометки удаления на такой документ не будет срабатывать отмена проведения и удаление движений документа. Ведь документ и не проводился (ему было запрещено проведение). А как же обеспечить удаление движений?
// Создать новую запись в движениях текущего документа. НовоеДвижение = Движения.ТоварыНаСкладах.Добавить();
// Заполнить поля новой записи регистра. НовоеДвижение.ВидДвижения = ДвиженияОбъектаКопирования.ВидДвижения; НовоеДвижение.Период = ДвиженияОбъектаКопирования.Период; НовоеДвижение.Номенклатура = ДвиженияОбъектаКопирования.Номенклатура; НовоеДвижение.Склад = ДвиженияОбъектаКопирования.Склад; НовоеДвижение.Количество = ДвиженияОбъектаКопирования.Количество; КонецЦикла;
Вариантов несколько:
КонецПроцедуры
■■ удалить сам документ. Тогда система удалит связанные с ним движения, поскольку записи регистра подчинены регистратору и в данном случае без регистратора существовать не могут; ■■ интерактивно удалить записи в таблице, отображающей движения документа, и записать документ; ■■ программно очистить движения, то есть создать пустой набор записей с отбором по данному регистратору, и записать его.
Поскольку обработчик события ПриКопировании в качестве параметра получает объект копируемого документа, то в самой процедуре считываются его движения. Далее в цикле перебора набора записей документа источника формируются новые записи уже в коллекции движений нового документа. Значения полей новых записей заполняются значением полей записей из движений документа-источника.
530
Профессиональная разработка в системе «1С:Предприятие 8»
Документы При интерактивном формировании движений документа в общем случае поле Период записей регистра доступно для редактирования. Это позволяет устанавливать произвольный период начала действия любой записи на итоги регистра. В ряде прикладных задач, однако, подобную «вольность» требуется пресечь. Для принудительной синхронизации поля Период, например, по значению даты документа можно использовать следующее (листинг 10.18).
Подобным образом могут решаться еще задачи для проводимых документов. Например, если пользователь должен иметь возможность в дополнение к сформированным при проведении документа движениям добавлять новые или вручную корректировать существующие движения.
Листинг 10.18. Синхронизация даты движений с датой документа в обработчике события «ПередЗаписью» формы документа
Но при этом разработчику обязательно нужно учитывать и корректно отрабатывать возможные попытки перепроведения документа с «интерактивно откорректированными» движениями. Если ничего не предпринимать, а свойство документа Удаление движений будет иметь значение Удалять автоматически, то система при перепроведении удалит старые движения и сформирует новые такими, какими их формирует обработка проведения. То есть результаты ручной коррекции будут потеряны.
&НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Для Каждого ЗаписьРегистра Из Объект.Движения.ТоварыНаСкладах Цикл ЗаписьРегистра.Период = Объект.Дата; КонецЦикла; КонецПроцедуры
Саму синхронизацию в зависимости от реализуемого алгоритма работы с документом можно располагать или в обработчике события ПередЗаписью в модуле формы документа, или в модуле объекта документа. В первом случае синхронизация будет производиться только при интерактивной записи документа, во втором – и при программной записи тоже. Кроме того, как определяли в начале этого раздела, формирование движений не обязательно может идти от документа. Движения могут быть сформированы программно, посредством объекта НаборЗаписей регистра (просто с установленным отбором по нужному регистратору). Для синхронизации значения поля Дата записей регистра со значением поля Дата документа и для таких случаев необходимо использовать обработчик события ПередЗаписью самого набора записей (листинг 10.19). Листинг 10.19. Пример процедуры «ПередЗаписью» модуля набора записей регистра
Процедура ПередЗаписью(Отказ, Замещение)
// Получить дату регистратора. ДатаРегистратора = ЭтотОбъект.Отбор.Регистратор.Значение.Дата;
// Принудительно установить значение поля "Период" каждой записи. Для Каждого ЗаписьНабораЗаписей Из ЭтотОбъект Цикл ЗаписьНабораЗаписей.Период = ДатаРегистратора; КонецЦикла; КонецПроцедуры
Выше мы рассмотрели ситуации и задачи, которые могут возникнуть при интерактивном формировании движений документов, которым проведение запрещено. Том 1
То есть в форме документа можно также создать таблицу для интерактивной работы с набором записей данного документа по нужному (нужным) регистру.
Что именно должна выполнять конфигурация в подобной ситуации, зависит от постановки задачи. Все возможные предпосылки для ее решения у системы есть. Это и отключение автоматического удаления движений, и возможность отключения активности записей, и возможность реализации отказа в проведении документа, и т. д.
Журналы документов документов – объект конфигурации, предназначенный для обеспечения работы с документами нескольких видов в одном списке. Журнал
Посредством журналов легко обеспечивается интерактивный вызов следующих действий (например, посредством командной панели формы журнала): ■■ добавление нового документа; ■■ копирование документа; ■■ пометка на удаление документа/снятие пометки на удаление документа; ■■ удаление документа; ■■ открытие формы документа (для редактирования документа); ■■ проведение документа; ■■ отмена проведения документа; ■■ ввод на основании; ■■ переход к связанной информации (в том числе отображение списков движений документа); ■■ установка отбора, сортировки, группировки и условного оформления списка документов;
531
Глава 10. Документы и последовательности ■■ вывод данных из списка журнала документов в табличный документ или текстовый документ; ■■ изменение настройки списка отображаемых в журнале колонок; ■■ установка интервала дат в списке документов; ■■ поиск документа по значению в колонке списка/отмена поиска. С прикладной точки зрения журналы документов – средство группирования связанных по смыслу документов. Например, журнал КассовыеДокументы может включать в себя документы ПриходныйКассовыйОрдер, РасходныйКассовыйОрдер, Чек, ОтчетКассовойСмены и так далее. Для отображения данных только одного вида документов создавать журнал документов не стоит. Потому что формируемая по умолчанию или созданная в конфигурации форма списка документа целиком реализует ту же функциональность без лишних структурных затрат. По сути дела журналы документов – вторичные данные системы, представляющие собой еще одно представление списка документов. Каждый документ может входить в один или несколько журналов или не входить ни в один. Все определяется наличием необходимости работы с рядом документов в составе одного списка (рис. 10.68).
Рис. 10.69. Окно редактирования журнала документов
Наличие дополнительных граф в составе журнала дает возможность пользователю получать в списке журнала сведения о документах, дополнительные к вышеперечисленным. Графа журнала представляет собой перечень реквизитов документов, регистрируемых в журнале, значения которых нужно отображать в списке в одной колонке (рис. 10.70).
Рис. 10.68. Включение документов в различные журналы
Состав журналов В состав журнала как объекта конфигурации включаются регистрируемые документы и графы (рис. 10.69). При регистрации документа сразу же обеспечиваются возможности отображения в списке журнала таких полей, как: ■■ ■■ ■■ ■■ ■■
Тип документа, Дата, Номер, ПометкаУдаления, Проведен.
532
Рис. 10.70. Регистрация реквизитов документов в графе журнала
В списке журнала по каждому конкретному экземпляру документа информация будет отображаться для пользователя в составе только одной строки списка. Поэтому в каждую графу журнала можно включить только один реквизит для каждого вида документа и невозможно включать реквизиты табличной части документа. Кроме того, рекомендуется включать в состав одной графы данные одного типа значений или близких по смыслу типов значений. Например, графа ДокументОснование будет включать в себя данные значений соответствующих реквизитов разных видов документов. При этом типы значений реквизитов могут быть различными, но они близки по смыслу. Профессиональная разработка в системе «1С:Предприятие 8»
Журналы документов На уровне объектов базы данных информация журналов документов хранится в отдельных таблицах для каждого журнала документов. Эти таблицы имеют следующий состав полей и содержат следующую информацию: ■■ Ссылка – ссылка на регистрируемый в журнале документ; ■■ Дата – дата/время регистрируемого документа; ■■ ПометкаУдаления – пометка удаления регистрируемого документа (Булево); ■■ Проведен – пометка проведенности регистрируемого документа (Булево); ■■ Номер – номер регистрируемого документа (поле существует, если хоть один из регистрируемых документов имеет номер с длиной, отличной от нуля); ■■ Графа1 – содержимое соответствующих реквизитов регистрируемых документов. Тип значения поля определяется типом значений реквизитов регистрируемых документов; ■■ … – … ■■ ГрафаN – … Согласно вышеописанному можно сделать вывод о том, что состав и тип значения полей таблиц разных журналов отличаются. Кроме того, при добавлении новых документов к перечню зарегистрированных может меняться не только тип значения полей, но и состав полей.
В принципе число документов, регистрируемых в составе одного журнала, неограниченное – могут быть зарегистрированы хоть все документы конфигурации. При решении данного вопроса необходимо только помнить о необходимости обеспечения параллельности работы пользователей и достаточного уровня быстродействия системы при выполнении операций записи/удаления документов. В отношении обеспечения параллельности работы: ■■ при файл-серверном варианте использования программы транзакционные блокировки устанавливаются на уровне таблиц базы данных. Поэтому документы, входящие в один журнал, одновременно не смогут быть записаны; ■■ при клиент-серверном варианте использования программы блокировки устанавливаются на уровне записей. Поэтому блокировки СУБД допускают более высокую параллельность выполнения транзакций. В отношении скорости записи/удаления документов: чем меньше количество журналов, в которых регистрируется документ, тем быстрее проходит его запись или удаление. Поэтому к вопросу организации журналов в составе функционально наполненных конфигураций нужно подходить внимательно.
Например, если ранее все зарегистрированные документы имели номера нулевой длины, то добавление нового с номером ненулевой длины приведет к добавлению поля Номер в составе таблицы журнала.
Также внимательно следует подходить к вопросу определения граф журнала. Большое количество граф может сказаться на производительности системы при просмотре журнала. Поэтому при отображении динамических списков документов, входящих в журнал, из базы данных считываются только те поля, которые связаны с соответствующими колонками таблицы формы списка журнала. Это сделано для уменьшения объема выбираемой из базы данных информации.
Заполнение журналов
Последовательности документов
Заполнение/редактирование таблицы журнала происходит при записи/ удалении документов, в рамках той же транзакции. Причем только в следующих ситуациях: ■■ запись нового документа; ■■ запись документа, у которого есть изменения в реквизитах самого документа (изменения в табличных частях не приводят к необходимости «перезаполнения» записей в таблицах журналов); ■■ запись документа с измененной датой или номером, с изменением признака проведения или пометки удаления; ■■ удаление документа. Таким образом, функциональность журналов обеспечивается с минимальными временными затратами на ее поддержание. Сколько документов можно зарегистрировать в составе одного журнала? Том 1
Последовательность документов – средство группирования документов в едином хронологическом порядке для обеспечения ведения единой логики событий в рамках некоего механизма учета. В отличие от журналов документов, которые используются в основном для группирования документов в «интерфейсных интересах» (для визуализации), последовательности группируют документы для обеспечения правильного отражения данных документов в учете. Поскольку учетных механизмов в составе одной конфигурации может быть несколько, то и последовательностей может быть адекватное количество. Кроме того, сами модели применения объекта Последовательность могут отличаться. В качестве первого примера рассмотрим использование последовательности для учета правильности списания партий товаров со склада. Проведение ряда документов (документов реализации) обусловлено
533
Глава 10. Документы и последовательности состоянием данных, хранящихся в базе данных, на момент времени регистрации документов (остатки партий в регистре ПартииТоваров). Изменение же этих исходных данных впоследствии, после проведения документа, ставит под сомнение правильность прошлого отражения данного документа в учете. Например, документ реализации Рнк-1 оформлен и проведен после двух приходных накладных, оприходовавших товар (рис. 10.71).
Для новой ситуации движения документа Реализация, полученные в результате старого проведения, некорректны (табл. 10.7). Таблица 10.7. Записи регистра «ПартионныйУчет» Период
Регистратор
Вид движения Товар
Партия
Кол-во
Сумма
13.03.2010 15:00:01 23.03.2010 15:30:45 27.03.2010 12:30:45
ПоступлениеТоваров № 1 13.03.2010 15:00:01 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Реализация № 1 27.03.2010 12:30:45
Приход
Пульт VH
Пнк-1
7
70
Приход
Пульт VH
Пнк-2
5
60
Расход
Пульт VH
Пнк-1
9
90
Ведь для списания девяти пультов одной партии Пнк-1 теперь недостаточно! К аналогичному печальному результату можно прийти и в случае любого изменения записей регистра задним числом (рис. 10.73). Рис. 10.71. Набор документов
При проведении было реализовано списание партий по методу FIFO (первый пришел – первый ушел). То есть расходная накладная использовала данные об остатках партий на момент ее проведения. В результате все операции были отражены в учете партий в виде следующих записей регистра ПартионныйУчет (табл. 10.6). Таблица 10.6. Записи регистра «ПартионныйУчет» Период
13.03.2010 15:00:01 23.03.2010 15:30:45 27.03.2010 12:30:45
Регистратор
ПоступлениеТоваров № 1 13.03.2010 15:00:01 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Реализация № 1 27.03.2010 12:30:45
Вид движения
Приход
Товар
Партия
Пульт VH Пнк-1
Кол-во Сумма
10
100
Рис. 10.73. Пример изменения записей регистра задним числом
Приход
Пульт VH Пнк-2
5
60
В результате записи в регистре (учете) будут следующими (табл. 10.8).
Расход
Пульт VH Пнк-1
9
90
Таблица 10.8. Записи регистра «ПартионныйУчет»
Видно, что при реализации была частично списана партия Пнк-1. Далее было произведено изменение одной из исходных приходных накладных с последующим ее перепроведением (рис. 10.72).
Период
Регистратор
Вид движения Товар
Партия
Кол-во Сумма
01.03.2010 00:00:00
Ручная корректировка остатков РК-1 29.03.2010 17:00:00 ПоступлениеТоваров № 1 13.03.2010 15:00:01 ПоступлениеТоваров № 2 23.03.2010 15:30:45 Реализация № 1 27.03.2010 12:30:45
Приход
Пульт VH
РК-1
2
16
Приход
Пульт VH
Пнк-1
10
100
Приход
Пульт VH
Пнк-2
5
60
Расход
Пульт VH
Пнк-1
9
90
13.03.2010 15:00:01 23.03.2010 15:30:45 27.03.2010 12:30:45
То есть движения документа Реализация не отвечают требованиям метода списания FIFO. Рис. 10.72. Нарушение последовательности проведения документов
534
Для исправления ситуации объект Последовательность позволяет в таких случаях оперировать понятием граница последовательности. Профессиональная разработка в системе «1С:Предприятие 8»
Последовательности документов Это и есть момент времени максимально глубокого в прошлом изменения записей регистра (регистров), от которого зависит проведение документов, зарегистрированных в последовательности. Именно с этого момента возможны коллизии правильности ведения учета. То есть до границы последовательности документы проведены заведомо правильно, после – возможно, неправильно.
Устройство последовательностей Для создания объекта конфигурации Последовательность разработчик должен указать, какие документы необходимо регистрировать в последовательности, и список регистров, данные которых используются этими документами при своем проведении (рис. 10.75).
Сам процесс восстановления логики учета может быть реализован путем последовательного перепроведения документов, зарегистрированных в последовательности, начиная от границы последовательности, и называется восстановление последовательности. Другой вариант использования объекта Последовательность: пользователи в течение дня вводят поток заявок от покупателей и внутренних заявок. Причем в силу специфики автоматизируемого предприятия часто имеет место ситуация ввода нескольких заявок от одних и тех же покупателей или для одних и тех внутренних подразделений. Кроме того, возможен ввод «запоздавших» заявок прошлых дней. Документы записываются, но не проводятся. По окончании рабочего времени офиса автоматически включается обработка Консолидация заявок, которая собирает все непроведенные заявки (разных видов), начиная от границы последовательности, консолидирует их, оформляет соответствующим образом и проводит уже обобщенные заявки. Впоследствии исходные заявки удаляются. После этого граница последовательности смещается на момент времени последней проведенной консолидированной заявки (рис. 10.74).
Рис. 10.75. Свойства, относящиеся к использованию последовательности
Хотелось бы обратить внимание на то, что автоматическое отслеживание изменения таких данных осуществляется только для регистров: ■■ ■■ ■■ ■■
Рис. 10.74. Использование последовательности для консолидации заявок
Первый приведенный пример можно назвать классическим. Он касается давно существующей задачи «борьбы с коллизиями из-за работы пользователей задним числом». Данная задача полностью или в большей своей части может быть решена за счет встроенных в платформу автоматических средств объекта Последовательность. Второй приведенный пример показывает, что разработчик при использовании объекта Последовательность не обязательно должен замыкаться только на «коллизиях работы задним числом». Благодаря наличию различных программных средств и возможностей логика применения последовательностей документов определяется самим разработчиком. Том 1
регистров накопления, регистров сведений, регистров бухгалтерии, регистров расчета.
Но это не мешает при необходимости реализовать программными средствами изменение положения границы последовательности при изменении данных других объектов. Например, для последовательности документов, критичных к изменению условий в элементе справочника Договоры, при записи модифицированного элемента данного справочника можно программно установить границу последовательности на момент времени самого первого документа по этому договору. Кроме того, последовательность может иметь разрезы. Это реализуется включением измерений в данные последовательности. Например, если добавить в последовательность измерение Организация, то с прикладной точки зрения общая последовательность будет разбита на ряд последовательностей. Каждая из них может функционировать в рамках отдельной организации. То есть, например, будет возможно произвести восстановление последовательности документов только одной
535
Глава 10. Документы и последовательности организации, не затрагивая остальных. С другой стороны, наличие измерений не препятствует работе с последовательностью в целом. Для хранения данных объекта Последовательность в базе данных существуют две таблицы: таблица регистрации документов в последовательности и таблица границ последовательности. Состав колонок обеих таблиц сходен: Период, Регистратор, Измерение1, …, ИзмерениеN. Различно функциональное использование этих таблиц. Данные, хранящиеся в таблице регистрации документов, используются для решения вопросов, связанных с коллекцией зарегистрированных в последовательности документов. Причем в разрезе измерений. Для определенной комбинации значений измерений по одному регистратору в таблице регистрации документов может храниться только одна запись. Впоследствии данные этой таблицы могут использоваться, например, для получения упорядоченного по хронологии набора документов, которые требуется перепровести для восстановления последовательности. Или просто для получения массива ссылок на документы, записи по которым соответствуют некоему отбору по измерениям последовательности. Данные в таблице границ последовательностей хранят значения моментов времени границ последовательностей (Период + Регистратор) по каждому набору значений измерений последовательности. То есть уникальность записей таблицы границ последовательностей определяется набором значений измерений. Если измерений у последовательности нет, значит, в этой таблице будет только одна запись. Пример содержимого таблиц при наличии измерений у последовательности приведен в табл. 10.9 и табл. 10.10.
Работа с последовательностями Работа с последовательностью включает в себя три процесса: ■■ регистрация документа в последовательности; ■■ перемещение границы последовательности назад; ■■ перемещение границы последовательности вперед (восстановление границы последовательности). В принципе эти процессы, во-первых, независимы, во-вторых, могут выполняться системой автоматически или посредством программных действий, заложенных разработчиком.
Управление регистрацией документов в последовательности Для автоматической регистрации документа в последовательностях необходимо, чтобы свойство Заполнение последовательностей документа как объекта конфигурации было установлено в значение Заполнять автоматически. Если последовательность имеет измерения, то для обеспечения автоматического заполнения полей этих измерений в формируемой записи таблицы регистрации документов последовательности настраивается соответствие между реквизитами документа и измерениями последовательности документа (рис. 10.76).
Таблица 10.9. Пример таблицы регистрации документов в последовательности Период
Регистратор
Организация
Склад
01.03.2010 00:00:00 13.03.2010 15:00:01 23.03.2010 15:30:45 27.03.2010 12:30:45
Ручная корректировка остатков РК-1 29.03.2010 17:00:00
Сигма
Главный
ПоступлениеТоваров № 17 13.03.2010 15:00:01
Сигма
Торговый
ПоступлениеТоваров № 2 23.03.2010 15:30:45
Сигма
Торговый
Реализация № 1 27.03.2010 12:30:45
Марон
Главный
Таблица 10.10. Пример таблицы границ последовательности Организация Склад
Сигма Сигма Марон
536
Главный
Период
01.03.2010 00:00:00 Торговый 13.03.2010 15:00:01 Главный 27.03.2010 12:30:45
Регистратор
Ручная корректировка остатков РК-1 от 29.03.2010 17:00:00 ПоступлениеТоваров № 17 13.03.2010 15:00:01 Реализация № 1 27.03.2010 12:30:45
Рис. 10.76. Соответствие между реквизитами документа и измерениями последовательности
В случае указания соответствия между реквизитами документа (не табличной части) и измерениями последовательности при записи документа в таблице регистрации документов в последовательности формируется запись, в которой поля автоматически заполняются значениями из документа. Если при настройке такого соответствия указывается реквизит табличной части документа, то в таблице регистрации документов будет сформировано столько записей, сколько уникальных значений будет иметь данный реквизит табличной части документа в записываемом документе (рис. 10.77). Профессиональная разработка в системе «1С:Предприятие 8»
Последовательности документов и разных, то количество записей в таблице регистрации документов в последовательности может быть очень велико. Это может сказаться на производительности системы.
Если указывается несколько реквизитов одной табличной части, будет сформировано столько записей, сколько уникальных комбинаций из них указано в табличной части документа (рис. 10.78).
Следует иметь в виду еще один важный момент: при проведении документов, зарегистрированных в последовательности, платформа автоматически перемещает границу последовательности на момент регистрации этих документов, так как свойство Перемещение границы при проведении последовательности как объекта конфигурации стандартно установлено в значение Перемещать. Данная операция перемещения границы последовательности не может выполняться параллельно, соответственно, документы тоже не могут проводиться параллельно. Это может вызвать проблемы, если документы, участвующие в последовательности, должны вводиться в больших количествах.
Рис. 10.78. Пример формирования записей в таблице регистрации документов в последовательности
Регистрация документа в последовательности выполняется при записи документа. Процесс записи документа включает в себя следующие этапы (рис. 10.80).
Рис. 10.77. Пример формирования записей в таблице регистрации документов в последовательности
Во избежание данной ситуации можно установить это свойство в значение Не перемещать, тогда граница последовательности при проведении документов автоматически перемещаться не будет. Это позволит одновременно и регистрировать документ в последовательности, и параллельно проводить сразу несколько таких документов. Затем граница последовательности может быть перемещена программно при помощи специальной регламентной обработки.
Если же в соответствиях с измерениями последовательностей будут указаны реквизиты различных табличных частей, то документ будет зарегистрирован столько раз, сколько уникальных комбинаций значений можно составить (рис. 10.79).
Рис. 10.79. Пример формирования записей в таблице регистрации документов в последовательности
Исходя из вышесказанного, к вопросу добавления измерений в последовательность нужно подходить осмотрительно. Если для заполнения значений измерений использовать реквизиты табличных частей, да еще Том 1
Рис. 10.80. Действия, выполняемые при записи документа
537
Глава 10. Документы и последовательности В случае же записи документа с проведением очередность этапов процесса будет следующей (рис. 10.81).
Рис. 10.82. Действия, выполняемые при записи документа с отменой проведения
Рис. 10.81. Действия, выполняемые при записи документа с проведением
Добавляется обработка проведения документа и процесс переноса границы последовательности вперед при выполнении необходимых для этого условий. В случае же записи документа с отменой проведения последовательность действий будет следующей (рис. 10.82). Разработчику нужно помнить, что при создании новой последовательности документов автоматическая регистрация старых документов в ней не производится. Для осуществления регистрации нужно будет или перезаписать существующие документы, или написать обработку, которая зарегистрирует все нужные документы в последовательности. Если средств автоматической регистрации недостаточно или их использование неудобно, для управления регистрацией документа в последовательности документов служит набор записей регистрации в последовательности документов. У объекта документа есть свойство ПринадлежностьПоследовательностям. Его значением является коллекция наборов записей регистрации в последовательности документов. Для каждой последовательности, в которую входит документ, существует свой набор записей регистрации в последовательности документов (рис. 10.83).
538
Рис. 10.83. Последовательности, в которые входит документ
При автоматическом способе регистрации (напомним, для этого у документа как объекта конфигурации должен стоять признак автоматического заполнения последовательности) наборы записей таблиц регистрации документов в последовательностях автоматически заполняются до записи документа и записываются после записи документа в одной транзакции.
Профессиональная разработка в системе «1С:Предприятие 8»
Последовательности документов Поэтому если требуется программно очистить эти наборы записей и создать новые, можно это сделать в обработчике события ПередЗаписью или ПриЗаписи объекта документа (не путать с аналогичными обработчиками событий ПередЗаписью формы документа).
ПринадлежностьПоследовательностям объекта документа, при формиро-
Например, в составе последовательности документов ПартионныйУчет есть измерение Номенклатура. В табличной части Товары документа могут содержаться номенклатурные позиции, соответствующие услугам. По таким значениям измерения регистрировать документ в последовательности не нужно. Для того чтобы документ регистрировался в последовательности только по товарам (исключая услуги), можно сделать следующее (листинг 10.20).
Если же потребуется очистить всю таблицу записей регистрации документов в последовательности, то данную операцию легко выполнить программно. Запросом считать все регистраторы, на которые имеются ссылки в таблице записей регистрации документов. А затем по всем регистраторам записать пустой набор записей (листинг 10.21).
Листинг 10.20. Пример процедуры «ПередЗаписью» в модуле объекта документа «РеализацияТоваров»
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
НаборЗаписейРегистрации = ПринадлежностьПоследовательностям.ПартионныйУчет;
// Очистить автоматически сформированный набор записей регистрации. НаборЗаписейРегистрации.Очистить();
// Получить выборку товаров из табличной части документа. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | РеализацияТоваровСостав.Номенклатура |ИЗ | Документ.РеализацияТоваров.Состав КАК РеализацияТоваровСостав |ГДЕ | РеализацияТоваровСостав.Ссылка = &Ссылка | И (НЕ РеализацияТоваровСостав.Номенклатура.Услуга)";
вании новых записей достаточно было заполнить только значения измерений последовательности и поле Период, а поле Регистратор автоматически заполняется ссылкой на документ.
Листинг 10.21. Пример очистки таблицы регистрации документов в последовательности
Процедура ОчисткаТаблицыРегистрацииПоследовательностиПартионныйУчет()
// Получить все документы, зарегистрированные в последовательности. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ПартионныйУчет.Регистратор |ИЗ | Последовательность.ПартионныйУчет КАК ПартионныйУчет";
Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать();
// Создать набор записей таблицы регистрации последовательности // (при этом он пуст). НаборЗаписейРегистрации = Последовательности.ПартионныйУчет.СоздатьНаборЗаписей();
// Перебрать выборку из результата запроса. Пока Выборка.Следующий() Цикл
Запрос.УстановитьПараметр("Ссылка", Ссылка );
// Установить отбор по очередному зарегистрированному документу // в наборе записей. НаборЗаписейРегистрации.Отбор.Регистратор.Установить(Выборка.Регистратор);
Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать();
// Записать пустой набор записей с замещением исходного. НаборЗаписейРегистрации.Записать();
// Добавить новые записи регистрации и заполнить их. Пока Выборка.Следующий() Цикл НоваяЗапись = НаборЗаписейРегистрации.Добавить(); НоваяЗапись.Номенклатура = Выборка.Номенклатура; НоваяЗапись.Период = Дата; КонецЦикла; КонецПроцедуры
Краткий комментарий: у элемента коллекции наборов записей регистрации документов в последовательности, соответствующей последовательности ПартионныйУчет, сначала очищаются все записи. Далее запросом получаются все номенклатурные позиции, входящие в табличную часть Товары текущего документа и не являющиеся услугами. В цикле перебора выборки из результата запроса добавляются в набор новые записи регистрации данного документа в последовательности ПартионныйУчет. Обратите внимание: в данном примере из-за того, что объект НаборЗаписейРегистрации был получен посредством свойства Том 1
КонецЦикла;
КонецПроцедуры
Как видно из примера, для чтения данных таблиц регистрации документов в последовательностях можно применять запросы. Кроме того, у разработчика есть возможность проверить, принадлежит ли данный документ последовательности, и посредством метода Принадлежит() объекта ПоследовательностьМенеджер.. Например, нужно проверить принадлежность документа последовательности ПартионныйУчет (листинг 10.22). Листинг 10.22. Проверка принадлежности документа последовательности
ФлагПринадлежности = Последовательности.ПартионныйУчет. Принадлежит(СсылкаНаПроверяемыйДокумент);
539
Глава 10. Документы и последовательности Или, например, проверить, принадлежит ли данный документ последовательности по конкретному значению измерения Номенклатура (листинг 10.23). Листинг 10.23. Проверка принадлежности последовательности
// Подготовить структуры отбора по значениям измерений последовательности. ОтборПоИзмерениям = Новый Структура; ОтборПоИзмерениям.Вставить("Номенклатура", СсылкаНаТовар); // Проверить принадлежность к последовательности в отношении нужного значения измерения. ФлагПринадлежности = Последовательности.ПартионныйУчет. Принадлежит(СсылкаНаДокумент, ОтборПоИзмерениям);
В приведенном примере, если документ зарегистрирован в данной последовательности по нужному значению измерения, переменная ФлагПринадлежности получит булево значение Истина; если нет – Ложь. В общем случае при формировании записей набора записей регистрации документов в последовательности поле Период может заполняться произвольным значением. То есть момент времени самого документа и момент времени регистрации документа в последовательности могут отличаться. Также в общем случае может отличаться от даты документа и значение поля Период записей движений по регистрам. Это может понадобиться для реализации какой-нибудь особой логики. Например, для решения задач сложного многоитерационного планирования, когда в течение месяца могут вводиться, дополняться, частично отменяться планы, касающиеся как текущего месяца, так и следующего. Поэтому движения по регистру могут регистрироваться и на момент времени документа, и на начало текущего месяца, и на начало следующего. Вероятные коллизии устраняются посредством использования объекта Последовательность. И поскольку документы планирования имеют разные приоритеты для разрешения коллизий планирования, регистрироваться в последовательности они могут не только на момент времени документа (рис. 10.84).
Рис. 10.84. Пример использования нестандартной регистрации документов в последовательности
540
Кроме того, для некоторых задач может оказаться полезным, что документ в разных последовательностях может регистрироваться на разные моменты времени, или в одних последовательностях регистрироваться, а в других – нет. Например, при раздельной работе с последовательностями ПартионныйУчет и Торговля.
Перемещение границы последовательности назад Перенос границы последовательности выполняется при записи набора записей регистров. Сам процесс автоматического перемещения границы последовательности назад (сбивание границы) состоит из следующих операций (рис. 10.85): ■■ проверка того, что граница последовательности больше момента времени записи регистра; ■■ перемещение границы последовательности на момент времени записи регистра.
Рис. 10.85. Автоматическое сбивание границы последовательности
На уровне таблиц базы данных результатом перемещения границы последовательности назад является модификация записей в таблице границ последовательностей. То есть запись с ключом, соответствующим нужной комбинации значений измерений, заменяется на запись с тем же ключом, но со значениями полей Период и Регистратор, соответствующими моменту регистрации в последовательности документа, которому подчинены измененные записи регистра. Важно понимать, что границу последовательности перемещают назад не документы, а движения регистров. Сделано это потому, что модификация (а также добавление или удаление) записей регистра не обязательно может быть связана с проведением или удалением документа. В платформе есть средства, позволяющие просто «приписывать» движения к документам, не используя объекты документов. Профессиональная разработка в системе «1С:Предприятие 8»
Последовательности документов Например, возможна следующая ситуация: граница последовательности Планирование установлена на дату: 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. Измерений у последовательности нет. В результате этого действия граница последовательности будет перемещена назад при записи записей регистра именно на момент времени добавленных записей (рис. 10.86).
Также есть средства для получения данных таблицы границ последовательности. Данные о значениях границ последовательности можно получить запросом или с помощью методов ПолучитьГраницы() и ПолучитьГраницу() объекта ПоследовательностьМенеджер.. Например, получение таблицы текущих границ последовательностей может выглядеть следующим образом (листинг 10.25). Листинг 10.25. Пример получения границ последовательности
ТаблицаГраницПоследовательности = Последовательности.ПартионныйУчет.ПолучитьГраницы("Номенклатура");
Для использования метода ПолучитьГраницы() обязательно указание названий измерений (через запятую), которые будут разрезами в таблице границ. Кроме того, можно использовать второй параметр метода, указав там структуру отбора по значениям измерений. Результатом вышеприведенного примера будет таблица значений, включающая в себя колонки со значениями измерений (в данном случае Номенклатура) и колонку МоментВремени, в которой будут содержаться моменты времени границ последовательностей по хранящимся в последовательности комбинациям значений измерений. Кроме того, можно получать первую на временной оси границу последовательности для ситуации последовательности с измерениями (рис. 10.87). Реализуется это следующим образом (листинг 10.26). Рис. 10.86. Пример автоматического сбивания границы последовательности
То есть для перемещения назад границы последовательности ни дата документа, ни дата регистрации документа в последовательности значения не имеют. Но перенос (установка) границы последовательности программными средствами доступен разработчику на произвольный момент времени. Например, если требуется установить границу последовательности ПартионныйУчет на момент времени, состоящий из значений переменных ДатаУстановки, ДокументУстановки по значению измерения Номенклатура, содержащемуся в переменной НоменклатураУстановки (листинг 10.24). Листинг 10.24. Перенос границы последовательности на произвольный момент времени
Рис. 10.87. Пример границ последовательности «ПартионныйУчет»
// Подготовить параметры установки границы последовательности: // Момент времени установки. МоментУстановки = Новый МоментВремени(ДатаУстановки, ДокументУстановки);
Листинг 10.26. Получение минимальной границы последовательности
// Подготовить структуру отбора по значениям измерений последовательности. ОтборПоИзмерениям = Новый Структура; ОтборПоИзмерениям.Вставить("Номенклатура", НоменклатураУстановки);
В заключение хотелось бы еще раз обратить внимание на то, что в случае наличия измерений в последовательности перемещение границы последовательности назад происходит только для тех комбинаций значений измерений, которые уже присутствуют в таблице границ последовательности.
// Установить границы последовательности "Партионный учет". Последовательности.ПартионныйУчет.УстановитьГраницу(МоментУстановки, ОтборПоИзмерениям);
Том 1
ТекущаяГраницаПоследовательности = Последовательности.ПартионныйУчет.ПолучитьГраницу();
541
Глава 10. Документы и последовательности То есть если в рассмотренном выше примере, где существуют границы последовательности по номенклатурным позициям Самовар, Утюг, Холодильник, сформировать в регистре задним числом записи с другими номенклатурными позициями (не записывая документ), то граница последовательности ПартионныйУчет перемещаться назад не будет.
щими моменту регистрации в последовательности документа, проведение которого привело к восстановлению последовательности.
Восстановление последовательности
Сделано это по следующей причине: проведение документа – это сложный процесс, включающий в себя удаление предыдущих движений, установку признака проведенности, запись документа, запись движений документа и т. д., вплоть до «подтягивания» границы последовательности. Если разработчик отказался от этого процесса и просто формирует новые записи в регистре для некоего документа-регистратора (даже если тот является следующим после момента времени границы последовательности), то говорить о том, что с прикладной точки зрения последовательность восстановлена, слишком оптимистично и в принципе неверно. Например, нет никакой уверенности, что при перепроведении такого документа не возникнет коллизий.
Процесс переноса границы последовательности вперед называется восстановление последовательности. Необходимым условием автоматического восстановления последовательности является установка значения Перемещать свойству Перемещение границы при проведении последовательности как объекта конфигурации. Сам процесс автоматического восстановления последовательности выполняется только при проведении документа и состоит из следующих операций (рис. 10.88): ■■ проверка того, что момент регистрации документа больше, чем граница последовательности; ■■ проверка того, что в последовательности нет других проведенных документов в интервале между границей последовательности и моментом регистрации документа; ■■ установка границы последовательности на момент регистрации документа.
Автоматическое перемещение границы последовательности вперед происходит только при проведении документа. Не важно – нового или уже ранее проведенного, лишь бы соблюдались все условия алгоритма. Главное, что восстановление происходит именно при записи с проведением.
Но если такая уверенность есть или она обеспечена соответствующим комплексом мероприятий, предусмотренным разработчиком, то при необходимости для реализации неавтоматического переноса границы последовательности (назад или вперед) можно использовать программные средства – метод УстановитьГраницу() объекта ПоследовательностьМенеджер.. Использование механизма восстановления последовательности в прикладном смысле может быть разносторонним. При последовательном проведении всех документов, входящих в последовательность, начиная с момента границы последовательности, последовательность восстанавливается. И наоборот, при восстановлении последовательности перепроводятся проведенные документы, входящие в последовательность, но находящиеся за границей последовательности. Здесь хотелось бы отметить ряд особенностей.
Рис. 10.88. Автоматическое восстановление границы последовательности
На уровне таблиц базы данных результатом восстановления границы последовательности является модификация записей в таблице границ последовательностей. То есть запись с ключом, соответствующим нужной комбинации значений измерений, заменяется на запись с тем же ключом, но со значениями полей Период и Регистратор, соответствую-
542
Во-первых, хотя автоматическая регистрация документов в последовательности происходит при записи документа (при любой записи документа, не обязательно при проведении), при восстановлении последовательности производится перепроведение только проведенных документов. То есть только тех документов, у которых стоит признак проведения (рис. 10.89). Во-вторых, перепроводиться будут документы в хронологии, определяемой моментами регистрации документов в последовательности, а не моментами времени самих документов. Это может оказаться существенным, если документы регистрируются в последовательности на отличные от своих моменты времени (рис. 10.90). Профессиональная разработка в системе «1С:Предприятие 8»
Последовательности документов В последнем случае последовательность можно восстановить в целом, можно даже без указания по какой момент времени (листинг 10.27), а можно и в пределах указанных комбинаций измерений последовательности. Листинг 10.27. Пример использования метода «Восстановить()»
Последовательности.ПартионныйУчет.Восстановить(); Рис. 10.89. Проведение документов при восстановлении последовательности
Например, необходимо восстановить последовательность документов ПартионныйУчет по момент времени документа из переменной СсылкаНаДокумент по значению измерения Номенклатура, хранящемуся в переменной Товар. Вариант выполнения такого действия представлен в листинге 10.28. Листинг 10.28. Пример восстановления границы последовательности
// Сформировать момент времени, по который будет восстанавливаться последовательность. МоментВосстановленияПо = Новый МоментВремени(СсылкаНаДокумент.Дата, СсылкаНаДокумент); Рис. 10.90. Порядок проведения документов при восстановлении последовательности
В-третьих, если в составе последовательности есть измерения, а восстановление последовательности проводится общее (без разрезов по измерениям), то порядок перепроведения документов, которые нужно перепровести, опять же однозначно определяется хронологией регистрации документов в последовательности. Сам процесс восстановления последовательности документов по определенную дату может быть инициирован: ■■ посредством системной команды Проведение документов (рис. 10.91); ■■ программно, с помощью метода Восстановить() объекта ПоследовательностьМенеджер..
// Сформировать таблицу отбора. ТаблицаКомбинацийИзмерений = Новый ТаблицаЗначений; // Добавить колонки с именами, соответствующими // именам измерений последовательности. ТаблицаКомбинацийИзмерений.Колонки.Добавить("Номенклатура"); // Добавить строку(и) со значением(ями) отбора. СтрокаТаблицы = ТаблицаКомбинацийИзмерений.Добавить(); СтрокаТаблицы.Номенклатура = СсылкаНаТовар; // Восстановить последовательность. Последовательности.ПартионныйУчет.Восстановить(МоментВосстановленияПо, ТаблицаКомбинацийИзмерений);
Параллельный ввод документов, участвующих в последовательности Как было описано выше, в базе данных информация последовательностей документов хранится в двух таблицах: ■■ таблице записей регистрации документов в последовательности, ■■ таблице границ последовательностей.
Рис. 10.91. Команда восстановления последовательностей
В первом случае есть возможность прервать интерактивный процесс восстановления последовательности путем нажатия комбинации клавиш Ctrl + Break. Том 1
Выполнение различных действий с последовательностью в клиентсерверном варианте использования программы порождает блокирование этих таблиц в различных диапазонах: ■■ при регистрации документа в последовательности происходит добавление или модификация набора записей таблицы регистрации документов в последовательности, подчиненного регистратору.
543
Глава 10. Документы и последовательности Поэтому заблокированным оказывается как минимум диапазон записей, соответствующих одному регистратору (плюс две граничные записи «вокруг» этого диапазона); ■■ при перемещении границы последовательности назад происходит модификация записей границ по соответствующим комбинациям значений измерений. Поэтому блокируются записи таблицы границ последовательности, соответствующие данным комбинациям значений измерений. А если измерений в последовательности нет, то вся таблица целиком; ■■ при перемещении границы последовательности вперед. Этот процесс происходит только при проведении документа, поэтому блокируются обе таблицы. Таблица регистрации документов в последовательности оказывается заблокированной в диапазоне от границы последовательности по момент времени регистрации проводимого документа в последовательности. То есть заблокированными могут оказаться записи, подчиненные документам не проведенным, но зарегистрированным в последовательности в указанном интервале. Таблица границ последовательностей будет заблокирована целиком. Если у последовательности есть измерения, то вышеописанные блокировки при данном действии будут касаться только записей с комбинациями значений измерений, совпадающими со значениями измерений записей регистрации; ■■ в файловом варианте работы системы в любом случае происходит блокировка таблиц целиком. Согласно данному описанию механизма блокировок видно, что узким местом обеспечения параллельности ввода и проведения документов
544
для клиент-серверного варианта работы системы являются действия, связанные с автоматическим перемещением границы последовательности. То есть если документ зарегистрирован в последовательности, то при его проведении система может предпринять попытку автоматического перемещения границы последовательности на момент регистрации данного документа. Это приведет к блокировке таблицы границ последовательности целиком или в диапазоне соответствующей комбинации значений измерений последовательности. Параллельно проводимый документ, входящий в ту же последовательность, при попытке заблокировать те же записи или таблицу не сможет этого сделать. В результате вместо параллельного проведения для таких документов получим последовательное. Одним из вариантов выхода из ситуации является отключение автоматического перемещения границы последовательности при проведении документов. Для этого свойству Перемещение границы при проведении последовательности как объекта конфигурации устанавливается значение Не перемещать. В этом случае при проведении документа, даже если он регистрируется в последовательности, система не предпринимает попытки перемещения границы (границ) последовательности. А блокировки, возникающие при регистрации разных документов в последовательности, не мешают друг другу. То есть тогда работа с объектом Последовательность не препятствует параллельному проведению документов. Необходимо лишь не забыть позже реализовывать перемещение границы последовательности, например, служебной обработкой.
Профессиональная разработка в системе «1С:Предприятие 8»
Оперативный учет. Описание задач, решаемых регистрами накопления
Глава 11. Учет движения средств Оперативный учет. Описание задач, решаемых регистрами накопления Практически все теории, тем или иным образом связанные с технологиями учета, управления, принятия решений и т. д., базируются на понятии «показатель». Показатель – данные, по которым можно судить о развитии, ходе, состоянии чего-нибудь. Оперативный учет – учет, позволяющий максимально быстро получать информацию о значениях показателей, учитываемых в автоматизируемой системе. Платформа системы «1С:Предприятие» предлагает удобное для учета показателей средство – регистры. Посредством их использования обеспечиваются необходимое быстродействие, функциональная гибкость и простота решения этих информационных задач. Как правило, информационные модели при этом включают не только одни регистры. Обычно используется следующая схема (рис. 11.1): ■■ документами регистрируются события, приводящие к изменению значений показателей; ■■ сами значения показателей хранятся в регистрах; ■■ посредством отчетов пользователи получают информацию о состоянии показателей и проводят ее анализ.
Какие же именно показатели используются при решении задач учета движения средств? И какие регистры нужно для них использовать? При автоматизации учета движения средств чаще приходится сталкиваться с ситуацией, когда в момент регистрации изменений показателя фиксируется не конечное итоговое значение показателя, а его приращение. Например, при регистрации поступления товаров на склад – количество поступивших товаров, а не находящихся в остатке; при регистрации выдачи денег подотчетнику фиксируется выданная сумма, а не оставшаяся в кассе, и тому подобное. А вот при получении данных из системы учета уже требуются накопленные (итоговые) значения показателей. Такие показатели называют показателями накопления. Для решения задачи учета показателей накопления «1С:Предприятие» используются регистры накопления.
в
системе
накопления – объект конфигурации, предназначенный для хранения итоговых (накопленных) значений показателей и хранения движений (приращений) показателей. Помимо итоговых значений показателей, регистр может хранить и промежуточные итоги, рассчитанные для указанных периодов. Регистр
Информация о приращениях показателей (заметьте, они могут быть как положительными, так и отрицательными) вносится в регистр накопления только посредством движений, то есть посредством наборов записей регистра, подчиненных документу-регистратору. Этим обеспечивается обоснованность регистрации изменений показателей – регистрацией событий, приводящих к этим изменениям. Упрощенно можно сравнить регистр накопления с неким «черным ящиком», «на вход» которого подаются значения приращений, а «на выходе» можно получить накопленные значения приращений (рис. 11.2). Как можно заметить из приведенного рисунка, показатели накопления имеют различный прикладной смысл. Различают следующие виды накапливаемых показателей: ■■ показатели остатков, ■■ оборотные показатели.
Рис. 11.1. Общая схема оперативного учета
Том 1
Итоги показателей остатков отражают значения учитываемых показателей на некоторый момент времени.
545
Глава 11. Учет движения средств
Рис. 11.4. Пример влияния изменений в прошлых периодах на показатели остатков
Рис. 11.2. Упрощенная схема регистра накопления
Итоги оборотных показателей отражают значения совокупного изменения показателя за временной интервал между двумя моментами времени (период). Если эти изменения положительные или отрицательные, можно оперировать такими понятиями, как Приход и Расход (рис. 11.3).
Рис. 11.3. Различные виды накапливаемых показателей
Таким образом, можно сказать, что показатели остатка и оборотные показатели характеризуют один и тот же процесс, но с разных сторон. Важно отметить, что показатели остатка имеют абсолютные итоги относительно момента начала ведения учета. При этом изменения в приращениях (движениях) любых прошлых периодов влияют на текущее значение итога. Рассмотрим пример, приведенный на рис. 11.4.
546
Изменения показателя Деньги в кассе фиксируются посредством документов Приходный кассовый ордер (ПКО) и Расходный кассовый ордер (РКО). Оформление поступления денег в январе повлияет на остатки, как на начало февраля, так и начало марта и т. д. В противоположность рассмотренному примеру итоги оборотных показателей за разные периоды независимы. Рассмотрим пример на рис. 11.5.
Рис. 11.5. Отсутствие влияния изменений в прошлых периодах на оборотные показатели
Изменения показателя Сумма проданного регистрируются посредством документа Расходная накладная (Рнк). Введенные изменения в объемах продаж января будут касаться только января, но никак не коснутся февральских объемов продаж. Для гибкого и эффективного решения задач прикладной области система «1С:Предприятие» позволяет использовать два вида регистров накопления. Профессиональная разработка в системе «1С:Предприятие 8»
Структура регистра накопления Регистры накопления остатков позволяют получать итоговые значения показателей остатков и, кроме того (суммируя приращения этих показателей за периоды), позволяют получать обороты. Например, при решении задачи учета товаров на складах может понадобиться как значение остатка товаров на момент времени, так и оборот поступлений или расходов товара за периоды времени. Если же для некоторых сущностей накопление остатков смысла не имеет и требуется накапливать только обороты, тогда следует использовать оборотные регистры накопления. Например, учет оборотов продаж компании. О продажах всегда можно говорить только в отношении временного периода. ВНИМАНИЕ!
Перечисленные виды регистров накопления не являются в общем случае взаимозаменяющими. Каждый из них предназначен для решения своего собственного круга прикладных задач. Например, для решения задач, связанных с учетом только оборотных показателей, не следует использовать регистры остатков и, наоборот, не следует пытаться вести учет показателей остатков на оборотных регистрах. Подобные попытки могут привести как минимум к неоправданному снижению быстродействия прикладного решения или вообще к некорректности данных учета.
Ресурсы используются для хранения информации как о приращениях, так и о самих значениях показателей. По сути, каждый ресурс хранит данные одного показателя. Однако регистры могут быть не только одномерными. Например, для решения задачи учета количества товаров нерационально оперировать большим количеством ресурсов (показателей) типа КоличествоХолодильников, КоличествоПылесосов, КоличествоПультовVH и т. д. Лучше использовать один ресурс (показатель) Количество, но ввести разрез учета – ПоНоменклатурнымПозициям. В регистрах накопления разрезы учета реализуются с помощью измерений. В состав регистра можно включить более одного измерения, поэтому в общем случае регистр накопления можно представить как n-мерную систему разрезов учета (измерений), в узлах которой хранятся совокупные данные ресурсов (итоги), рис. 11.7.
Структура регистра накопления В состав регистра накопления как объекта конфигурации входят измерения, ресурсы и реквизиты (рис. 11.6).
Рис. 11.7. Многомерная модель регистра накопления
На представленной схеме – двумерная модель хранимой в регистре информации по итогам. Разрезы учета (измерения) – Номенклатура и Склад. Узлами пересечений этих разрезов учета будут все возможные комбинации значений номенклатурных позиций на складах. Итог показателя Количество в каждом узле пересечения отражает данные: сколько (в количественном выражении) конкретной номенклатуры находится на конкретном складе. Данные этой графической двумерной модели можно представить в виде табличной модели (табл. 11.1). Таблица 11.1. Табличное представление данных регистра
Рис. 11.6. Состав регистра накопления
Том 1
Номенклатура
Склад
Количество
Барометр G5 Барометр G5 Пульт VH Станция G121
Главный Фили-2 Фили-2 Главный
30 15 11 5
547
Глава 11. Учет движения средств Каждая строка содержит значение итога ресурса Количество для конкретной комбинации значений разрезов учета Номенклатура и Склад. Из достоинств табличной модели сейчас хотелось бы отметить универсальность. Если графическое отображение более чем трехмерного пространства тяжело или вообще невозможно для человеческого восприятия, то табличная модель в принципе не ограничивает количество разрезов учета. Впоследствии будет рассмотрено, что хранение итогов регистров в базе данных основано именно на использовании табличной модели. Реквизиты – дополнительные характеристики движений, то есть первичных записей регистра. Реквизиты не влияют на итоги, хранимые в регистре. На вышеприведенной схеме, отражающей итоги, нет места реквизитам. Однако реквизиты могут быть использованы при решении задач анализа выполненных движений. То есть таких задач, в которых работа идет только с приращениями показателей, безотносительно их итоговых значений. Например, если при формировании движений регистра ТоварыНаСкладах заполнять соответствующие значения: поступление, реализация в розницу, реализация оптом, списание, перемещение и т. д. для реквизита ВидОперации, то впоследствии можно будет анализировать, какая из операций производится чаще других, какая реже; какие операции не выполняли в течение последнего квартала и т. п. Итак, в отношении задач, решаемых регистрами накопления, структура регистра как объекта конфигурации позволяет вести многомерный учет как приращений, так и итогов показателей накопления, с возможностью при необходимости использования дополнительных характеристик движений. Для обеспечения данных возможностей предусмотрена соответствующая структура таблиц базы данных и порядок работ с ними. Данные каждого регистра накопления хранятся в базе данных в двух таблицах: ■■ таблица движений регистра накопления, ■■ таблица итогов регистра накопления. Существует два вида регистров накопления, и каждый предназначен для ведения учета показателей своего вида (остатков или оборотов). И, как разбирали выше, задачи учета показателей этих видов различны. Поэтому структура таблиц базы данных для регистров накопления разных видов тоже отличается. Она оптимизирована под решение соответствующих задач. Для регистра накопления остатков состав колонок таблицы движений следующий: ■■ Период – дата записи. Совместно с полями Регистратор и НомерСтроки определяет положение данной записи на временной оси;
548
■■ Регистратор – ссылка на документ, которому подчинена данная запись; ■■ НомерСтроки – уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор; ■■ ВидДвижения – значение системного перечисления ВидДвиженияНакопления, обозначающее направление приращения указанных в записи ресурсов на итоги по этим ресурсам (Приход или Расход); ■■ Активность – тип Булево. Содержит признак влияния записи на итоги регистра; ■■ – значение измерения. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации; ■■ – значение ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации; ■■ – значение реквизита. Количество таких полей равно количеству реквизитов, определенных в данных регистра как объекта конфигурации. Таблица движений регистра хранит данные о выполненных по регистру движениях. Таблица итогов регистра накопления остатков хранит текущие итоги на момент времени последнего движения (актуальные итоги). Дополнительно к этому могут храниться промежуточные итоги, если установлен период рассчитанных итогов. Период рассчитанных итогов влияет только на производительность при получении итогов на некоторую промежуточную дату; если он установлен, итоги будут получены быстрее. Структура таблицы итогов регистра накопления остатков следующая: ■■ Период – дата, на которую актуально состояние хранимого в таблице итога; ■■ – значение измерения – разреза учета хранимых итогов. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации; ■■ – значение итога ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации; ■■ Разделитель – поле, позволяющее распараллелить обновление записей итогов. Добавляется в структуру таблицы итогов для регистров накопления, у которых установлено свойство Разрешить разделение итогов. Пример заполнения таблицы движений регистра накопления остатков приведен в табл. 11.2. Для вышеприведенного примера заполнения таблицы движений регистра таблица итогов регистра после расчета итогов по 31.05.2010 будет выглядеть так, как показано в табл. 11.3. Профессиональная разработка в системе «1С:Предприятие 8»
Структура регистра накопления
Истина Пульт VH
Главный 1
10
1
Приход
Истина Пульт VH
Главный 9
90
2
Приход
Истина Пульт PW
Главный 7
490
1
Приход
Ложь
Фили-2
5
60
1
Расход
Истина Пульт VH
Главный 8
80
1
Приход
Истина Пульт PW
Фили-2
1
17
1
Приход
Истина Пульт VH
Фили-2
1
18
Склад
Пульт VH
Сумма
Приход
Количество
1
Номенклатура
Активность
Поступление товаров № 1 13.05.2010 15:00:00 Поступление товаров № 2 13.05.2010 15:00:01 Поступление товаров № 2 13.05.2010 15:00:01 Поступление товаров № 3 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 Поступление товаров № 4 31.05.2010 23:59:59 Поступление товаров № 5 01.06.2010 00:00:00
Вид движения
Регистратор
03.04.2010 15:00:00 13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 23:59:59 01.06.2010 00:00:00
Номер строки
Период
Таблица 11.2. Пример заполнения таблицы движений регистра накопления остатков
Таблица 11.3. Пример заполнения таблицы итогов регистра накопления остатков Период
Итоги апреля 2010 года
Итоги мая 2010 года (граница рассчитанных итогов)
Текущие итоги
01.05.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00
Номенклатура Склад
Количество Сумма
Пульт VH
Главный 1
10
Пульт VH
Главный 2
20
Пульт PW
Главный 7
490
Пульт PW
Фили-2
1
17
Пульт VH
Фили-2
1
18
Пульт VH
Главный 2
20
Пульт PW
Главный 7
490
Пульт PW
Фили-2
17
1
Обратите внимание: данные таблицы итогов содержат значения итогов ресурсов для всех возможных комбинаций значений измерений. Исключения составляют итоги, если для данной комбинации значений измерений значения всех ресурсов равны нулю. Такие записи в таблице итогов не хранятся за ненадобностью, потому что с прикладной точки зрения ситуация «нет итогов по данной комбинации значений измерений» равносильна ситуации «по данной комбинации значений измерений все итоги равны нулю». Том 1
В разделе «Получение данных из регистров накопления» на стр. 568 рассматривается, как при решении задач получения данных о значениях показателей (ресурсов) система может оптимальным с точки зрения быстродействия способом обращаться к данным как таблицы движений, так и таблицы итогов регистра. Структура таблиц оборотного регистра накопления, хранимых в базе данных, схожа. Отличие заключается только в том, что для оборотных регистров не существует понятия вид движения и понятия текущие итоги. Состав колонок таблицы движений оборотного регистра накопления следующий: ■■ Период – дата записи. Совместно с полями Регистратор и НомерСтроки определяет положение данной записи на временной оси; ■■ Регистратор – ссылка на документ, которому подчинена данная запись; ■■ НомерСтроки – уникальный номер данной записи в наборе записей регистра, подчиненных документу, указанному в поле Регистратор; ■■ Активность – тип Булево. Содержит признак влияния записи на итоги регистра; ■■ – значение измерения. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации; ■■ – значение ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации; ■■ – значение реквизита. Количество таких полей равно количеству реквизитов, определенных в данных регистра как объекта конфигурации. Структура таблицы итогов оборотного регистра накопления тоже схожа: ■■ Период – период (месяц), за который накоплен оборот итогов ресурсов; ■■ – значение измерения – разреза учета хранимых итогов. Количество таких полей равно количеству измерений, определенных в данных регистра как объекта конфигурации, у которых установлено свойство Использование в итогах; ■■ – значение итога оборота ресурса. Количество таких полей равно количеству ресурсов, определенных в данных регистра как объекта конфигурации; ■■ Разделитель – поле, позволяющее распараллелить обновление записей итогов. Добавляется в структуру таблицы итогов для регистров накопления, у которых установлено свойство Разрешить разделение итогов. Но вот сами данные, хранимые в таблице итогов, и механизмы их использования коренным образом отличаются от регистра остатков. Для оборотного регистра в таблице итогов хранятся посчитанные суммарные обороты
549
Глава 11. Учет движения средств (итоги) ресурсов за каждый месяц, в рамках которого были зарегистрированы движения в данном регистре. Пример заполнения таблицы движений оборотного регистра накопления Продажи представлен в табл. 11.4.
Номенклатура
Контрагент
Количество
Сумма
Реализация № 1 27.05.2010 12:30:45 Реализация № 2 29.05.2010 15:00:01 Реализация № 3 13.06.2010 15:00:00 Реализация № 3 23.06.2010 10:00:00 Реализация № 4 23.06.2010 15:30:45 Реализация № 5 01.10.2010 08:59:59
Активность
Регистратор
27.05.2010 12:30:45 29.05.2010 15:00:01 13.06.2010 15:00:00 23.06.2010 10:00:00 23.06.2010 15:30:45 01.11.2010 08:59:59
Номер строки
Период
Таблица 11.4. Пример заполнения таблицы движений оборотного регистра накопления
1
Истина
Пульт VH
Ялта-Лтд
9
135
1
Истина
Пульт VH
10
150
1
Истина
Пульт VH
1
15
1
Истина
Пульт VH
1
15
1
Ложь
Пульт PW
Компания "Риона" Компания "Риона" Компания "Риона" Крона
1
90
1
Истина
Пульт PW
Ялта-Лтд
1
95
Для таблиц итогов создается следующий индекс:
Таблица 11.5. Пример заполнения таблицы итогов оборотного регистра накопления
Итоги мая 2010 года Итоги июня 2010 года Итоги ноября 2010 года
01.05.2010 00:00:00 01.05.2010 00:00:00 01.06.2010 00:00:00 01.11.2010 00:00:00
Номенклатура Контрагент
Количество
Сумма
Пульт VH
Ялта-Лтд
9
135
Пульт VH
Компания "Риона"
10
150
Пульт VH
Компания "Риона"
2
30
Пульт PW
Ялта-Лтд
1
95
В разделе «Получение данных из регистров накопления» на стр. 568 будет рассмотрено, в каких случаях и какими средствами достигается оптимальное быстродействие при получении данных оборотных регистров. Здесь же следует сказать, что как для регистров остатков, так и для оборотных регистров система «1С:Предприятие» индексирует таблицы движений и таблицы итогов. При этом для таблиц движений регистров создаются следующие индексы: ■■ Период + Регистратор + НомерСтроки;
550
■■ Период + Измерение1 + Измерение2 + … + ИзмерениеN + Разделитель – по всем измерениям регистра; ■■ Измерение + Период, если для измерения Измерение свойство Индексировать установлено в значение Индексировать. Использование индексов позволяет еще больше сократить время выполнения операций с данными регистра. Однако необходимо иметь в виду, что Microsoft SQL Server накладывает определенное ограничение на количество полей, входящих в составной индекс, – не более 16 полей в индексе. Поэтому работа с регистрами, имеющими очень большое количество измерений, может быть неэффективна по скорости из-за невозможности использования индексных таблиц. Подробнее
Для вышеприведенного примера заполнения таблицы движений таблица итогов регистра будет заполнена следующим образом (табл. 11.5).
Период
■■ Регистратор + НомерСтроки; ■■ Измерение + Период + Регистратор + НомерСтроки, если для измерения Измерение свойство Индексировать установлено в значение Индексировать; ■■ Реквизит + Период + Регистратор + НомерСтроки, если для реквизита Реквизит свойство Индексировать установлено в значение Индексировать.
Том 2, приложение «Хранение данных», раздел «Индексы таблиц базы данных».
Механизмы заполнения таблиц регистров накопления в базе данных Как было определено выше, данные каждого регистра накопления хранятся в двух таблицах базы данных: ■■ таблице движений регистра накопления, ■■ таблице итогов регистра накопления. В таблицу движений регистра записи могут вводиться пользователем вручную, генерироваться в процессе выполнения обработок либо при проведении документов. Подробнее
Раздел «Запись данных в таблицу движений регистра накопления», стр. 551.
При формировании данных таблицы итогов важно обеспечить их непротиворечивость данным таблицы движений. Чтобы, например, не получилось, что по данным таблицы движений за все время в кассу предприятия Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных пришло 100 рублей, ушло 50 рублей, но таблица итогов содержит данные об остатке 1 000 рублей. Поэтому заполнение таблицы итогов осуществляется системой согласно данным активных записей таблицы движений, при расчете итогов (автоматическом или инициированным специальными методами). Подробнее
Раздел «Механизмы заполнения таблицы итогов регистра накопления», стр. 563.
То есть пользователь или разработчик не могут непосредственно записывать данные в таблицу итогов регистра накопления, зато могут инициализировать действия системы, производящие расчет и заполнение итогов (рис. 11.8).
При необходимости разработчик может отключать или включать расчет итогов при записи движений. Это может понадобиться для того, чтобы повысить скорость записи набора записей регистра при массовых загрузках данных. Например, требуется загрузить массив информации по документам и их движениям (листинг 11.2). Листинг 11.2. Пример отключения использования итогов регистра накопления
// Отключить использование итогов регистра. РегистрыНакопления.ПартииТоваров.УстановитьИспользованиеИтогов(Ложь); Для Каждого Элемент из МассивИнформации Цикл
// Выполнить действия по загрузке документов (регистраторов) // и наборов записей регистра. // ...
// Записать загруженные наборы записей. // ...
КонецЦикла; // Включить использование итогов регистра // (одновременно выполнится пересчет итогов). РегистрыНакопления.ПартииТоваров.УстановитьИспользованиеИтогов(Истина);
В приведенном примере обеспечивается ситуация, когда заполнение таблицы итогов выполняется разово, а не при каждой записи набора записей загружаемых документов. Дело в том, что при включении использования итогов система производит пересчет всех итогов с момента самого раннего движения, сделанного после отключения активности итогов. Рис. 11.8. Заполнение таблицы итогов регистра накопления
Если признак расчета итогов регистра включен, то расчет и заполнение данными таблицы итогов регистра производятся автоматически при записи набора записей. Проверить значение признака расчета итогов можно с помощью метода ПолучитьИспользованиеИтогов() менеджера регистра накопления (листинг 11.1). Листинг 11.1. Пример использования метода «ПолучитьИспользованиеИтогов()»
ПризнакИспользованияИтогов = РегистрыНакопления.ПартииТоваров.ПолучитьИспользованиеИтогов();
Если ПризнакИспользованияИтогов Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Итоги по регистру 'ПартииТоваров' рассчитываются"; Сообщение.Сообщить(); КонецЕсли;
Том 1
В отношении использования подобных приемов необходимо понимать, что при отключенном расчете итогов регистра система не может обеспечить непротиворечивость данных таблиц движений и итогов регистра. Поэтому попытки обращений к итогам такого регистра будут отклоняться системой с выдачей соответствующих предупреждений об этом.
Запись данных в таблицу движений регистра накопления Для понимания работы механизмов формирования или модификации записей в таблице движений регистра накопления необходимо, прежде всего, исходить из положения о том, что все записи в регистрах уникальны с точки зрения комбинации значений в ключевых полях. Регистры накопления не поддерживают независимого формирования записей без использования документа-регистратора. Этим достигается обоснованность информации регистров – данными документов.
551
Глава 11. Учет движения средств То есть обоснованность информации объектов, осуществляющих учет показателей, данными объектов, осуществляющих первичную регистрацию событий, приводящих к изменению значений показателей. С другой стороны, к одному регистратору может быть отнесено более одной записи движения. Поэтому для регистров накопления в таблице движений ключевыми являются поля Регистратор и НомерСтроки (рис. 11.9).
Соответственно, для заполнения или модификации данных таблицы движений есть две возможности: ■■ посредством создания набора записей регистра с обязательным отбором по регистратору; ■■ посредством использования свойства объекта документа Движения, представляющего собой коллекцию наборов записей, подчиненных данному регистратору. ПРИМЕЧАНИЕ
Можно сказать, что свойство Движения объекта документа представляет собой определенный «сервис», призванный облегчить труд разработчика по созданию движений документа. В этом свойстве содержатся пустые наборы записей по всем регистрам, по которым документ может выполнять движения. Для этих наборов записей уже установлен отбор по регистратору, соответствующему текущему документу.
Сами же действия по записи могут инициироваться как программно (при выполнении обработок), так и интерактивно. Примеры подобных действий приводятся ниже.
Свойство «Движения» объекта документа Рис. 11.9. Набор записей регистра накопления
Для обеспечения манипулирования записями регистра при формировании или модифицировании движений используется объект встроенного языка системы РегистрНакопленияНаборЗаписей.. В отношении регистров накопления эти действия выполняются при использовании обязательного отбора по регистратору. То есть запись модифицированных данных в таблицу движений регистра накопления не может выполняться отдельно для каждого движения, а только «блоками», то есть наборами записей, подчиненных одному регистратору.
Свойство Движения – это свойство объекта документа (ДокументОбъект.). Состав наборов записей, входящих в эту коллекцию, определяется системой исходя из информации, хранящейся в конфигурации. Модификация этого состава может осуществляться при работе с документом как с объектом конфигурации (рис. 11.10).
Поле НомерСтроки система заполняет автоматически, при добавлении или вставке новой записи в набор записей, отобранных по первому ключевому полю Регистратор. Поле НомерСтроки содержит порядковый номер записи в наборе записей, подчиненных одному регистратору. Кроме того, в регистре накопления не могут существовать записи с пустым значением поля Регистратор, то есть не подчиненные ни одному регистратору или «подчиненные пустому регистратору». Это противоречило бы принципу «обоснованности данных регистра накопления». Таким образом, в отношении движений регистров накопления можно констатировать строгую связь с двумя классами объектов конфигурации: ■■ с регистрами как «хранителями» движений, ■■ с документами как с «обоснованием» формирования и наличия движений.
552
Рис. 11.10. Регистры, для которых документ является регистратором
Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных Кроме этого, состав наборов записей, создаваемых системой в свойстве Движения, может быть изменен при редактировании регистра как объекта конфигурации (рис. 11.11).
Важно понимать, что платформа во многих механизмах использует обращение к элементам коллекции Движения. Например, при удалении документа система будет для каждого регистра, в котором он может быть регистратором, проверять наличие движений документа с целью их удаления. Поэтому не рекомендуется включать в коллекцию Движения элементы «с запасом». И наоборот, если не указано, что документ может быть регистратором для некоего регистра, то система никоим образом не позволит записать в данный регистр движения данного документа.
Формирование наборов записей посредством свойства объекта документа «Движения» Формирование новых наборов записей включает в себя операции, состоящие: ■■ из добавления новых записей к набору записей, ■■ заполнения полей записей, ■■ записи набора записей.
Рис. 11.11. Документы, которые могут создавать движения в регистре
Благодаря использованию данного свойства облегчается работа разработчика, которому необходимо сформировать или модифицировать набор (наборы) записей регистра (регистров), подчиненных данному документу (рис. 11.12).
Например, требуется сформировать движения по регистру ТоварыНаСкладах на основании данных документа ПоступлениеТоваров. Причем информация для заполнения полей записей движений в основном находится в табличной части Состав документа. Данная операция в листинге 11.3.
может
быть
выполнена
так,
как
показано
Листинг 11.3. Пример формирования движений документа
// Укажем, что движения по данному регистру нужно записывать. Движения.ТоварыНаСкладах.Записывать = Истина; // Перебрать коллекцию строк табличной части документа. Для Каждого ТекСтрокаСостав Из Состав Цикл
// Добавить новую запись к набору записей регистра ТоварыНаСкладах. Движение = Движения.ТоварыНаСкладах.Добавить();
// Заполнить поля добавленной записи. Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСостав.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСостав.Количество; Движение.ВидОперации = ВидОперации;
КонецЦикла;
Рис. 11.12. Свойство «Движения» объекта документа
Том 1
Краткий комментарий: сначала указываются наборы записей, содержащие движения документа по регистрам, которые должны быть записаны при проведении документа.
553
Глава 11. Учет движения средств
10
Приход
Истина
Пульт PW
Главный
7
554
Вид движения
Активность
Номенклатура
Склад
Количество
Пульт PW
Главный
7
Приход
Истина
Шнур R-100 Главный
100
Вид движения
Активность
Номенклатура
Склад
Количество
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01
1
Приход
Истина
Пульт VH
Главный
10
2
Приход
Истина
Пульт PW
Главный
7
3
Приход
Истина
Пульт VH
Главный
10
4
Приход
Истина
Пульт PW
Главный
7
5
Приход
Истина
Шнур R-100 Главный
100
Если же запись набора записей будет выполняться с замещением (листинг 11.5), то старый набор записей будет замещен, и после выполнения операции регистр будет содержать записи, показанные в табл. 11.9. Листинг 11.5. Запись набора записей с замещением
Движения.ТоварыНаСкладах.Записать(Истина); // Альтернативный вариант вызова. Движения.ТоварыНаСкладах.Записать(); Таблица 11.9. Состав записей регистра накопления Регистратор
Движения.ТоварыНаСкладах.Записать(Ложь);
Номер строки
Регистратор
13.05.2010 15:00:01 13.05.2010 15:00:01 13.05.2010 15:00:01 13.05.2010 15:00:01 13.05.2010 15:00:01
Период
Листинг 11.4. Запись набора записей с добавлением
Истина
Таблица 11.8. Состав записей регистра накопления
Записывается новый набор записей (табл. 11.7). Тогда если при записи набора записей для параметра Замещать будет указано значение Ложь (листинг 11.4), то записи, существовавшие в регистре накопления, будут сохранены, и к ним будут добавлены новые записи из записываемого набора (табл. 11.8).
Приход
13.05.2010 15:00:01 13.05.2010 15:00:01 13.05.2010 15:00:01
ПоступлениеТоваров № 1 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 2 13.05.2010 15:00:01 ПоступлениеТоваров № 1 3 13.05.2010 15:00:01
Приход
Истина
Пульт VH
Главный 10
Приход
Истина
Пульт PW
Главный 7
Приход
Истина
Шнур R-100
Главный 100
Количество
Главный
10
Склад
Пульт VH
Главный
Номенклатура
Количество
Истина
Пульт VH
Активность
Склад
Приход
Истина
Вид движения
Номенклатура
ПоступлениеТоваров № 1 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 2 13.05.2010 15:00:01
Активность
Регистратор
13.05.2010 15:00:01 13.05.2010 15:00:01
Вид движения
Период
Номер строки
Таблица 11.6. Состав записей регистра накопления
Приход
Номер строки
Например, в регистре ТоварыНаСкладах присутствует набор записей, подчиненный регистратору ПоступлениеТоваров № 1 (табл. 11.6).
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01
Номер строки
Параметр Замещать может принимать значения типа Булево, по умолчанию – значение Истина. Действие данного параметра проявляется в случае, если на момент записи нового (или модифицированного) набора записей в регистре присутствуют еще записи, подчиненные данному же регистратору.
13.05.2010 15:00:01 13.05.2010 15:00:01 13.05.2010 15:00:01
Регистратор
Следует учитывать, что при автоматической записи движений они будут записаны с замещением, то есть старые движения документа будут замещены новыми. Если же при записи движений документа нужно добавлять новые движения к старым, то для этого нужно использовать параметр Замещать метода Записать() набора записей регистра накопления и явно записывать набор записей с параметром Замещать, установленным в значение Ложь.
Период
После выхода из обработки проведения те наборы записей, у которых свойство Записывать имеет значение Истина, будут автоматически записаны платформой. После этого свойство Записывать у этих наборов движений будет установлено в значение Ложь.
Таблица 11.7. Записываемый набор записей
Период
Формирование новых записей движений и их заполнение выполняются в цикле перебора строк табличной части документа. Для каждой строки добавляется новая запись к набору записей регистра ТоварыНаСкладах, полученному как элемент коллекции свойства Движения данного объекта документа. Поскольку метод Добавить() возвращает сам добавленный объект, новая запись получается в переменную Движение. Дальнейшее заполнение полей записи осуществляется посредством этой переменной.
Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных Данная возможность позволяет решать различные прикладные задачи, связанные: ■■ с добавлением новых движений к старым, ■■ замещением старых движений новыми. Хотелось бы отметить, что все вышеописанные действия по формированию движений типизированы, и большая часть кода посвящена заполнению полей регистра значениями полей документа. Поэтому для облегчения написания соответствующего кода разработчик может использовать конструктор движений документа (рис. 11.13).
Рис. 11.13. Конструктор движений документа
Программное изменение данных регистра можно использовать при проведении документа, а можно и без проведения. Поскольку заполнение учетных данных чаще всего выполняется во время операции проведения документа, то конструктор движений документа создает соответствующий код именно в рамках процедуры обработчика события ОбработкаПроведения.
Формирование движений при проведении документа Проведение документов чаще всего используется для формирования движений документов. Этому способствует удобство функциональных решений, заложенных в платформу. Например: ■■ С точки зрения платформы отдельного процесса «проведение» не существует. Есть запись документа с проведением, причем в рамках одной транзакции. Том 1
подробнее
Раздел «Запись документов», стр. 508.
Таким образом, в момент выполнения обработчика события ОбработкаПроведения документ уже записан. То есть разработчику не нужно беспокоиться о предотвращении попыток проведения незаписанных документов (рис. 11.14).
Рис. 11.14. Последовательность событий при записи документа с проведением
■■ Свойство Удаление движений документа как объекта конфигурации стандартно устанавливается платформой в значение Удалять автоматически при отмене проведения. Это значит, что при перепроведении документа движения, подчиненные данному документу, перезаписываются, а при отмене проведения движения документа автоматически удаляются. Если разработчик захочет реализовать нестандартный вариант проведения документа и установит свойство Удаление движений в значение Удалять автоматически, то при записи документа с проведением сначала будут удалены все старые движения документа. То есть на момент выполнения обработчика события ОбработкаПроведения в регистрах не будет наборов записей с движениями данного документа. ■■ При записи с проведением система автоматически запишет выбранные и незаписанные наборы записей, находящиеся в свойстве Движения. Это еще один «сервис», обеспечиваемый свойством Движения. Отсюда следуют два важных вывода. Во-первых, если наборы записей необходимо записывать с добавлением, то это нужно выполнять в явном
555
Глава 11. Учет движения средств виде, т. к. при автоматической записи движений они будут записаны с замещением. Во-вторых, последовательность обращения к регистрам при автоматической записи движений будет одна и та же для разных документов. Это позволяет снизить вероятность взаимных блокировок при проведении документа в конкурентных режимах работы. В случаях, если необходимо программно вызвать саму обработку проведения, инициируется запись документа с проведением. Пример программного вызова проведения документа в оперативном режиме приведен в листинге 11.6. Листинг 11.6. Пример программного вызова проведения документа
Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный); Подробнее
В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, в обработке ДействияСДвижениямиРегистраНакопления приводится пример перепроведения документов РеализацияТоваров в интервале с ДатаНачала по ДатаОкончания.
Рассмотрим этот пример (листинг 11.7).
Говоря о записи документа, необходимо отдельно упомянуть случай, когда документ записывается с проведением в форме самого документа. Запись в форме позволяет использовать функциональность, определяемую расширением формы документа: установка даты документа, установка режима проведения, запрет определенных действий пользователя и т. д. подробнее
Раздел «Особенности работы формы документа», стр. 520.
В качестве примера записи в форме в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компактдиске, в командную панель формы документа РеализацияТоваров добавлена кнопка Провести неоперативно. Действия, выполняемые по нажатии этой кнопки, представлены в листингах 11.8, 11.9. Листинг 11.8. Обработчик события нажатия кнопки «Провести неоперативно»
&НаКлиенте Процедура ПровестиНеоперативно(Команда) ПровестиНеоперативноНаСервере(); КонецПроцедуры
Листинг 11.7. Пример перепроведения документов «РеализацияТоваров»
// Получить ссылки на проведенные документы в требуемом интервале. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваров.Ссылка |ИЗ | Документ.РеализацияТоваров КАК РеализацияТоваров |ГДЕ | РеализацияТоваров.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания | И РеализацияТоваров.Проведен"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Результат = Запрос.Выполнить(); // Перебрать ссылки полученных документов. Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // Перепровести каждый документ неоперативно. Документ = Выборка.Ссылка.ПолучитьОбъект(); Документ.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла;
Здесь инициировалось проведение в неоперативном режиме. Значение по умолчанию параметра РежимПроведения метода объекта документа Записать() – именно РежимПроведенияДокумента.Неоперативный.
556
Листинг 11.9. Пример записи документа с неоперативным проведением в форме
&НаСервере Процедура ПровестиНеоперативноНаСервере(); // Установить использование режима неоперативного проведения. ИспользоватьРежимПроведения = ИспользованиеРежимаПроведения.Неоперативный;
// Выполнить проведение в форме. Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
КонецПроцедуры
В данном примере используется свойство ИспользоватьРежимПроведения и метод Записать() расширения формы документа.
Формирование движений в объекте документа, но без проведения документа С прикладной точки зрения часто возникает потребность сформировать движения для документов, чья обработка еще полностью не завершена, и завершена будет, возможно, не в этом сеансе работы с программой, а через некоторое время. Поэтому платформа «1С:Предприятие» позволяет в способе формирования движений не ограничиваться только проведением документа. Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных Однако нужно помнить, что кроме выполнения самих движений при формировании движений вне процедуры, обрабатывающей проведение документа, необходимо: ■■ контролировать, чтобы документ был сохранен на момент записи движений в регистр (записи должны содержать ссылку на регистратор); ■■ решать, что делать со старыми движениями документа; ■■ явно записывать сформированные наборы записей движений. подробнее
Пример формирования движений без проведения документа приведен в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске.
В командной панели формы документа ПоступлениеТоваров создано подменю Действия с движениями. В нем находится команда Формирование движений. Обработчик действия данной команды (листинги 11.11, 11.12) передает управление процедуре ФормированиеДвиженийБезПроведения() модуля объекта документа (листинг 11.10). Листинг 11.10. Пример формирования движений документа без проведения
Процедура ФормированиеДвиженийБезПроведения() Экспорт // Проверить и записать документ, если ранее не записан. Если ЭтоНовый() Тогда Записать(); КонецЕсли; Для Каждого ТекСтрокаСостав Из Состав Цикл // Сформировать и заполнить запись движения. Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ТекСтрокаСостав.Номенклатура; Движение.Склад = Склад; Движение.Количество = ТекСтрокаСостав.Количество; Движение.ВидОперации = ВидОперации; КонецЦикла; // Записать движения регистров с замещением старых наборов записей. Движения.ТоварыНаСкладах.Записать(); КонецПроцедуры
Краткий комментарий: сначала необходимо убедиться, что ссылка на данный документ уже есть в базе данных, то есть документ не новый. Если нет, документ записывается, поскольку без ссылки на регистратор движения в регистре накопления сформированы быть не могут. Затем формируется Том 1
новый набор записей в цикле перебора строк табличной части Состав документа. Далее сформированный набор записей записывается в регистр. Также следует обратить внимание на то, что в заголовке процедуры, выполняющей эти действия, указано ключевое слово Экспорт. В результате данная процедура доступна в контексте объекта документа. Вызов данной процедуры выполняется из модуля формы данного документа. Основным реквизитом формы документа как раз и является объект документа, поэтому процедура будет доступна в контексте формы документа. Но для того, чтобы вызвать процедуру объекта документа, нужно сначала конвертировать основной реквизит формы Объект в этот объект (листинги 11.12, 11.13). Листинг 11.11. Обработчик действия команды «ФормированиеДвижений»
&НаКлиенте Процедура ФормированиеДвижений(Команда) ФормированиеДвиженийДокумента(); КонецПроцедуры Листинг 11.12. Пример вызова процедуры из формы документа
&НаСервере Процедура ФормированиеДвиженийДокумента() Документ = РеквизитФормыВЗначение("Объект"); Документ.ФормированиеДвиженийБезПроведения(); КонецПроцедуры
В принципе вызов этой процедуры может быть реализован почти из любого модуля программы. Для этого нужно лишь получить объект документа (например, из ссылки на документ), листинг 11.13. Листинг 11.13. Пример вызова процедуры из модуля обработки
// Получить объект документа. Документ = СсылкаНаДокумент.ПолучитьОбъект(); // Вызвать процедуру модуля объекта документа, формирующую движения. Документ.ФормированиеДвиженийБезПроведения();
Модификация существующих движений документа Кроме задачи формирования новых движений без проведения документа разработчикам иногда приходится решать задачи изменения информации в движениях (модификации движений), снятия активности движений документа или вообще удаления движений. Технология их решения абсолютно та же. Это запись наборов записей регистра, только соответствующим образом модифицированных.
557
Глава 11. Учет движения средств Для модификации движений можно сначала прочитать набор записей движений, далее модифицировать записи и записать уже модифицированный набор записей движений.
Подробнее
В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, в форме документа ПоступлениеТоваров приведен пример заполнения поля реквизита Поставщик регистра ТоварыНаСкладах значением из константы ОсновнойПоставщик.
Обратите внимание: элемент коллекции свойства документа Движения представляет собой набор записей регистра. Но он, пока не прочитан, пуст (рис. 11.15).
Рассмотрим этот пример (листинг 11.14). Листинг 11.14. Пример модификации движений документа
// Получить значение основного поставщика. ОсновнойПоставщик = Константы.ОсновнойПоставщик.Получить(); // Прочитать набор записей движений по регистру "ТоварыНаСкладах". Документ = РеквизитФормыВЗначение("Объект"); НаборЗаписей = Документ.Движения.ТоварыНаСкладах; НаборЗаписей.Прочитать(); // Модифицировать каждую запись в прочитанных движениях. Если НаборЗаписей.Количество() 0 Тогда Для Каждого Движение Из НаборЗаписей Цикл Рис. 11.15. Коллекция «Движения» содержит пустые наборы записей
Поэтому, для того чтобы модифицировать записи регистра, необходимо сначала прочитать данные наборы записей (рис. 11.16).
Движение.Поставщик = ОсновнойПоставщик;
КонецЦикла;
// Записать измененный набор записей. НаборЗаписей.Записать(); КонецЕсли;
Снятие активности движений – по сути дела та же задача модификации движений документа, только в отношении поля Активность, и может выполняться аналогично. Однако с прикладной точки зрения свойство записи движения Активность особое. Во-первых, наличие активных движений документа в регистре означает, что данный документ отражен в неком аспекте учета. Вернее, в учете отражено событие, зафиксированное данным документом. Во-вторых, наличие движений документа со снятой активностью означает, что движения данного документа не используются в учетном механизме. В-третьих, наличие движений документа в регистре, из которых часть активна, а часть неактивна, с точки зрения практического применения нонсенс. Например, попробуйте представить себе ситуацию: «Отгружено пять пылесосов и холодильник, но не совсем. Холодильник не отгружен». Поэтому платформа не допускает записи набора записей движений регистра, если часть записей в этом наборе активна, а часть – нет (рис. 11.17).
Рис. 11.16. Чтение набора записей
558
В системе предусмотрена возможность установки и снятия активности целиком для всего набора записей посредством метода УстановитьАктивность() набора записей регистра накопления. Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных подробнее
В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, в форме документа ПоступлениеТоваров при выполнении действия ОчиститьДвиженияДокумента выполняется удаления движений документа.
Рассмотрим этот пример (листинг 11.16). Листинг 11.16. Пример удаления движений документа
Документ = РеквизитФормыВЗначение("Объект"); // Перебрать наборы записей по регистрам Для Каждого НаборЗаписей Из Документ.Движения Цикл
// Очистить набор записей движений по регистру. НаборЗаписей.Очистить(); // Записать набор записей. НаборЗаписей.Записать();
КонецЦикла; Рис. 11.17. Варианты использования свойства «Активность»
Подробнее
В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, в форме документа ПоступлениеТоваров приводится пример снятия активности всех движений документа по регистрам.
Однако если бы была полная уверенность, что ни один из наборов записей регистров для данного объекта документа на момент выполнения процедуры не прочитан, то предварительную очистку можно было бы не делать (листинг 11.17). Листинг 11.17. Пример удаления движений документа
Документ = РеквизитФормыВЗначение("Объект");
Рассмотрим этот пример (листинг 11.15).
// Перебрать наборы записей по регистрам. Для Каждого НаборЗаписей Из Документ.Движения Цикл
Листинг 11.15. Пример снятия активности записей
Документ = РеквизитФормыВЗначение("Объект"); // Перебрать наборы записей по регистрам. Для Каждого НаборЗаписей Из Документ.Движения Цикл
// Прочитать движения по регистру. НаборЗаписей.Прочитать(); // Снять активность. НаборЗаписей.УстановитьАктивность(Ложь); // Записать набор записей. НаборЗаписей.Записать();
КонецЦикла;
И, наконец, операция удаления движений документа. Она сводится к записи пустого набора записей регистра. В ситуации, когда набор записей регистра прочитан и не пуст, можно использовать его предварительную очистку. Том 1
// Записать набор записей. НаборЗаписей.Записать();
КонецЦикла
Интерактивное формирование наборов записей с помощью свойства «Движения» объекта документа Описанный выше функционал системы касался наиболее часто встречающихся решений задач формирования движений документов. То есть пользователь отвечает за правильность ввода информации в документ, а разработчик – за правильность работы обработок, интерпретирующих и записывающих в регистры учетную информацию, полученную согласно данным документов. Однако иногда могут встречаться ситуации, когда не требуется никакой дополнительной обработки для вводимой пользователем информации.
559
Глава 11. Учет движения средств То есть тогда можно обеспечить ввод информации напрямую в данные регистра, без промежуточной регистрации ее в данных документа. Для регистров накопления в любой ситуации возможно содержание информации только с использованием документа-регистратора. Поэтому в таких случаях для обеспечения требования обоснованности данных регистра наличием регистратора и желания уменьшить избыточность хранения информации в базе данных возможно применение технологии, условно называемой «ручная операция».
ванных данных в регистр нажмет кнопку Перечитать (или выполнит команду формы Все действия Перечитать), то он получит предупреждение (рис. 11.20).
В форме документа отображаются данные и документа, и движений регистра, которые подчинены данному документу (рис. 11.18).
Рис. 11.19. Форма документа «РучнаяОперация»
Рис. 11.20. Предупреждение при перечитывании данных
Рис. 11.18. Редактирование движений вручную
В состав демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, входит документ РучнаяОперация. Его создание и технологические вопросы, возникающие при его использовании, подробно описаны в разделе «Специальные случаи использования документов. Ручная операция» на стр. 529. Хотелось бы только еще раз подчеркнуть, что для облегчения работы разработчика здесь использовалось свойство Движения объекта документа. И таблица в форме документа отображает данные одного из элементов этой коллекции – набора записей движений по регистру ТоварыНаСкладах. Пользователь, работая с формой документа, на самом деле интерактивно модифицирует считанные данные набора записей движений регистра, подчиненных данному документу (рис. 11.19). А вопросы отображения данных регистра в таблице формы, записи модифицированных данных из реквизита формы в таблицу движений регистра и т. д. берет на себя платформа посредством возможностей, предоставляемых расширением формы документа. Причем системой отрабатывается большинство ситуаций, которые могут привести к коллизиям. Например, если пользователь после внесения изменений в содержимое таблицы формы, но до записи модифициро-
560
Если перечитать данные до записи модифицированных данных в регистр (ответ – Да), то последние изменения будут потеряны.
Запись набора записей регистра без использования свойства «Движения» В разделе «Свойство «Движения» объекта документа» на стр. 552 были описаны действия с объектом документа, приводящие к чтению, модификации, добавлению и записи наборов записей в регистр. Те же самые результаты можно получить и без использования объекта документа, работая непосредственно с набором записей (рис. 11.21). В данном случае для модификации движений документа не используется объект документа (используется только ссылка на документ). Поэтому при выполнении обработок массового формирования или модификации движений, связанных не с единичными документами, а с большими массивами документов, уместнее применение приемов работы, основанных на использовании набора записей регистра, т. к. этот способ является менее ресурсоемким. Например, в состав конфигурации уже заполненной базы данных ввели новый оборотный регистр Продажи со следующей структурой (рис. 11.22). Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных Листинг 11.18. Пример формирования движений документов
Рис. 11.21. Использование набора записей регистра накопления
Рис. 11.22. Структура регистра «Продажи»
Он должен заполняться при проведении документа РеализацияТоваров данными документа (включая данные его табличной части Состав), поэтому в обработку проведения данного объекта конфигурации были внесены соответствующие изменения. Однако существует уже достаточно много документов РеализацияТоваров, оформленных и проведенных еще в то время, когда нового регистра не было. Как для них сформировать движения по новому регистру? Можно, конечно, перепровести все ранее проведенные документы РеализацияТоваров. Однако при проведении документа не только выполняются движения по новому регистру. Формируются движения по другим регистрам, записываются данные в таблицу документа, в таблицы журналов документов и т. д. Поэтому данное решение может оказаться неудобным в отношении скорости исполнения или по другим причинам. В данной ситуации более эффективным выглядит применение следующей обработки. Из базы данных запросом выбрать ссылки на проведенные документы РеализацияТоваров и другие данные этих документов, необходимые для формирования движений. Эти данные можно получить из таблицы документа. Перебирая выборку результата запроса, применять отбор по регистраторам (ссылкам на документы) для формирования наборов записей движений, подчиненных этим документам (листинг 11.18). Том 1
Процедура ФормированиеДвиженийПоПродажамДляВсехРеализацияТоваров() // Обратиться к набору записей регистра. НаборЗаписейРегистра = РегистрыНакопления.Продажи.СоздатьНаборЗаписей(); // Прочитать из базы данных данные, необходимые для формирования движений. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровСостав.Ссылка КАК Ссылка, | РеализацияТоваровСостав.Ссылка.Дата, | РеализацияТоваровСостав.Ссылка.Контрагент, | РеализацияТоваровСостав.Ссылка.ВидОперации, | РеализацияТоваровСостав.Номенклатура, | РеализацияТоваровСостав.Количество, | РеализацияТоваровСостав.Сумма |ИЗ | Документ.РеализацияТоваров.Состав КАК РеализацияТоваровСостав |ГДЕ | РеализацияТоваровСостав.Ссылка.Проведен |ИТОГИ ПО | Ссылка"; Результат = Запрос.Выполнить(); // Перебрать все документы из результата запроса. ВыборкаДокументов = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаДокументов.Следующий() Цикл // Установить отбор набора записей по регистратору, к которому будут приписаны движения. НаборЗаписейРегистра.Отбор.Регистратор.Установить(ВыборкаДокументов.Ссылка); // Перебрать данные о составе документа, необходимые для заполнения формируемых движений. ВыборкаДетальныхЗаписей = ВыборкаДокументов.Выбрать(); Пока ВыборкаДетальныхЗаписей.Следующий() Цикл // Сформировать движения по регистру Продажи. НоваяЗапись = НаборЗаписейРегистра.Добавить(); НоваяЗапись.Период = ВыборкаДетальныхЗаписей.Дата; НоваяЗапись.Номенклатура = ВыборкаДетальныхЗаписей.Номенклатура; НоваяЗапись.Количество = ВыборкаДетальныхЗаписей.Количество; НоваяЗапись.Сумма = ВыборкаДетальныхЗаписей.Сумма; НоваяЗапись.Контрагент = ВыборкаДокументов.Контрагент; НоваяЗапись.ВидОперации = ВыборкаДокументов.ВидОперации; КонецЦикла; // Записать сформированные для очередного документа движения. НаборЗаписейРегистра.Записать(); // Очистить набор записей регистра // перед использованием для следующего документа. НаборЗаписейРегистра.Очистить(); КонецЦикла; КонецПроцедуры
561
Глава 11. Учет движения средств подробнее
Данный пример приведен в составе обработки ДействияСДвижениямиРегистраНакопления демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске.
Еще раз хотелось бы подчеркнуть, что данная обработка вообще не обращается к объектам документов. По сути, движения «приписываются» к документам «без ведома объектов документов». Подобным же образом можно решать не только задачи формирования новых движений документов, но и модификации существующих движений. Примеры чтения движений регистров накопления будут приведены ниже, в разделе «Получение движений регистров накопления» на стр. 568.
В данном примере использовался следующий прием: набор записей регистра, не прочитанный из базы, пуст. Если записать пустой набор записей регистра с замещением, это приведет к удалению движений замещаемого в рамках отбора набора записей. В заключение хотелось бы только еще раз подчеркнуть – для регистров накопления все действия с модификацией наборов записей регистра можно выполнять только в рамках отбора по регистратору, то есть документу, которому подчинен этот набор записей.
Интерактивное формирование движений с помощью формы набора записей
Частным случаем операций модификации наборов записей регистров накопления является удаление движений. Удалить движения регистра Продажи в пределах заданного временного интервала можно следующим образом (листинг 11.19).
Выше, в разделе «Интерактивное формирование наборов записей с помощью свойства «Движения» объекта документа» на стр. 559, рассматривался пример, когда в рамках формы документа пользователю предоставлялись возможности интерактивного формирования/модификации движений документа.
Листинг 11.19. Пример удаления движений документа
Если пользователю необходимо предоставить те же интерактивные возможности, но без использования формы документа, задача может быть решена посредством использования формы набора записей.
&НаСервереБезКонтекста Процедура УдалитьДвиженияПоПродажамЗаПериод(ДатаНачала, ДатаОкончания) // Обратиться к набору записей регистра. НаборЗаписейРегистра =РегистрыНакопления.Продажи.СоздатьНаборЗаписей(); // Получить из базы данных ссылки на документы, у которых нужно удалить движения. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Продажи.Регистратор |ИЗ | РегистрНакопления.Продажи КАК Продажи |ГДЕ | Продажи.Период МЕЖДУ &ДатаНачала И &ДатаОкончания"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Результат = Запрос.Выполнить(); // Перебрать все документы из результата запроса. Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // Установить отбор набора записей по регистратору, к которому будут приписаны движения. НаборЗаписейРегистра.Отбор.Регистратор.Установить(Выборка.Регистратор); // Записать пустой набор записей движений для очередного документа. НаборЗаписейРегистра.Записать(); КонецЦикла; КонецПроцедуры
562
подробнее
В демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, в форме списка документа РучнаяОперация приведен подобный пример.
В состав регистра ТоварыНаСкладах включена форма ФормаНабораЗаписей, основной реквизит которой имеет тип РегистрНакопленияНаборЗаписей. ТоварыНаСкладах. Вызов данной формы может осуществляться любой обработкой или командой. Единственное, для возможности выполнения действий по модификации наборов записей регистра накопления необходимо помнить об обязательности установки отбора по регистратору. Вызов формы набора записей регистра ТоварыНаСкладах реализуется из формы списка документа РучнаяОперация (рис. 11.23).
Рис. 11.23. Форма списка документа «РучнаяОперация»
Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных Обработчик команды ОткрытьФормуНабораЗаписей реализован следующим образом (листинг 11.20).
Механизмы заполнения таблицы итогов регистра накопления
Листинг 11.20. Пример использования формы набора записей
Таблицы итогов регистров накопления заполняются автоматически вследствие добавления, удаления или модификации наборов записей в таблице движений регистра, если для этого регистра не отключен режим расчета итогов.
&НаКлиенте Процедура ОткрытьФормуНабораЗаписей(Команда) // Получить ссылку на текущий документ. ТекущийДокумент = Элементы.Список.ТекущаяСтрока; // Открыть форму набора записей с отбором по регистратору. ЗначениеОтбора = Новый Структура("Регистратор", ТекущийДокумент); ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора); ОткрытьФорму("РегистрНакопления.ТоварыНаСкладах.Форма. ФормаНабораЗаписей", ПараметрыФормы) КонецПроцедуры
Краткий комментарий: сначала создается структура отбора ЗначениеОтбора с ключом Регистратор, содержащим ссылку на текущий документ (Элементы.Список.ТекущаяСтрока), и добавляется в структуру параметров формы ПараметрыФормы. Эти параметры передаются в форму набора записей ФормаНабораЗаписей, и эта форма открывается с отбором по полю Регистратор регистра накопления ТоварыНаСкладах. В форме набора записей пользователь может интерактивно модифицировать как сам набор записей (удалять, добавлять, копировать и т. д.), так и содержимое полей записей, входящих в набор записей. Впоследствии модифицированный набор может быть сохранен, то есть записан в регистр (рис. 11.24).
Расчет итогов производится согласно записям таблицы движений регистра, если свойство Активность этих записей имеет значение Истина. Но для разных видов регистров накопления заполнение данных таблицы итогов выполняется по разным правилам. Это объясняется спецификой показателей, учитываемых посредством регистров. подробнее
Раздел «Оперативный учет. Описание задач, решаемых регистрами накопления», стр. 545.
Механизм заполнения таблицы итогов регистра накопления остатков В таблице итогов регистра остатков хранятся текущие итоги и могут храниться итоги рассчитанных периодов. Текущие (актуальные) итоги – это итоговые значения учитываемых в регистре ресурсов (показателей) на момент времени заведомо больший, нежели любое значение поля Период записей таблицы движений. Для определенности текущие итоги регистров остатков датированы на 01.11.3999 00:00:00. Итоги рассчитанных периодов содержат данные конечных значений ресурсов для каждого месяца, предшествующего границе рассчитанных итогов. При записи набора активных записей в таблице движений всегда рассчитываются и перезаписываются текущие итоги в таблице итогов, если у регистра установлен признак использования итогов.
Рис. 11.24. Форма набора записей регистра
Обеспечение выполнения этих действий и устранение возможных коллизий реализуются средствами расширения формы набора записей регистра. Том 1
Данные итогов периодов в таблице итогов появляются вследствие расчета итогов. Такой расчет может быть инициирован посредством системной команды Управление итогами. Для этого нужно вызвать стандартную функцию Управление итогами (Все функции Стандартные) и переключить ее в режим Полные возможности (рис. 11.25). Период для подсчета итогов – всегда месяц. Чтобы установить границу рассчитанных итогов сразу для всех регистров накопления остатков, можно переключить обработку в режим Часто используемые возможности и выполнить команду Установить период рассчитанных итогов.
563
Глава 11. Учет движения средств Таблица 11.11. Таблица итогов регистра накопления остатков
Итоги апреля 2010 года
Итоги мая 2010 года (граница рассчитанных итогов)
Текущие итоги
Рис. 11.25. Стандартная обработка «Управление итогами»
Также расчет итогов может быть выполнен программно (листинг 11.21). Листинг 11.21. Программный расчет итогов регистра
РегистрыНакопления.ТоварыНаСкладах.УстановитьПериодРассчитанныхИтогов(Дата(2010, 05, 31));
Например, пусть таблица движений регистра накопления будет заполнена данными, как показано в табл. 11.10.
Период
Номенклатура
Склад
Количество Сумма
01.05.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00
Пульт VH
Главный
1
10
Пульт VH
Главный
2
20
Пульт PW
Главный
7
490
Пульт PW
Фили-2
1
17
Пульт VH
Фили-2
1
18
Пульт VH
Главный
2
20
Пульт PW
Главный
7
490
Пульт PW
Фили-2
1
17
Обратите внимание: майские итоги хранятся с указанием периода 01.06.2010 00:00:00, потому что итоги рассчитаны на начало июня. То есть при их расчете учтены все записи, которые зафиксированы в мае, включая 31.05.2010 23:59:59 (рис. 11.26).
Пульт VH
Главный 1
10
1
Приход Истина
Пульт VH
Главный 9
90
2
Приход Истина
Пульт PW
Главный 7
490
1
Приход Ложь
Пульт VH
Фили-2
5
60
1
Расход Истина
Пульт VH
Главный 8
80
1
Приход Истина
Пульт PW
Фили-2
1
17
1
Приход Истина
Пульт VH
Фили-2
1
18
Сумма
Склад
Приход Истина
Количество
Номенклатура
1
Активность
ПоступлениеТоваров № 1 13.05.2010 15:00:00 ПоступлениеТоваров № 2 13.05.2010 15:00:01 ПоступлениеТоваров № 2 13.05.2010 15:00:01 ПоступлениеТоваров № 3 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 ПоступлениеТоваров № 4 31.05.2010 23:59:59 ПоступлениеТоваров № 5 01.09.2010 00:00:00
Вид движения
Регистратор
03.04.2010 15:00:00 13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 23:59:59 01.09.2010 00:00:00
Номер строки
Период
Таблица 11.10. Таблица движений регистра накопления остатков
Для вышеприведенного примера заполнения таблицы движений регистра таблица итогов регистра после расчета итогов по 31.05.2010 будет выглядеть так, как показано в табл. 11.11.
564
Рис. 11.26. Хранение рассчитанных итогов регистра накопления остатков
Наличие посчитанных по конец каждого месяца итогов положительно сказывается на быстродействии обращений к остаткам регистра. Как будет еще более подробно описано ниже, в разделе «Получение остатков» на стр. 573, расчет остатков начинается с определения ближайшего равного или большего итога (хранимого в таблице итогов регистра) с последующим «досчетом» остатка на нужный момент времени по таблице движений. Но зачастую может сложиться ситуация, что граница рассчитанных итогов очень сильно «отстает» от периода самой последней записи в регистре. Данное положение не сказывается на функциональности регистра, сказывается только на быстродействии обращений к его остаткам. Поскольку досчет тогда будет производиться, скорее всего, по большому количеству записей. Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных
Например, если к вышеприведенным примерам в таблицу движений добавить еще записи, представленные в табл. 11.14, то таблица итогов регистра после общего пересчета итогов в результате будет заполнена так, как показано в табл. 11.15.
1
Приход Истина
Пульт VH
Главный
9
90
2
Приход Истина
Пульт PW
Главный
7
490
1
Приход Истина
Пульт PW
Фили-2
10
120
1
Приход Ложь
Пульт PW
Главный
1
1
1
Приход Ложь
Пульт VH
Фили-2
5
60
1
Расход
Истина
Пульт VH
Главный
8
80
1
Приход Истина
Пульт PW
Фили-2
1
17
1
Приход Истина
Пульт VH
Фили-2
1
18
В этом случае будет производиться перерасчет итогов только по комбинации значений измерений Пульт PW и Фили-2 (табл. 11.13). Ведь свойство Активность движений документа Поступление товаров № 7 имеет значение Ложь. Таблица 11.13. Таблица итогов регистра накопления остатков Период
01.05.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00
Том 1
Номенклатура
Пульт VH Пульт VH Пульт PW Пульт PW Пульт VH Пульт VH Пульт PW Пульт PW
Склад
Главный Главный Главный Фили-2 Фили-2 Главный Главный Фили-2
Количество
1 2 7 11 1 2 7 11
Сумма
10 20 490 137 18 20 490 137
02.06.2010 10:00:00 02.06.2010 10:00:00
РеализацияТоваров № 2 1 02.06.2010 10:00:00 РеализацияТоваров № 2 2 02.06.2010 10:00:00
Сумма
10
Количество
1
Расход
Истина Пульт VH
Главный
2
20
Расход
Истина Пульт PW
Главный
1
70
Номенклатура
Сумма
Главный
Номер строки
Количество
Пульт VH
Регистратор
Склад
Приход Истина
Период
Номенклатура
1
Активность
Вид движения
Регистратор
Поступление товаров № 1 13.05.2010 15:00:00 Поступление товаров № 2 13.05.2010 15:00:01 Поступление товаров № 2 13.05.2010 15:00:01 Поступление товаров № 6 13.05.2010 15:00:01 Поступление товаров № 7 13.05.2010 15:00:01 Поступление товаров № 3 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 Поступление товаров № 4 31.05.2010 23:59:59 Поступление товаров № 5 01.09.2010 00:00:00
Номер строки
Период
03.04.2010 15:00:00 13.05.2010 15:00:01 13.05.2010 15:00:01 15.05.2010 11:00:01 15.05.2010 11:01:01 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 23:59:59 01.06.2010 00:00:00
Склад
Таблица 11.14. Записи, добавляемые в регистр накопления остатков
Таблица 11.12. Добавление записей в таблицу движений регистра накопления остатков
Активность
Например, пусть к записям регистра добавляются записи, выделенные в табл. 11.12.
Если в результате расчета текущих итогов или итогов периода окажется, что по некой комбинации значений измерений итоги всех ресурсов «выводятся в ноль», то данная запись удаляется системой из таблицы итогов при общем пересчете итогов.
Вид движения
При добавлении, удалении, модификации записей таблицы движений регистра система автоматически производит пересчет всех рассчитанных итогов, начиная с того периода (месяца), к которому относится значение поля Период записей. Так же пересчитываются текущие итоги. Этот процесс захватывает все записи итогов, в которых указаны значения измерений модифицируемых записей. Главное, чтобы значение поля Активность модифицируемых записей таблицы движений было Истина.
Таблица 11.15. Таблица итогов регистра накопления остатков Период
Номенклатура Склад
Количество
Сумма
01.05.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00
Пульт VH Пульт VH Пульт PW Пульт PW Пульт VH Пульт PW Пульт PW
1 2 7 11 1 6 11
10 20 490 137 18 420 137
Главный Главный Главный Фили-2 Фили-2 Главный Фили-2
Если впоследствии будет произведен расчет итогов по 30.06.2010, то таблица итогов примет вид, представленный в табл. 11.16. Таблица 11.16. Таблица итогов регистра накопления остатков Период
Номенклатура
Склад
Количество
Сумма
01.05.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.07.2010 00:00:00 01.07.2010 00:00:00 01.07.2010 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00
Пульт VH Пульт VH Пульт PW Пульт PW Пульт VH Пульт PW Пульт PW Пульт VH Пульт PW Пульт PW
Главный Главный Главный Фили-2 Фили-2 Главный Фили-2 Фили-2 Главный Фили-2
1 2 7 11 1 6 11 1 6 11
10 20 490 137 18 420 137 18 420 137
565
Глава 11. Учет движения средств Таблица 11.18. Таблица итогов оборотного регистра накопления
Механизм заполнения таблицы итогов оборотного регистра накопления
Период
При добавлении, удалении или модификации наборов записей в таблице движений всегда рассчитываются итоги в том периоде (месяце), к которому принадлежит значение поля Период записи. В отличие от регистра остатков, этот процесс не зависит от периода рассчитанных итогов базы данных (рис. 11.27).
Итоги марта 2010 года Итоги апреля 2010 года Итоги июня 2010 года
01.03.2010 00:00:00 01.03.2010 00:00:00 01.04.2010 00:00:00 01.06.2010 00:00:00
Номенклатура Контрагент
Количество
Сумма
Пульт VH
Ялта-Лтд
9
135
Пульт VH
Компания "Риона"
10
150
Пульт VH
Компания "Риона"
2
30
Пульт PW
Ялта-Лтд
1
95
Например, для отражения ситуации «возврат от покупателя» в регистр Продажи можно добавить такую запись (табл. 11.19).
Номенклатура
Контрагент
Количество
Сумма
Реализация № 1 27.03.2010 12:30:45 Реализация № 2 29.03.2010 15:00:01 Реализация № 3 13.04.2010 15:00:00 Реализация № 4 23.04.2010 10:00:00 Реализация № 5 23.04.2010 15:30:45 Реализация № 6 01.06.2010 08:59:59
Активность
Регистратор
27.03.2010 12:30:45 29.03.2010 15:00:01 13.04.2010 15:00:00 23.04.2010 10:00:00 23.04.2010 15:30:45 01.06.2010 08:59:59
1
Истина
Пульт VH
Ялта-Лтд
9
135
1
Истина
Пульт VH
Компания "Риона"
10
150
1
Истина
Пульт VH
Компания "Риона"
1
15
1
Истина
Пульт VH
Компания "Риона"
1
15
1
Ложь
Пульт PW
Крона
1
90
1
Истина
Пульт PW
Ялта-Лтд
1
95
Для вышеприведенного примера заполнения таблицы движений система заполнит таблицу итогов регистра следующим образом (табл. 11.18). Обратите внимание: поле Период заполняется значением даты начала периода (месяца), по которому хранятся итоги. Хотя для оборотного регистра не существует понятий «расход» и «приход», при необходимости можно использовать формирование движений с отрицательными значениями ресурсов.
566
Ялта-Лтд -1
Сумма
Количество
Истина Пульт PW
Контрагент
Номенклатура
Активность
1
17.06.2010 ВозвратОтПокупателя № 1 17:30:00 17.06.2010 17:30:00
-95
В результате система пересчитает июньские итоги по комбинации значений измерений ПультPW, Ялта-Лтд.
Номер строки
Период
Таблица 11.17. Таблица движений оборотного регистра накопления
Номер строки
Пример заполнения таблицы движений оборотного регистра Продажи представлен в табл. 11.17.
Регистратор
Для расчета итогов учитываются только записи, у которых поле Активность имеет значение Истина.
Период
Таблица 11.19. Запись, добавляемая в оборотный регистр накопления
Рис. 11.27. Хранение рассчитанных итогов оборотного регистра накопления
Поскольку при общем пересчете итогов для оборотного регистра также удаляются записи, содержащие нулевые значения всех ресурсов, то содержание таблицы итогов после этого будет следующим (табл. 11.20). Таблица 11.20. Таблица итогов оборотного регистра накопления Период
01.03.2010 00:00:00 01.03.2010 00:00:00 01.04.2010 00:00:00
Номенклатура
Контрагент
Количество
Сумма
Пульт VH
Ялта-Лтд
9
135
Пульт VH
Компания "Риона"
10
150
Пульт VH
Компания "Риона"
2
30
Режим разделения итогов Использование режима разделения итогов обеспечивает более высокую параллельность работы при записи в регистр, что позволяет ускорить запись в регистр и избежать блокировок в тех случаях, когда разные пользователи записывают данные с одинаковыми значениями измерений за один и тот же период.
Профессиональная разработка в системе «1С:Предприятие 8»
Механизмы заполнения таблиц регистров накопления в базе данных При использовании режима разделения итогов система при одновременной записи движений несколькими сеансами не будет обновлять одни и те же записи итогов, а будет записывать изменения итогов в отдельные записи. При получении итогов эти данные складываются. Таким образом, обеспечивается и поддержание в актуальном состоянии итогов (например, для быстрого получения отчетов), и параллельность записи движений. Как было рассказано выше, таблица итогов содержит алгебраическую сумму движений (с учетом вида движений) по каждой комбинации измерений. И при записи движений записи в таблице итогов автоматически пересчитываются. Считываемые записи таблицы итогов в момент пересчета блокируются. Таким образом, документы, содержащие движения по одинаковым комбинациям значений измерений, не могут быть проведены параллельно. Например, таблица движений регистра накопления содержит следующие записи (табл. 11.21).
Номенклатура
Склад
Количество
Сумма
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 2 13.05.2010 15:00:01 Реализация № 1 15.05.2010 12:30:45
Вид движения
Регистратор
13.05.2010 15:00:01 13.05.2010 15:00:01 13.05.2010 15:00:01 15.05.2010 12:30:45
Номер строки
Период
Таблица 11.21. Таблица движений регистра накопления остатков
1
Приход
Пульт VH
Главный
9
90
2
Приход
Пульт PW
Главный
7
490
1
Приход
Пульт VH
Главный
5
50
1
Расход
Пульт VH
Главный
8
80
Таким образом, в приведенном примере документы ПоступлениеТоваров № 1 и ПоступлениеТоваров № 2 не могут быть параллельно проведены, так как не могут быть записаны параллельно записи таблицы итогов регистра накопления по комбинации значений измерений ПультVH – Главный.
После записи документа Реализация № 1 записи таблицы итогов будут выглядеть следующим образом (табл. 11.23). Таблица 11.23. Таблица итогов регистра накопления остатков Разделитель
Номенклатура
Склад
Количество Сумма
0 1 0
Пульт VH Пульт VH Пульт PW
Главный Главный Главный
1 5 7
10 50 490
При получении итогов регистра накопления запросом или методом встроенного языка или при пересчете итогов записи сворачиваются по комбинациям значений измерений. При этом избыточные записи из регистра удаляются (табл. 11.24). Таблица 11.24. Таблица итогов регистра накопления остатков Номенклатура
Склад
Количество Сумма
Пульт VH Пульт PW
Главный Главный
6 7
60 490
Новые записи с уже существующими комбинациями измерений создаются системой только в случае, если параллельно выполняются две и более транзакции. Таким образом, увеличение количества записей итогов зависит от количества одновременно выполняемых транзакций. Заметим, что данный механизм не работает в файловом варианте, так как там поддерживается только блокировка на уровне таблиц. Разумеется, работа данного механизма влечет за собой дополнительные накладные расходы (наличие поля в таблицах итогов, увеличение количества записей в таблицах итогов). Чтобы управлять работой данного механизма, предусмотрены две возможности.
Разделитель
Номенклатура
Склад
Количество
Сумма
В конфигурации для регистров введено свойство Разрешить разделение итогов. Стандартно для новых регистров накопления, создаваемых в конфигурации, это свойство включено. Установка этого свойства позволяет включить или отключить возможность разделения итогов для конкретного регистра. Отключение свойства полностью исключает влияние данного механизма на работу регистра, так как само поле, используемое для разделения итогов, не включается в структуру регистра. Например, отключение данной возможности полезно для регистров, которые не используются при параллельной работе пользователей. Например, для регистров, всегда заполняемых специальными регламентными обработками.
0 1 0
Пульт VH Пульт VH Пульт PW
Главный Главный Главный
9 5 7
90 50 490
Признак использования разделения итогов для регистров (для которых разделение итогов разрешено в конфигурации) может быть получен и установлен программно методами менеджера регистра накопления
Механизм разделения итогов вводит в состав хранимой таблицы итогов специальное поле (Разделитель), позволяющее распараллелить обновление записей итогов. Например, если одновременно записываются документы ПоступлениеТоваров № 1 и ПоступлениеТоваров № 2, то записи таблицы итогов будут выглядеть следующим образом (табл. 11.22). Таблица 11.22. Таблица итогов регистра накопления остатков
Том 1
567
Глава 11. Учет движения средств ПолучитьРежимРазделенияИтогов() нияИтогов(), а также в стандартной
и УстановитьРежимРазделефункции управления итогами
(Все функции Стандартные Управление итогами Полные возможности Разделение итогов Включить разделение итогов/Выключить разделение итогов). Такая возможность позволяет включать или выключать режим
разделения итогов в зависимости от условий работы пользователей в конкретной организации. Например, при интенсивном параллельном вводе информации этот режим может быть полезен. Но если с системой работает небольшое количество пользователей, то выигрыш от его применения будет небольшой, а некоторое замедление при получении отчетов и лишние записи в таблицах итогов фактически будут лишними (неоправданными).
Получение данных из регистров накопления Вопросы получения данных из регистров накопления могут касаться как получения движений, так и получения итоговых значений, учитываемых в регистре показателей. Получение движений может требоваться как для решения технологических задач работы с информацией регистров, так и для решения аналитических задач, но касающихся только приращений, учитываемых в регистрах показателей. Приемы и средства решения этих задач, как правило, не зависят от вида регистра, то есть одинаковы для регистров остатков и оборотных регистров. Это объясняется тем, что в любом случае обращение к данным движений в регистрах (хоть запросом, хоть посредством объектной модели) интерпретируется в запрос СУБД к таблице движений регистра. А приемы работы с одной таблицей базы данных практически одинаковы, тем более что состав полей и их содержимое, хоть бы и для разных видов регистров накопления, весьма схожи. Получение движений можно производить посредством следующих приемов (табл. 11.25). Таблица 11.25. Способы получения движений Табличная модель Регистр остатков
Оборотный регистр
Запрос к основной таблице регистра
Объектная модель Регистр остатков
Оборотный регистр
Методы Выбрать() и ВыбратьПоРегистратору() менеджера регистра
А вот приемы получения разных видов итогов и эффективности этих действий по скорости выполнения для разных видов регистров, как будет рассматриваться ниже, сильно отличаются. Тут проявляются различия в природе показателей, учитываемых в регистрах остатков и оборотных регистрах (описаны в разделе «Оперативный учет. Описание задач, решаемых регистрами накопления» на стр. 545). Природа этих
568
показателей такова, что требуются различные способы хранения промежуточных итогов (описаны в разделе «Структура регистра накопления» на стр. 547). В целом действия, которые выполняются при получении итогов регистров, можно классифицировать следующим образом (табл. 11.26). Таблица 11.26. Способы получения итогов Табличная модель Регистр остатков
Получение остатков Получение оборотов Получение остатков и оборотов
Оборотный регистр
Запрос к таблице остатков Запрос к таблице оборотов
Объектная модель Регистр остатков
Оборотный регистр
Метод Остатки() менеджера регистра Метод Обороты() менеджера регистра
Запрос к таблице остатков и оборотов
Следует заметить, что для любого действия, связанного с получением итогов регистра накопления, справедливы следующие утверждения: ■■ итоги ресурсов собираются только по активным записям; ■■ итоги можно получать только по тем регистрам, у которых использование итогов включено. При попытке получения итогов для регистра накопления с отключенными итогами выдается сообщение об ошибке.
Получение движений регистров накопления С точки зрения методических приемов чтение данных движений регистров накопления одинаково как для задач последующей модификации движений, так и для задач анализа движений регистров накопления. Например, для последующей обработки необходимо выбрать содержимое движений документов РеализацияТоваров по регистру ТоварыНаСкладах с отбором по складу СкладОтбора. При этом необходимо посчитать количество движений, выполненных каждым регистратором. Решение этой задачи может быть таким. В запросе обращаемся к данным основной таблицы регистра ТоварыНаСкладах, в качестве выходных указываем поля, соответствующие полям таблицы движений. Отбор выполняем по значению поля Склад и вхождению значений поля Регистратор в таблицу документов РеализацияТоваров. Выводим промежуточные итоги количества значений поля НомерСтроки в разрезе по регистраторам (в принципе подсчет количества можно было реализовать по любому из полей), листинг 11.22. Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Листинг 11.22. Пример получения движений регистра накопления
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладах.Период, | ТоварыНаСкладах.Регистратор КАК Регистратор, | ТоварыНаСкладах.НомерСтроки КАК НомерСтроки, | ТоварыНаСкладах.Активность, | ТоварыНаСкладах.ВидДвижения, | ТоварыНаСкладах.Номенклатура, | ТоварыНаСкладах.Склад, | ТоварыНаСкладах.Количество, | ТоварыНаСкладах.Поставщик |ИЗ | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах |ГДЕ | ТоварыНаСкладах.Склад = &Склад | И ТоварыНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваров |ИТОГИ | КОЛИЧЕСТВО(НомерСтроки) |ПО | Регистратор"; Запрос.УстановитьПараметр("Склад", СкладОтбора); Результат = Запрос.Выполнить(); ВыборкаРегистратор = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаРегистратор.Следующий() Цикл // Выполнить действия в цикле перебора регистраторов. // ... ВыборкаДвижения = ВыборкаРегистратор.Выбрать(); Пока ВыборкаДвижения.Следующий() Цикл // Выполнить действия в цикле перебора движений. // ... КонецЦикла; КонецЦикла;
Дальнейшее развитие приведенного алгоритма может идти в различных направлениях. Можно вывести в табличный документ содержимое движений регистра, а можно результат запроса использовать для модификации данных наборов записей с последующей записью измененных движений в регистр. Рассмотрим более подробно вопросы быстродействия системы при получении движений регистра накопления тем или иным способом.
Том 1
Вопросы быстродействия системы при получении движений Как правило, при решении задач, связанных с чтением движений из регистров накопления, для повышения эффективности решений большое значение имеют вопросы использования состава регистра накопления и использования табличной или объектной модели обращения к данным. Рассмотрим пример. Пусть необходимо подсчитать по данным регистра ТоварыНаСкладах, в каком количестве поставлялись товары в разрезе поставщиков. Данная задача может быть решена несколькими способами. Например, можно использовать внутреннее соединение основной таблицы регистра ТоварыНаСкладах и таблицы документа ПоступлениеТоваров (листинг 11.23). Листинг 11.23. Пример получения движений с использованием соединения с таблицей документа
ВЫБРАТЬ ПоступлениеТоваров.Контрагент КАК Поставщик, ТоварыНаСкладах.Номенклатура, СУММА(ТоварыНаСкладах.Количество) КАК Количество ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров ПО ТоварыНаСкладах.Регистратор = ПоступлениеТоваров.Ссылка ГДЕ ТоварыНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОконачания СГРУППИРОВАТЬ ПО ТоварыНаСкладах.Номенклатура, ПоступлениеТоваров.Контрагент
Условием соединения является равенство значений поля Регистратор таблицы регистра и поля Ссылка таблицы документа. Подобный способ получения движений в общем случае может оказаться неудобным, например, если поставки фиксируются несколькими видами документов. В этом случае усложнится текст запроса и замедлится его выполнение за счет большого количества соединений. Более удобным является подход с использованием реквизита регистра. Если для решения данной задачи в состав регистра включить реквизит Поставщик (тип значения – СправочникСсылка.Контрагенты), то значение поля реквизита можно будет заполнять при проведении только нужных документов. И тогда, независимо от количества видов документов поставки, задача будет решаться запросом только к основной таблице регистра (листинг 11.24).
569
Глава 11. Учет движения средств Листинг 11.24. Пример получения движений регистра накопления
ВЫБРАТЬ ТоварыНаСкладах.Поставщик, ТоварыНаСкладах.Номенклатура, СУММА(ТоварыНаСкладах.Количество) КАК Количество ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ГДЕ ТоварыНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОконачания И ТоварыНаСкладах.Поставщик &ПустойПоставщик СГРУППИРОВАТЬ ПО ТоварыНаСкладах.Поставщик, ТоварыНаСкладах.Номенклатура
Дополнительное условие «по непустым поставщикам» – отсечет из подсчета результатов (и из самих результатов) записи, которые сформированы ненужными документами. Например, перемещениями, реализацией и прочими (при проведении этих документов поле Поставщик не заполнялось). Значение же параметра ПустойПоставщик может быть установлено следующим образом (листинг 11.25). Листинг 11.25. Установка значения параметра «ПустойПоставщик»
Запрос.УстановитьПараметр("ПустойПоставщик", Справочники.Контрагенты.ПустаяСсылка());
Необходимо иметь в виду, что при использовании реквизитов составного типа незаполненное при проведении документа поставки значение реквизита будет иметь тип Неопределено. Поэтому для варианта, когда реквизит Поставщик имеет составной тип, значение параметра ПустойПоставщик может быть установлено следующим образом (листинг 11.26). Листинг 11.26. Пример установки параметра «ПустойПоставщик»
Запрос.УстановитьПараметр("ПустойПоставщик", Неопределено);
Если же при проведении документов реквизит может как не заполняться, так и заполняться пустыми значениями, возможно, придется в запросе учесть ряд вариантов значения реквизита (листинг 11.27). Листинг 11.27. Пример установки параметров запроса
Запрос.УстановитьПараметр("ПустойПоставщик", Неопределено); Запрос.УстановитьПараметр("ПустойПоставщикКонтрагент", Справочники.Контрагенты.ПустаяСсылка()); Запрос.УстановитьПараметр("ПустойПоставщикФизЛицо", Справочники.ФизическиеЛица.ПустаяСсылка());
В приведенном примере предполагается, что реквизит Поставщик имеет составной тип, включающий типы СправочникСсылка.Контрагенты и СправочникСсылка.ФизическиеЛица.
570
Итак, за счет изменения состава регистра, использования реквизитов можно применять более эффективные по скорости алгоритмы для получения движений регистров накопления. Обращение к данным одной таблицы базы данных всегда будет проходить быстрее, нежели обращение к данным той же таблицы, но в соединении с другими таблицами базы данных. Таким образом, за счет «структурных изменений» ряд задач можно сводить только к работе с таблицей движений регистра накопления. При обращении к данным таблицы движений регистра разработчик может применять обращение посредством выборки (объектная модель работы с данными) или посредством запроса (табличная модель чтения данных). С точки зрения обращения к информации базы данных выборка – это тот же самый запрос. При одинаковых условиях и выборка, и прямое обращение запросом работают одинаково эффективно. Разница в том, что выборка не так «гибка», зато получает данные порциями (это особенно важно, если ожидается большой объем данных в результате запроса). Для получения данных выборка использует механизм динамического чтения данных. Посредством этого механизма чтение данных осуществляется по блокам, а не целиком сразу всех. Кроме того, при использовании выборки объекты считываются целиком. Работа же посредством запроса позволяет считывать содержимое только тех полей, которые используются в запросе. Операция перебора всех движений регистров с помощью выборки может осуществляться, например, следующим образом (листинг 11.28). Листинг 11.28. Пример получения движений регистра накопления с помощью выборки
ВыборкаДвижений = РегистрыНакопления.ТоварыНаСкладах.Выбрать(); Пока ВыборкаДвижений.Следующий() Цикл // Выполнить действие с очередным движением. // ... КонецЦикла;
Кроме таких простых операций, возможно выполнять и более «тонкие» действия. Например, в ходе работы пользователя требуется оперативно определять факт того, что были поставки определенного поставщика в заданном временном интервале. При решении данной задачи у реквизита Поставщик регистра ТоварыНаСкладах свойству Индексировать следует установить значение Индексировать (рис. 11.28). В результате в базе данных будет создан составной индекс по полям Поставщик + Период + Регистратор + НомерСтроки. Данные этого индекса система использует при обращении к движениям и посредством запроса, и посредством выборки. Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления далее, как в отношении значений поля Период записей движений, так и в отношении Регистратор или НомерЗаписи. Чтобы добиться подобной гибкости в отношении границ временного интервала выборки, можно использовать различные варианты значений параметров НачалоИнтервала и КонецИнтервала. В параметр НачалоИнтервала передается начало интервала, в котором будут выбираться записи регистра накопления. Он может задаваться значениями типа Дата, МоментВремени и Граница. Если значение данного параметра не указано, то будут выбираться записи с самой ранней включительно. В параметр КонецИнтервала передается конец интервала, в котором будут выбираться записи регистра накопления. Он может задаваться значениями типа Дата, МоментВремени и Граница. Если значение данного параметра не указано, то будут выбираться записи по самую последнюю включительно. Рис. 11.28. Индексирование реквизита регистра накопления
Использование выборки позволит получить данные не медленнее, нежели посредством запроса (листинг 11.29).
В результате при передаче значений типа Дата или МоментВремени в выборку получим записи, включая значения НачалоИнтервала и КонецИнтервала (рис. 11.29).
Листинг 11.29. Получение движений регистра накопления с помощью выборки
ОтборПоПоставщику = Новый Структура("Поставщик", ПоставщикОтбора); ВыборкаДвижений = РегистрыНакопления.ТоварыНаСкладах.Выбрать(НачалоИнтервала, КонецИнтервала, ОтборПоПоставщику); Сообщение = Новый СообщениеПользователю(); Если ВыборкаДвижений.Следующий() Тогда Сообщение.Текст = "В указанном интервале были поставки от " + ПоставщикОтбора.Наименование; Иначе Сообщение.Текст = "В указанном интервале поставок от " + ПоставщикОтбора.Наименование + " не было"; КонецЕсли; Сообщение.Сообщить();
Очевидно, что в переменные ПоставщикОтбора, НачалоИнтервала, КонецИнтервала нужно передать соответствующие значения. ВНИМАНИЕ!
Необходимо помнить о том, что при использовании метода Выбрать() в качестве параметра Отбор может использоваться структура, имеющая только один элемент. Для более гибких или сложных отборов следует использовать получение данных посредством запроса.
Рис. 11.29. Получение записей, включая границы интервала
Если требуется получить записи, исключая граничные, необходимо использовать объект Граница. Пример получения выборки в интервале дат, исключая границы интервала, приведен в листинге 11.30 и на рис. 11.30. Листинг 11.30. Пример получения записей, исключая границы интервала
ГраницаНачалаИнтервала = Новый Граница(НачалоИнтервала,ВидГраницы.Исключая); ГраницаКонцаИнтервала = Новый Граница(КонецИнтервала, ВидГраницы.Исключая); ВыборкаДвижений = РегистрыНакопления.ТоварыНаСкладах.Выбрать(ГраницаНачалаИнтервала, ГраницаКонцаИнтервала); Пока ВыборкаДвижений.Следующий() Цикл // Выполнить действие с очередным движением. // ... КонецЦикла;
Теперь чуть подробнее остановимся на использовании параметров НачалоИнтервала и КонецИнтервала. При работе с запросом можно произвольным образом использовать условия больше/меньше, равно/не равно, больше или равно, между и так Том 1
Рис. 11.30. Получение записей, исключая границы интервала
571
Глава 11. Учет движения средств Кроме выборок всех записей можно при необходимости осуществлять выборку записей, подчиненных некоему документу. Это может быть реализовано посредством метода ВыбратьПоРегистратору().
А теперь рассмотрим один из примеров, когда в условиях усложнения задачи применение объектной модели обращения к информации базы данных уже менее эффективно, чем обращение посредством запроса.
Например, если в переменной РегистраторОтбора содержится ссылка на регистратор, по которому нужно отобрать все его движения, то код, получающий такую выборку, будет выглядеть следующим образом (листинг 11.31).
Например, в составе оборотного регистра Продажи есть реквизит ВидОперации (рис. 11.31).
Листинг 11.31. Пример получения движений по регистратору
ВыборкаДвижений = РегистрыНакопления.ТоварыНаСкладах. ВыбратьПоРегистратору(РегистраторОтбора); Пока ВыборкаДвижений.Следующий() Цикл // Выполнить действие с очередным движением. // ... КонецЦикла;
Поскольку, как обсуждалось выше, в разделе «Структура регистра накопления» на стр. 547, для таблицы движений регистра поле Регистратор является индексируемым, быстродействие подобной выборки будет достаточно высоким, не медленнее, чем применение запроса (листинг 11.32). Листинг 11.32. Пример получения движений регистратора с помощью запроса
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладах.Период, | ТоварыНаСкладах.Регистратор, | ТоварыНаСкладах.НомерСтроки, | ТоварыНаСкладах.Активность, | ТоварыНаСкладах.ВидДвижения, | ТоварыНаСкладах.Номенклатура, | ТоварыНаСкладах.Склад, | ТоварыНаСкладах.Количество, | ТоварыНаСкладах.Поставщик |ИЗ | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах |ГДЕ | ТоварыНаСкладах.Регистратор = &РегистраторОтбора"; Запрос.УстановитьПараметр("РегистраторОтбора", РегистраторОтбора); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // Выполнить действие с очередным движением. // ... КонецЦикла;
572
Рис. 11.31. Структура регистра «Продажи»
При проведении документов продажи формируются движения по этому регистру. Необходимо предпринять некие действия по фактам произведенных розничных продаж (вид операции – РеализацияВРозницу) с ценой меньше закупочной. Закупочная цена хранится в одноименных реквизитах элементов справочника Номенклатура. Поиск таких фактов посредством запроса может быть выполнен так, как показано в листинге 11.33. Листинг 11.33. Пример получения движений регистра накопления с помощью запроса
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Продажи.Регистратор, | Продажи.Номенклатура |ИЗ | РегистрНакопления.Продажи КАК Продажи |ГДЕ | Продажи.Период МЕЖДУ &ДатаНачала И &ДатаОкончания | И Продажи.ВидОперации = &РозничнаяПродажа | И Продажи.Сумма / Продажи.Количество < | Продажи.Номенклатура.ЗакупочнаяЦена"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.УстановитьПараметр("РозничнаяПродажа", Перечисления.ВидыОпераций.РеализацияВРозницу); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл
// Выполнить действия по факту продажи ниже закупочной цены. // ...
КонецЦикла;
Посредством выборки движений регистра аналогичный результат может быть получен так, как показано в листинге 11.34. Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Листинг 11.34. Пример получения движений регистра накопления с помощью выборки
Выборка = РегистрыНакопления.Продажи.Выбрать(ДатаНачала, ДатаОкончания); Пока Выборка.Следующий() Цикл Если Выборка.ВидОперации = Перечисления.ВидыОпераций.РеализацияВРозницу И Выборка.Сумма/Выборка.Количество < Выборка.Номенклатура.ЗакупочнаяЦена Тогда
Поле
Тип
Назначение
Произвольный, определяется типом измерения
Число
Произвольный, определяется типом реквизита
Каждое из полей содержит значения измерений регистра. Имена полей совпадают с именами измерений, заданными для объекта конфигурации Каждое из полей содержит значения ресурса регистра. Имена полей совпадают с именами ресурсов, заданными для объекта конфигурации Каждое из полей содержит значения реквизитов регистра. Имена полей совпадают с именами реквизитов, заданными для объекта конфигурации
// Выполнить действия по факту продажи ниже закупочной цены. // ...
КонецЕсли; КонецЦикла;
Использование выборки в данной ситуации является очень неэффективным решением. В первом случае условие превышения закупочной цены будет обеспечено выполнением неявного левого внешнего соединения всей таблицы регистра с таблицей справочника за один раз.
Основная таблица для оборотного регистра имеет почти аналогичный состав. Отличие заключается в том, что она не содержит поле ВидДвижения.
Во втором случае проверка условия
Получение остатков
справочника в базе данных для каждого элемента коллекции движений.
Получение итогов остатков регистра накопления, конечно же, возможно только в отношения регистра накопления остатков.
Выборка.Сумма/Выборка.Количество < Выборка.Номенклатура.ЗакупочнаяЦена потребует обращений к данным
Это был только один из примеров, когда в условиях более сложных задач чтения движений применение запросов более эффективно, нежели применение выборки. А вообще посредством запроса возможен доступ практически ко всему содержимому таблицы движений регистра накопления. Для этого используется так называемая основная таблица регистра накопления. Это реальная таблица, содержащая данные таблицы движений регистра в базе данных. Состав полей этой таблицы представлен в табл. 11.27. Таблица 11.27. Состав полей основной таблицы регистра накопления остатков Поле
Тип
Назначение
Содержит период, к которому относится запись регистра Регистратор ДокументСсылка. Содержит ссылку на документ-регистратор движения НомерСтроки Число Содержит номер строки, определяемый как порядковый номер записи в наборе записей, подчиненных документу-регистратору Активность Булево Содержит признак активности записи, то есть влияния на получение итогов регистра МоментВремени МоментВремени Виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ссылку на документ) ВидДвижения ВидДвиженияНакопления Содержит вид движения данной записи (Приход или Расход) Период
Том 1
Дата
Применение табличного или объектного подхода для решения этой задачи определяется сложностью и необходимой гибкостью совершаемых при этом действий.
Виртуальная таблица остатков Для получения данных по остаткам из регистра накопления остатков запросом используется виртуальная таблица остатков. Ее данные представляют собой итоги ресурсов в разрезе измерений (табл. 11.28). Таблица 11.28. Состав полей виртуальной таблицы «Остатки» регистра накопления остатков Поле
Тип
Назначение
Произвольный, Каждое из полей содержит значения измерений определяется регистра. Имена полей совпадают с именами измерений, типом измерения заданными для объекта конфигурации Остаток Число Имена полей совпадают с именами ресурсов, заданными для объекта конфигурации. Имена полей составляются из названий ресурсов с добавлением слова «Остаток»
Параметры виртуальной таблицы остатков представлены в табл. 11.29.
573
Глава 11. Учет движения средств
■■ подбирается больший или равный значению параметра Период момент времени, на который рассчитаны остатки; ■■ на этот момент времени получаются остатки из таблицы итогов; ■■ если момент времени, на который считаются остатки, не совпадает с моментом времени итогов, то остатки досчитываются по движениям за период с момента требуемого запроса остатков по момент итогов. Реализуется это за счет объединения отобранных записей таблицы итогов и таблицы движений регистра; ■■ группирование результата виртуальной таблицы выполняется согласно составу выходных полей запроса, использующего поля виртуальной таблицы. Для получения результата запроса система преобразует текст запроса, написанного на встроенном языке системы «1С:Предприятие», в запрос СУБД. В данный запрос включается соответствующий текст подзапроса, получающийся согласно описанному выше алгоритму. В отношении сортировки записей, полученных виртуальной таблицей остатков, необходимо заметить, что если разработчик в запросе не применит ключевые слова УПОРЯДОЧИТЬ ПО или АВТОУПОРЯДОЧИВАНИЕ, то в общем случае система не будет производить упорядочивание записей. То есть таблица результата виртуальной таблицы «самогруппируется», но не «самосортируется».
Таблица 11.30. Таблица движений регистра накопления
13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 23:59:59 01.06.2010 00:00:00 11.06.2010 13:59:00 11.09.2010 11:00:00
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 2 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 ПоступлениеТоваров № 3 31.05.2010 23:59:59 ПоступлениеТоваров № 4 01.06.2010 00:00:00 ПоступлениеТоваров № 5 11.06.2010 13:59:00 ПоступлениеТоваров № 5 11.09.2010 11:00:00
Количество
Сам алгоритм построения этой виртуальной таблицы включает в себя следующие этапы:
Например, в базе данных таблицы движений и итогов регистра остатков заполнены так, как показано в табл. 11.30 и 11.31.
Склад
Виртуальная таблица остатков не хранится в базе данных, а строится в момент обращения к ней. Для построения виртуальной таблицы всегда используются данные таблицы итогов регистра базы данных и, при необходимости, таблицы движений регистра. При этом учитываются значения параметров виртуальной таблицы.
■■ требуются ли только текущие итоги; ■■ требуются ли остатки на момент времени, находящийся до границы рассчитанных итогов; ■■ как много записей находится между требуемым моментом расчета итогов и ближайшим (более поздним) моментом уже рассчитанных итогов в таблице итогов.
Номенклатура
Используется для указания периода, НА значение которого будут рассчитаны остатки. Если параметр не задан, итоги рассчитываются ПО самую последнюю запись Конструкция языка Строится по полям измерений, регистра накопления запросов – условие (или по подчиненным им полям). Используется для ограничения состава исходных записей, по которым при построении виртуальной таблицы будут собираться итоги. Если параметр не указан, для сбора итогов будут анализироваться все активные записи регистра
Активность
Назначение
Вид движения
Дата, МоментВремени, Граница
Номер строки
Тип
Регистратор
Параметр
Можно сделать ряд выводов о скорости получения виртуальной таблицы остатков. Она зависит от следующих факторов:
Период
Таблица 11.29. Параметры виртуальной таблицы «Остатки» регистра накопления остатков
1
Приход
Истина
Пульт VH
Главный
10
2
Приход
Истина
Пульт PW
Главный
7
1
Приход
Ложь
Пульт VH
Фили-2
5
1
Расход
Истина
Пульт VH
Главный
9
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
1
Таблица 11.31. Таблица итогов регистра накопления Период
Номенклатура
Склад
Количество
01.06.2010 00:00:00 01.06.2010 00:00:00 01.06.2010 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00 01.11.3999 00:00:00
Пульт VH Пульт PW Пульт PW Пульт VH Пульт PW Пульт PW
Главный Главный Фили-2 Главный Главный Фили-2
1 7 1 1 7 5
Рассмотрим случай, когда требуется получить итоги регистра с помощью кода, приведенного в листинге 11.35.
574
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Листинг 11.35. Пример получения итогов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период) КАК ТоварыНаСкладахОстатки
В зависимости от значения, переданного параметру виртуальной таблицы остатков Период, система будет выполнять следующие действия: 1. Если передать значение Неопределено (листинг 11.36) или значение даты по умолчанию (листинг 11.37), то будут получены актуальные данные непосредственно из таблицы итогов, без обращений к таблице движений (табл. 11.32). Листинг 11.36. Установка параметра запроса значением «Неопределено»
Запрос.УстановитьПараметр("Период", Неопределено); Листинг 11.37. Установка параметра запроса значением даты по умолчанию
Запрос.УстановитьПараметр("Период", Дата(1, 1, 1)); Таблица 11.32. Результат выполнения запроса Номенклатура
Пульт VH Пульт PW Пульт PW
Склад
Главный Главный Фили-2
Количество
1 7 5
2. Если передать значение типа Дата, совпадающее с датой рассчитанных итогов (листинг 11.38), то будут получены данные на начало даты «1 июня 2010 года» непосредственно из таблицы итогов, без обращений к таблице движений (табл. 11.33). Листинг 11.38. Установка параметра запроса значением даты
Запрос.УстановитьПараметр("Период", Дата(2010, 6, 1)); Таблица 11.33. Результат выполнения запроса Номенклатура
Склад
Количество
Пульт VH Пульт PW Пульт PW
Главный Главный Фили-2
1 7 1
ПРИМЕЧАНИЕ
Заметьте, движения документа ПоступлениеТоваров № 4, сформированные на эту же дату, учтены не будут. Потому что момент времени этих движений позже начала даты.
Том 1
3. Если передать значение типа Дата, не совпадающее с датой рассчитанных итогов, то возможны несколько вариантов. Рассмотрим каждый из них. а) Значение даты находится в середине рассчитанного периода (листинг 11.39). Листинг 11.39. Установка параметра запроса значением даты
Запрос.УстановитьПараметр("Период", Дата(2010, 5, 20));
В этом случае сначала будут получены данные на начало даты «1 июня 2010 года» из таблицы итогов (табл. 11.34). Таблица 11.34. Данные, полученные из таблицы итогов Номенклатура
Склад
Количество
Пульт VH Пульт PW Пульт PW
Главный Главный Фили-2
1 7 1
Затем будут получены записи из таблицы движений в интервале между началом 20 мая 2010 и началом 1 июня 2010 года. Причем только те, у которых поле Активность имеет значение Истина. Поскольку «досчитываться» значения остатков будут в обратную сторону, то данные ресурсов таблицы движений получаются со знаком, обратным виду движения (табл. 11.35). Таблица 11.35. Данные, полученные из таблицы движений Номенклатура
Склад
Количество
Пульт VH Пульт PW
Главный Фили-2
9 -1
Далее эти записи объединяются, группируются, убираются записи, содержащие нулевые значения всех ресурсов (табл. 11.36). Таблица 11.36. Результат выполнения запроса Номенклатура
Склад
Количество
Пульт VH Пульт PW
Главный Главный
10 7
б) Значение даты (листинг 11.40).
находится
в
конце
рассчитанного
периода
Листинг 11.40. Установка параметра запроса значением даты
Запрос.УстановитьПараметр("Период", Дата(2010, 5, 31));
575
Глава 11. Учет движения средств В этом случае сначала будут получены данные на начало даты «1 июня 2010 года» из таблицы итогов (табл. 11.37). Таблица 11.37. Данные, полученные из таблицы итогов Номенклатура
Пульт VH Пульт PW Пульт PW
Склад
Количество
Главный Главный Фили-2
1 7 1
Затем будут получены записи из таблицы движений в интервале между началом 31 мая 2010 и началом 1 июня 2010 года, с учетом вида движении и «обратного подсчета» (табл. 11.38). Таблица 11.38. Данные, полученные из таблицы движений Номенклатура
Пульт PW
Склад
Количество
Фили-2
-1
Далее записи объединятся, и по этим данным будут посчитаны остатки на нужный период (табл. 11.39). Таблица 11.39. Результат выполнения запроса Номенклатура
Склад
Количество
Пульт VH Пульт PW
Главный Главный
1 7
в) Значение даты представляет собой конец дня последней даты рассчитанного периода (листинг 11.41). Листинг 11.41. Установка параметра запроса значением даты
Запрос.УстановитьПараметр("Период", КонецДня(Дата(2010, 5, 31)));
В этом случае сначала будут получены данные на начало даты «1 июня 2010 года» из таблицы итогов (табл. 11.40). Таблица 11.40. Данные, полученные из таблицы итогов Номенклатура Склад
Количество
Пульт VH Пульт PW Пульт PW
1 7 1
Главный Главный Фили-2
Затем будут получены записи из таблицы движений в интервале между концом 31 мая 2010 и началом 1 июня 2010 года с учетом вида движения и «обратного подсчета». К таким записям как раз и относится датированное последней секундой дня движение документа ПоступлениеТоваров № 3 (табл. 11.41).
576
Таблица 11.41. Данные, полученные из таблицы движений Номенклатура Склад
Количество
Пульт PW
-1
Фили-2
Далее записи объединятся, и по этим данным будут посчитаны остатки на нужный период (табл. 11.42). Таблица 11.42. Результат выполнения запроса Номенклатура Склад
Количество
Пульт VH Пульт PW
1 7
Главный Главный
г) Значение даты является началом даты нерассчитанного периода (листинг 11.42). Листинг 11.42. Установка параметра запроса значением даты
ПериодВключая = Новый Граница(Дата(2010, 6, 1), ВидГраницы.Включая) Запрос.УстановитьПараметр("Период", ПериодВключая);
Значение параметра больше, чем начало дня «01.06.2010», поэтому будут взяты данные из таблицы итогов на больший период, то есть текущие итоги (табл. 11.43). Таблица 11.43. Данные, полученные из таблицы итогов Номенклатура Склад
Количество
Пульт VH Пульт PW Пульт PW
1 7 5
Главный Главный Фили-2
Будут взяты записи из таблицы движений, в интервале между значением параметра и периодом текущих итогов (с учетом операции «обратного подсчета»). Заметьте, движения, датированные «01.06.2010 00:00:00», сюда не попадают (табл. 11.44). Таблица 11.44. Данные, полученные из таблицы движений Номенклатура Склад
Количество
Пульт PW Пульт PW
-1 -1
Фили-2 Фили-2
Далее записи объединятся, и по этим данным будут посчитаны остатки на нужный период (табл. 11.45).
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Таблица 11.45. Результат выполнения запроса Номенклатура Склад
Пульт VH Пульт PW Пульт PW
Количество
Главный 1 Главный 7 Фили-2 3
Аналогично поступила бы система, если бы в качестве параметра было передано значение типа МоментВремени с датой 01.06.2010 00:00:00 и ссылкой на какой-нибудь документ. Кроме того, хотелось бы заметить, что если бы в последнем примере граница рассчитанных итогов стояла бы не в конце мая, а хотя бы в конце июня, то не пришлось бы досчитывать от текущих итогов. Достаточно было бы досчитать от ближайшего, но большего периода рассчитанных итогов. Использование в любых «неровных» ситуациях именно обратного досчета объясняется тем, что при решении оперативных задач вправе ожидать более напряженной работы с текущими итогами или близкими к текущему моменту, нежели получение остатков прошлых месяцев или даже лет. Усложнение же механизма расчета итогов остатков «анализатором» ситуации (от какого периода итогов ближе до нужного значения параметра) нецелесообразно, поскольку для обеспечения работы «анализатора» пришлось бы получать записи таблицы движений в обе стороны (и назад, и вперед). То есть «анализатор» сам работал бы дольше, чем «обратный досчет». Однако пересчет текущих итогов (если у регистра установлен признак использования итогов) каждый раз при записи набора активных записей в таблице движений может быть неэффективным. Например, когда период рассчитанных итогов регулярно устанавливается обработкой и есть уверенность в хранении посчитанных итогов на начало каждого месяца, может быть выгоднее «досчитывать» остатки от хранимых итогов. В таком случае можно не устанавливать использование текущих итогов для регистра остатков – УстановитьИспользованиеТекущихИтогов(Ложь). Если использование текущих итогов выключено, то расчет актуальных остатков будет производиться следующим образом: сначала будут получены остатки на самые поздние хранимые итоги, а потом по движениям за оставшийся период будут получены актуальные остатки. Данный подход позволяет увеличить параллельность при записи наборов записей данного регистра, так как не требуется обновления текущих итогов. Получить признак использования текущих итогов из встроенного языка можно методом менеджера регистра накопления остатков ПолучитьИспользованиеТекущихИтогов(). Включить или выключить использование текущих итогов можно методом УстановитьИспользованиеТекущихИтогов(Истина/Ложь), а также в стандартной функции управления итогами Том 1
(Все функции Стандартные Управление итогами Полные возможности Текущие итоги Включить использование текущих итогов/Выключить использование текущих итогов).
Таким образом, можно сделать вывод, что быстродействие получения остатков реальным временем (актуальных) вообще не зависит от общего объема накопленной в базе данных информации. Для получения же данных на прошедшие моменты времени при использовании расчета промежуточных ежемесячных итогов среднее быстродействие построения виртуальной таблицы получения остатков определяется не общим объемом базы данных, а количеством движений по регистру, формируемым в течение месяца. Это очень важно для недопущения деградации системы при многолетней эксплуатации базы данных. Кроме того, хотелось бы обратить внимание, что на каждом этапе выполнения алгоритма, когда система получает данные из той или иной таблицы базы данных, применяются отборы только тех записей, которые удовлетворяют условиям, описанным в параметрах виртуальной таблицы остатков.
Использование метода «Остатки()» менеджера регистра накопления Если при получении данных об остатках не применяется сложных отборов либо эти данные впоследствии не нужно соединять с другими данными, можно использовать также и объектную модель доступа к данным – метод Остатки() менеджера регистра накопления. Например, если требуется сообщить остатки на складах по некой товарной позиции, как это показано в листинге 11.43. Листинг 11.43. Пример получения остатков регистра накопления с использованием объектной модели
Отбор = Новый Структура("Номенклатура", ТоварОтбора); ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(МоментВремени, Отбор, "Склад", "Количество"); Для Каждого СтрокаТаблицы Из ТаблицаОстатков Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Склад " + СтрокаТаблицы.Склад + ": Остаток " + СтрокаТаблицы.Количество; Сообщение.Сообщить(); КонецЦикла;
Метод Остатки() возвращает таблицу значений, содержащую данные об остатках регистра, вычисленных на момент значения параметра МоментВремени. При этом будет использован отбор, согласно значению параметра Отбор, а сама таблица значений свернута по полю Склад, с суммированием значений поля Количество.
577
Глава 11. Учет движения средств Механизм построения результата метода Остатки() практически тот же, что и в случае применения виртуальной таблицы получения остатков. В качестве типов значения переменных, передаваемых параметру МоментВремени, возможны те же, что использовались для виртуальной таблицы получения остатков. То есть Дата, МоментВремени, Граница. Особенности применения различных значений и их использование системой при подсчете данных будут рассмотрены ниже, в разделе «Особенности использования периодов и моментов времени при получении остатков» на стр. 578. Различия проявляются в условиях отбора информации. Посредством параметра Отбор типа Структура можно строить только простейшие отборы на равенство значений измерений. Например, как показано в листинге 11.44. Листинг 11.44. Пример получения остатков регистра накопления
Отбор = Новый Структура("Номенклатура, Склад", ТоварОтбора, СкладОтбора);
Но варианты более сложных отборов, например, отбор по двум значениям измерения Номенклатура, для метода Остатки() неприемлемы.
Листинг 11.46. Пример получения остатков на «Период» методом «Остатки()»
ТаблицаОстатков = РегистрыНакопления.ТоварыНаСкладах.Остатки(Период);
Параметр Период виртуальной таблицы остатков и метода Остатки() может получать значения типа Дата, МоментВремени и Граница, кроме того, может быть вообще не указан, или иметь значение Неопределено, или содержать значение даты по умолчанию '00010101000000'. Последние три случая (не указан, или Неопределено, или значение даты по умолчанию) приводят к построению таблицы остатков с данными актуальных остатков (учитывающих все активные записи регистра). Если в качестве параметра передается значение типа Дата, важно помнить следующие моменты. Дата в системе «1С:Предприятие» включает в свой состав время. Даже если время не указано явно, оно принимает значение 00:00:00. То есть если в качестве параметра передать «31 декабря 2009 года» (данное значение может быть получено так: '20091231'), то в результате таблица остатков будет построена на дату 31.12.2009 00:00:00 (рис. 11.32).
Последние два параметра метода Остатки() касаются операции свертки полученных в запросе СУБД данных перед выгрузкой в таблицу значений. Однако если значения данных параметров не указывать, то результирующая таблица значений будет содержать колонки, соответствующие всем измерениям и/или всем ресурсам. Недостаточная гибкость объектной модели чтения итогов регистров объясняется тем, что в платформе на объектные методы возлагаются в основном задачи обеспечения записи, модификации и динамического чтения данных реальных таблиц базы данных. А задачи гибкого, тонкого, эффективного чтения для обеспечения последующего анализа состояния учитываемых в системе показателей возлагаются на более подходящие для этого инструменты – объекты Запрос, ПостроительОтчета, АнализДанных и т. п.
Особенности использования периодов и моментов времени при получении остатков Рассмотрим различные ситуации получения остатков запросом (листинг 11.45) или с помощью метода Остатки(), листинг 11.46.
Рис. 11.32. Получение остатков на дату
Таблица получения остатков строится на начало даты, то есть не включая дату границы интервала. Выше приведены примеры использования запроса к виртуальной таблице остатков и использования метода Остатки(). И в том и другом случае, если в таблице движений регистра будут присутствовать записи со значением поля Период, равным дате 31.12.2009 23:59:59, они не будут учтены (рис. 11.33), если получать данные на конец дня.
Листинг 11.45. Пример получения остатков на «Период» запросом
Если необходимо учесть и их тоже, следует применять параметр с типом значения Граница.
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период) КАК ТоварыНаСкладахОстатки
Параметр «Период» типа «МоментВремени» для получения остатков используют, если требуются итоги, полученные с точностью большей, чем до секунды. Например, если несколько документов имеют одинаковое время, но при проведении каждого из них требуется получать данные, актуальные на момент времени документа (рис. 11.34).
578
Период
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления
Рис. 11.33. Получение остатков, не включая дату границы интервала
Номенклатура
Склад
Количество
ПоступлениеТоваров № 2 1 23.05.2010 15:30:45 Реализация № 1 1 27.05.2010 12:30:45 Реализация № 2 1 27.05.2010 12:30:45
Активность
Регистратор
23.05.2010 15:30:45 27.05.2010 12:30:45 27.05.2010 12:30:45
Вид движения
Период
Номер строки
Таблица 11.46. Таблица движений регистра накопления
Приход
Истина
Пульт VH
Фили-2
5
Расход
Истина
Пульт VH
Фили-2
4
Расход
Истина
Пульт VH
Фили-2
1
Таблица 11.47. Полученные итоги Номенклатура
Склад
Количество
Пульт VH
Фили-2
5
Если получить остатки на момент времени, включающий дату 27.05.2010 12:30:45 и ссылку на документ Реализация № 1, получим такие же итоги (табл. 11.47).
Рис. 11.34. Момент времени документа
Объект МоментВремени состоит из даты и ссылки на документ и может быть получен посредством применения метода МоментВремени() ссылки или объекта документа (листинг 11.47). Листинг 11.47. Получение момента времени документа
МоментВремениДокумента = СсылкаНаДокумент.МоментВремени();
Также значение типа МоментВремени может быть получено с помощью конструктора (листинг 11.48).
А вот если получить остатки на момент времени, включающий дату 27.05.2010 12:30:45 и ссылку на документ Реализация № 2, получим следующий результат (табл. 11.48). Таблица 11.48. Полученные итоги Номенклатура
Склад
Количество
Пульт VH
Фили-2
1
При получении таблицы остатков с указанием параметра Период типа МоментВремени, полученного из даты документа и ссылки на документ, необходимо иметь в виду, что данные получаются, исключая записи движений самого документа (рис. 11.35).
Листинг 11.48. Получение момента времени с помощью конструктора
МоментВремениДокумента = Новый МоментВремени(СсылкаНаДокумент.Дата, Документ);
В случае использования конструктора возможно указание даты, не совпадающей с датой документа. Рассмотрим следующий пример получения остатков на момент времени документа. Например, есть следующие записи таблицы движений регистра остатков (табл. 11.46). Если получить остатки на дату 27.05.2010 12:30:45, то получим следующий результат (табл. 11.47). Рис. 11.35. Получение остатков на момент времени документа
Том 1
579
Глава 11. Учет движения средств Для случаев, когда необходимо получить данные об остатках, включая движения, относящиеся к дате или моменту времени, применяют значения параметра «Период» с типом значения «Граница». Объект Граница получается посредством применения соответствующего конструктора. Именно в конструкторе указывается вид границы. В случае получения остатков на конец дня граница может быть создана так, как показано в листинге 11.49. Листинг 11.49. Создание границы с помощью конструктора
ГраницаПоДату = Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая);
В этом случае остатки будут получены, включая движения на дату формирования отчета (рис. 11.36).
Рис. 11.37. Получение остатков, включая движения указанного документа
Получение оборотов Задачи получения итогов оборотов могут решаться и для регистров остатков, и для оборотных регистров. И в том и в другом случае возможно чтение информации как посредством запроса, так и посредством метода Обороты(). Разберем подробнее, в чем разница применения этих подходов.
Виртуальная таблица оборотов
Рис. 11.36. Получение остатков, включая движения на дату формирования отчета
В случае получения остатков на момент времени документа граница может быть создана так, как показано в листинге 11.50. Листинг 11.50. Создание границы с помощью конструктора
ГраницаПоДокумент = Новый Граница(СсылкаНаДокумент.МоментВремени(), ВидГраницы.Включая);
В этом случае остатки будут получены, включая движения указанного документа (рис. 11.37).
580
Виртуальная таблица оборотов регистра накопления остатков позволяет получать итоговые значения оборотов ресурсов (далее будем называть «оборотов») за временной интервал (далее будем называть «период»). Итоговые значения могут быть получены в разрезе комбинаций значений измерений и/или в развороте дополнительной периодичности. Виртуальная таблица оборотов регистра накопления остатков имеет следующий состав полей: ■■ Период – это поле имеет тип Дата. Оно существует только в случаях, если указано значение параметра виртуальной таблицы оборотов Периодичность: Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Секунда, Минута, Час, Регистратор или Запись. Данное поле содержит начальную дату периода, к которому относится оборот регистра; ■■ Регистратор – это поле имеет тип ДокументСсылка.. Оно существует только в случаях, если указано значение параметра виртуальной таблицы оборотов Периодичность: Регистратор или Запись. Данное поле содержит ссылку на документ-регистратор, к которому относится оборот регистра; ■■ НомерСтроки – это поле имеет тип Число. Оно существует только в тех случаях, когда указано значение параметра виртуальной таблицы оборотов Периодичность: Запись. Содержит значение поля НомерСтроки записи движения регистра; Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления ■■ – это поле может иметь произвольный тип, который определяется типом измерения. Количество таких полей равно количеству измерений регистра накопления. Каждое из этих полей содержит значения измерений регистра. Имена полей совпадают с названиями измерений, заданными для объекта конфигурации; ■■ Оборот – это поле имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма приходов за минусом суммы расходов ресурса регистра накопления по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Оборот»; ■■ Приход – это поле имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма приходов ресурса регистра накопления по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Приход»; ■■ Расход – это поле имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма расходов ресурса регистра накопления по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Расход». В отличие от регистра накопления остатков, оборотный регистр накапливает только обороты. То есть для ресурсов оборотного регистра не существует понятий «Приход» и «Расход». Поэтому состав полей виртуальной таблицы оборотов оборотного регистра накопления несколько короче состава полей аналогичной таблицы регистра накопления остатков: ■■ Период – это поле имеет тип Дата. Оно существует только в случаях, если указано значение параметра виртуальной таблицы оборотов Периодичность: Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Секунда, Минута, Час, Регистратор или Запись. Данное поле содержит начальную дату периода, к которому относится оборот регистра; ■■ Регистратор – это поле имеет тип ДокументСсылка.. Оно существует только в случаях, если указано значение параметра виртуальной таблицы оборотов Периодичность: Регистратор или Запись. Данное поле содержит ссылку на документ-регистратор, к которому относится оборот регистра; ■■ НомерСтроки – это поле имеет тип Число. Оно существует только в случаях, если указано значение параметра виртуальной таблицы оборотов Периодичность: Запись. Содержит значение поля НомерСтроки записи движения регистра; Том 1
■■ – это поле может иметь произвольный тип, который определяется типом измерения. Количество таких полей равно количеству измерений регистра накопления. Каждое из этих полей содержит значения измерений регистра. Имена полей совпадают с названиями измерений, заданными для объекта конфигурации; ■■ Оборот – это поле имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма значений ресурса регистра накопления по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Оборот». Параметры виртуальной таблицы оборотов для любого регистра накопления следующие: ■■ НачалоПериода – это поле может иметь тип Дата, МоментВремени или Граница. Используется для указания начала периода расчета оборотов. Значение этого параметра по умолчанию включается в период расчета оборотов. Если параметр не задан, обороты рассчитываются с самой первой записи; ■■ КонецПериода – Дата, МоментВремени, Граница. Используется для указания конца периода расчета оборотов. Значение этого параметра по умолчанию включается в период расчета оборотов. Если параметр не задан, обороты рассчитываются по самую последнюю запись; ■■ Периодичность – содержит конструкцию языка запросов. Задается одним из следующих вариантов: Период, Запись, Регистратор, Секунда, Минута, Час, День, Неделя, Декада, Месяц, Квартал, Полугодие, Год. Используется для указания дополнительного разворота оборотов по периодичности. При указании значения Период обороты представляются за весь период (с НачалоПериода по КонецПериода) без дополнительных разворотов. В остальных случаях с разворотом по записям, регистраторам, неделям, декадам, месяцам, кварталам, полугодиям, годам соответственно. Значение по умолчанию – Период; ■■ Условие – содержит конструкцию языка запросов – условие. Строится по полям измерений, регистра накопления (или подчиненных им полям). Используется для ограничения состава исходных записей, по которым при построении виртуальной таблицы оборотов будут собираться обороты. Если параметр не указан, для сбора оборотов будут анализироваться все активные записи регистра. Виртуальная таблица оборотов не хранится в базе данных, а строится в момент обращения к ней. В качестве иллюстрации работы виртуальной таблицы оборотов рассмотрим следующий пример. Пусть таблица движений регистра ТоварыНаСкладах заполнена так, как показано в табл. 11.49.
581
Глава 11. Учет движения средств
Приход
Истина
Пульт PW
Главный
7
1
Приход
Ложь
Пульт VH
Фили-2
5
1
Расход
Истина
Пульт VH
Главный
9
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
1
Для получения оборотов используется запрос, текст которого представлен в листинге 11.51. Листинг 11.51. Пример получения оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОбороты.Период, ТоварыНаСкладахОбороты.Номенклатура, ТоварыНаСкладахОбороты.Склад, ТоварыНаСкладахОбороты.КоличествоОборот, ТоварыНаСкладахОбороты.КоличествоПриход, ТоварыНаСкладахОбороты.КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.Обороты( , , Месяц, ) КАК ТоварыНаСкладахОбороты
Тогда в результате выполнения приведенного запроса будет получен следующий результат (табл. 11.50). Таблица 11.50. Результат выполнения запроса Период
Номенклатура Склад
01.05.2010 00:00:00 01.05.2010 00:00:00 01.05.2010 00:00:00 01.06.2010 00:00:00 01.09.2010 00:00:00
Пульт VH
Главный
Пульт PW
582
Количество оборот
Количество приход
Количество расход
Главный
7
7
0
Пульт PW
Фили-2
1
1
0
Пульт PW
Фили-2
3
3
0
Пульт PW
Фили-2
1
1
0
1
10
9
Это верно даже для ситуации, когда поле Период записей движений, подчиненных одному регистратору, заполнено разными значениями. В качестве иллюстрации рассмотрим следующий пример. Пусть таблица движений регистра накопления содержит записи, приведенные в табл. 11.51. Таблица 11.51. Таблица движений регистра накопления
13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 11:30:45 23.05.2010 11:30:45 23.05.2010 11:30:45
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 РучнаяОперация № 1 23.05.2010 11:30:45 РучнаяОперация № 1 23.05.2010 11:30:45 РучнаяОперация № 1 23.05.2010 11:30:45
Количество
2
Склад
10
Номенклатура
Главный
Активность
Пульт VH
Вид движения
Количество
Истина
Номер строки
Склад
Приход
В случае же использования дополнительного разворота итогов по регистраторам или записям в поле Период содержится значение поля Период записи движения по регистру.
Регистратор
Номенклатура
1
Как видите, в данном примере при использовании дополнительного разворота итогов по месяцам в поле Период для каждой записи указывается начальная дата месяца.
Период
Активность
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 2 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 ПоступлениеТоваров № 3 31.05.2010 23:59:59 ПоступлениеТоваров № 4 01.06.2010 00:00:00 ПоступлениеТоваров № 5 11.06.2010 13:59:00 ПоступлениеТоваров № 5 11.09.2010 11:00:00
Вид движения
Регистратор
13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 23:59:59 01.06.2010 00:00:00 11.06.2010 13:59:00 11.09.2010 11:00:00
Номер строки
Период
Таблица 11.49. Таблица движений регистра «ТоварыНаСкладах»
1
Приход
Истина
Пульт VH
Главный
10
2
Приход
Истина
Пульт PW
Главный
7
1
Приход
Истина
Пульт VH
Фили-2
5
2
Расход
Истина
Пульт PW
Главный
7
3
Расход
Истина
Пульт VH
Фили-2
1
Для получения оборотов используется запрос, текст которого представлен в листинге 11.52. Листинг 11.52. Пример получения оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОбороты.Период, ТоварыНаСкладахОбороты.Регистратор, ТоварыНаСкладахОбороты.Номенклатура, ТоварыНаСкладахОбороты.Склад, ТоварыНаСкладахОбороты.КоличествоОборот, ТоварыНаСкладахОбороты.КоличествоПриход, ТоварыНаСкладахОбороты.КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.Обороты( , , Регистратор, ) КАК ТоварыНаСкладахОбороты
Тогда в результате выполнения приведенного запроса будет получен следующий результат (табл. 11.52). Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Итак, результаты и методики применения виртуальной таблицы оборотов для регистров остатков и оборотных регистров весьма схожи. Но вот алгоритмы получения этих результатов средствами системы сильно разнятся.
Для сравнения в листинге 11.53.
Количество оборот
Количество приход
Количество расход
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 РучнаяОперация № 1 23.05.2010 11:30:45 РучнаяОперация № 1 23.05.2010 11:30:45
Склад
Регистратор
13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 11:30:45 23.05.2010 11:30:45
Номенклатура
Период
Таблица 11.52. Результат выполнения запроса
Пульт VH
Главный
10
10
0
Пульт PW
Главный
7
7
0
Пульт VH
Фили-2
4
5
1
Пульт PW
Главный
-7
0
7
выполним
запрос,
текст
которого
Алгоритм, применяемый системой для получения оборотов регистра накопления остатков Для построения виртуальной таблицы оборотов регистра накопления остатков всегда используются данные таблицы движений регистра (из базы данных). При этом учитываются значения параметров виртуальной таблицы оборотов. Сам алгоритм построения этой виртуальной таблицы включает в себя следующие этапы:
приведен
Листинг 11.53. Пример получения оборотов регистра накопления
■■ получение записей из таблицы движений регистра согласно установленным значениям параметров виртуальной таблицы; ■■ группирование полученных записей согласно указанной в параметрах виртуальной таблицы периодичности.
ВЫБРАТЬ ТоварыНаСкладахОбороты.Регистратор, ТоварыНаСкладахОбороты.Номенклатура, ТоварыНаСкладахОбороты.Склад, ТоварыНаСкладахОбороты.КоличествоОборот, ТоварыНаСкладахОбороты.КоличествоПриход, ТоварыНаСкладахОбороты.КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.Обороты( , , Регистратор, ) КАК ТоварыНаСкладахОбороты
Сортировка не выполняется. И хотя зачастую порядок записей в результате оказывается соответствующим желаемому, для гарантированного упорядочивания в тексте запроса нужно указывать ключевые слова УПОРЯДОЧИТЬ ПО или АВТОУПОРЯДОЧИВАНИЕ.
Результат выполнения этого запроса представлен в табл. 11.53.
Для обеспечения максимальной скорости выполнения запроса по этой виртуальной таблице также важно правильное применение отборов по измерениям.
Регистратор
Номенклатура
Склад
Количество оборот
Количество приход
Количество расход
Таблица 11.53. Результат выполнения запроса
ПоступлениеТоваров № 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 13.05.2010 15:00:01 РучнаяОперация № 1 23.05.2010 11:30:45 РучнаяОперация № 1 23.05.2010 11:30:45
Пульт VH Пульт PW Пульт VH Пульт PW
Главный Главный Фили-2 Главный
10 7 4 -7
10 7 5 0
0 0 1 7
Как видите, записи результата запроса оказываются сгруппированы по полям Период и Регистратор, даже если нет выходного поля Период. Это объясняется тем, что для определения момента времени, с которого движения регистра начинают действовать на итоги, «регистратор» является уточнением «периода». Том 1
Таким образом, скорость построения виртуальной таблицы оборотов регистра накопления остатков не зависит от периода рассчитанных итогов, а зависит от количества записей движений регистра, попавших в требуемый период построения таблицы.
подробнее
Правила применения таких отборов описаны в разделе «Применение отборов в запросах, использующих виртуальные таблицы регистров накопления», стр. 602.
Алгоритм, применяемый системой для получения оборотов оборотного регистра накопления Для построения виртуальной таблицы оборотов оборотного регистра накопления могут использоваться или только данные таблицы движений регистра, или только таблицы итогов (из базы данных), или и данные таблицы движений, и таблицы итогов. Для эффективного применения той или иной стратегии учитываются значения параметров виртуальной таблицы оборотов.
583
Глава 11. Учет движения средств Сам алгоритм построения этой виртуальной таблицы включает в себя следующие этапы: ■■ получение записей из базы данных из таблицы движений или таблицы итогов регистра согласно установленным значениям параметров виртуальной таблицы; ■■ группирование полученных записей согласно указанной в параметрах виртуальной таблицы периодичности. При выполнении первого этапа анализируется, можно ли использовать данные таблицы итогов регистра для формирования запроса. В таблице итогов регистра хранятся данные месячных оборотов. Эти данные будут использованы в случаях, когда дополнительная периодичность не задана или задана равной или большей месяцу и в интервал формирования виртуальной таблицы попадают целые месяцы. Остальная информация при необходимости получается из таблицы движений. В качестве иллюстрации работы виртуальной таблицы оборотов рассмотрим следующие примеры. Пусть таблица движений оборотного регистра Продажи заполнена следующим образом (табл. 11.54).
Номенклатура
Контрагент
Количество
Сумма
Реализация № 1 27.05.2010 12:30:45 Реализация № 2 29.05.2010 15:00:01 Реализация № 3 13.06.2010 15:00:00 Реализация № 3 23.06.2010 10:00:00 Реализация № 4 23.06.2010 15:30:45 Реализация № 5 01.08.2010 08:59:59
Активность
Регистратор
27.05.2010 12:30:45 29.05.2010 15:00:01 13.06.2010 15:00:00 23.06.2010 10:00:00 23.06.2010 15:30:45 01.08.2010 08:59:59
Номер строки
Период
Таблица 11.54. Таблица движений оборотного регистра «Продажи»
1
Истина
Пульт VH
Ялта-Лтд
9
135
1
Истина
Пульт VH
Компания "Риона" 10
150
1
Истина
Пульт VH
Компания "Риона" 1
15
1
Истина
Пульт VH
Компания "Риона" 1
15
1
Ложь
Пульт PW
Крона
1
90
1
Истина
Пульт PW
Ялта-Лтд
1
95
Соответственно, таблица итогов будет заполнена так, как показано в табл. 11.55.
584
Таблица 11.55. Таблица итогов оборотного регистра накопления «Продажи» Период
Номенклатура
Контрагент
Количество
Сумма
01.05.2010 00:00:00 01.05.2010 00:00:00 01.06.2010 00:00:00 01.08.2010 00:00:00
Пульт VH
Ялта-Лтд
9
135
Пульт VH
Компания "Риона"
10
150
Пульт VH
Компания "Риона"
2
30
Пульт PW
Ялта-Лтд
1
95
Рассмотрим выполнение запроса, представленного в листинге 11.54. Листинг 11.54. Пример получения оборотов регистра накопления
ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Сумма ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты
1. Если параметрам запроса присвоить значения даты по умолчанию или Неопределено (листинг 11.55), то алгоритм построения виртуальной таблицы оборотов будет использовать данные только таблицы итогов (табл. 11.56). Листинг 11.55. Пример установки параметров запроса
Запрос.УстановитьПараметр("НачалоПериода", Неопределено); Запрос.УстановитьПараметр("КонецПериода", Неопределено); Таблица 11.56. Промежуточная выборка данных из таблицы итогов Номенклатура
Количество
Сумма
Пульт VH Пульт VH Пульт VH Пульт PW
9 10 2 1
135 150 30 95
После этапа группирования результат виртуальной таблицы будет выглядеть так, как показано в табл. 11.57. Таблица 11.57. Результат выполнения запроса Номенклатура Количество
Сумма
Пульт VH Пульт PW
315 95
21 1
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления 2. Если параметрам запроса присвоить значения так, что в период входит только целое число месяцев (листинг 11.56), то алгоритм построения виртуальной таблицы будет использовать данные только таблицы итогов (табл. 11.58). Листинг 11.56. Пример установки параметров запроса
Запрос.УстановитьПараметр("НачалоПериода", Дата(2010, 5, 01)); Запрос.УстановитьПараметр("КонецПериода", Дата(2010, 6, 30, 23, 59, 59)); Таблица 11.58. Промежуточная выборка данных из таблицы итогов Номенклатура Количество Сумма
Пульт VH Пульт VH Пульт VH
9 10 2
135 150 30
Записи этих таблиц будут объединены, и после этапа группирования результат виртуальной таблицы будет выглядеть так, как показано в табл. 11.62. Таблица 11.62. Результат выполнения запроса Номенклатура Количество
Сумма
Пульт VH
315
21
Обратите внимание: результат не отличается от результата предыдущего примера. Однако из-за того, что значение параметра НачалоПериода не совпадало с началом месяца, система была вынуждена обращаться как к таблице итогов, так и к таблице движений регистра.
После этапа группирования результат виртуальной таблицы будет выглядеть так, как показано в табл. 11.59.
4. Если параметрам запроса присвоить значения так, что в период не входит целое число месяцев (листинг 11.58), то алгоритм построения виртуальной таблицы оборотов будет использовать только данные таблицы движений регистра (табл. 11.63).
Таблица 11.59. Результат выполнения запроса
Листинг 11.58. Пример установки параметров запроса
Номенклатура Количество Сумма
Пульт VH
21
315
3. Если параметрам запроса присвоить значения так, что в период входит не только целое число месяцев (листинг 11.57), то алгоритм построения виртуальной таблицы оборотов будет сначала использовать данные таблицы итогов по целым месяцам (в нашем случае – за июнь), табл. 11.60. Листинг 11.57. Пример установки параметров запроса
Запрос.УстановитьПараметр("НачалоПериода", Дата(2010, 5, 20)); Запрос.УстановитьПараметр("КонецПериода", Дата(2010, 6, 30, 23, 59, 59)); Таблица 11.60. Промежуточная выборка данных из таблицы итогов Номенклатура
Количество
Сумма
Пульт VH
2
30
Затем по не поместившимся в целые месяцы движениям данные будут получены из таблицы движений (табл. 11.61). Таблица 11.61. Промежуточная выборка данных из таблицы движений Номенклатура Количество
Сумма
Пульт VH Пульт VH
135 150
Том 1
9 10
Запрос.УстановитьПараметр("НачалоПериода", Дата(2010, 5, 20)); Запрос.УстановитьПараметр("КонецПериода", Дата(2010, 6, 23, 23, 59, 59)); Таблица 11.63. Промежуточная выборка данных из таблицы движений Номенклатура
Количество
Сумма
Пульт VH Пульт VH Пульт VH Пульт VH
9 10 1 1
135 150 15 15
После этапа группирования результат виртуальной таблицы будет выглядеть так, как показано в табл. 11.64. Таблица 11.64. Результат выполнения запроса Номенклатура Количество Сумма
Пульт VH
21
315
Как видите, хотя интервал между значениями параметров превышал 30 дней, он не включал в себя целых месяцев. Этого было достаточно, чтобы виртуальная таблица оборотов строилась по таблице движений. 5. Если параметр Периодичность имеет значение, меньшее месяца (листинг 11.59), то независимо от значений параметров НачалоПериода и КонецПериода виртуальная таблица оборотов будет строиться по записям таблицы движений регистра.
585
Номенклатура
Склад
Количество
1
Расход
Истина
Пульт VH
Главный
9
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
1
Тогда после выполнения кода, приведенного в листинге 11.60, будет получен результат, показанный в табл. 11.66.
подробнее
Правила применения таких отборов описаны в разделе «Применение отборов в запросах, использующих виртуальные таблицы регистров накопления», стр. 602.
Метод «Обороты()»
Листинг 11.60. Пример получения оборотов регистра накопления
ТаблицаОборотов = РегистрыНакопления.ТоварыНаСкладах.Обороты(); Таблица 11.66. Результат выполнения метода «Обороты()»
В ситуациях, когда при получении данных об оборотах не применяется сложных отборов либо эти данные впоследствии не нужно соединять с другими данными, а дополнительная периодичность оборотов не требуется, можно использовать объектную модель чтения информации – метод Обороты(). Данный метод применим только для регистров накопления, у которых включено использование итогов. При получении результата используются только записи активных движений. Например, пусть таблица движений регистра ТоварыНаСкладах заполнена следующим образом (табл. 11.65).
Активность
Номенклатура
Склад
Количество
ПоступлениеТоваров № 1 1 13.05.2010 15:00:01 ПоступлениеТоваров № 1 2 13.05.2010 15:00:01 ПоступлениеТоваров № 2 1 23.05.2010 15:30:45
Вид движения
Регистратор
Номер строки
Период
13.05.2010 15:00:01 13.05.2010 15:00:01 23.05.2010 15:30:45
Номенклатура
Склад
Количество Приход Количество Расход
Пульт VH Пульт PW Пульт PW
Главный Главный Фили-2
10 7 5
9 0 0
Кроме полных оборотов, посредством метода Обороты() возможно и получение данных в некотором временном интервале, с отбором на равенство значений измерений. Например, если требуется сообщить обороты по некой товарной позиции (ссылка на нее – в переменной ТоварОтбора) в интервале между НачалоПериода и КонецПериода (листинг 11.61). Листинг 11.61. Пример получения оборотов регистра накопления
Таблица 11.65. Таблица движений регистра накопления
586
Реализация № 1 27.05.2010 12:30:45 ПоступлениеТоваров № 3 31.05.2010 23:59:59 ПоступлениеТоваров № 4 01.06.2010 00:00:00 ПоступлениеТоваров № 5 11.06.2010 13:59:00 ПоступлениеТоваров № 5 11.08.2010 11:00:00
Активность
Для обеспечения максимальной скорости выполнения запроса по этой виртуальной таблице также важно правильное применение отборов по измерениям.
27.05.2010 12:30:45 31.05.2010 23:59:59 01.06.2010 00:00:00 11.06.2010 13:59:00 11.08.2010 11:00:00
Вид движения
Таким образом, видно, что получение виртуальной таблицы оборотов оборотного регистра может выполняться гораздо быстрее, нежели виртуальной таблицы оборотов регистра остатков, за счет использования накопленных месячных итогов оборотов.
Регистратор
ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СуммаОборот КАК Сумма ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Неделя, ) КАК ПродажиОбороты
Период
Листинг 11.59. Пример установки параметров запроса
Номер строки
Глава 11. Учет движения средств
Приход
Истина
Пульт VH
Главный
10
Приход
Истина
Пульт PW
Главный
7
Приход
Ложь
Пульт VH
Фили-2
5
Отбор = Новый Структура("Номенклатура",ТоварОтбора); ТаблицаОборотов = РегистрыНакопления.ТоварыНаСкладах.Обороты(НачалоПериода, КонецПериода, Отбор, "Номенклатура",); Для Каждого СтрокаТаблицы Из ТаблицаОборотов Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Номенклатура " + СтрокаТаблицы.Номенклатура + ": Приход " + СтрокаТаблицы.КоличествоПриход + "; Расход " + СтрокаТаблицы.КоличествоРасход; Сообщение.Сообщить(); КонецЦикла;
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления В качестве типов значения переменных, передаваемых параметрам НачалоПериода и КонецПериода, возможны те же, что использовались для виртуальной таблицы получения оборотов, то есть Дата, МоментВремени и Граница. Особенности применения различных значений и их использование системой при подсчете данных будут рассмотренным ниже, в разделе «Особенности использования периодов и моментов времени при получении оборотов» на стр. 587.
Особенности использования периодов и моментов времени при получении оборотов
Посредством параметра Отбор типа Структура можно строить простейшие отборы на равенство значений измерений. Например, так (листинг 11.62).
Последние случаи (не указан, Неопределено или значение даты по умолчанию) приводят к построению таблицы оборотов с данными, учитывающими все активные записи регистра.
Листинг 11.62. Пример установки отбора при получении оборотов регистра накопления
Отбор = Новый Структура("Номенклатура, Склад", ТоварОтбора, СкладОтбора);
Последние два параметра метода Обороты() касаются операции свертки данных в запросе СУБД перед выгрузкой в таблицу значений. Однако если значения данных параметров не указывать, то результирующая таблица значений будет содержать колонки, соответствующие всем измерениям и/или всем ресурсам. В приведенном примере (см. листинг 11.61) было указано только измерение Номенклатура, в результате произошла свертка по колонке Номенклатура с суммированием значений колонок КоличествоПриход и КоличествоРасход. Применение метода Обороты() для оборотного регистра практически аналогично применению этого метода для регистра остатков.
Параметры НачалоПериода и КонецПериода виртуальной таблицы оборотов и метода Обороты() могут получать значения типа Дата, МоментВремени и Граница, кроме того, могут быть вообще не указаны, иметь значение Неопределено или значение даты по умолчанию.
Если в качестве параметра передается значение типа Дата, важно помнить следующие моменты. Дата в системе «1С:Предприятие» включает в свой состав время. Даже если время не указано явно, оно принимает значение 00:00:00. То есть если в качестве параметра НачалоПериода передать значение 1 декабря 2009 года (данное значение может быть получено так: '20091201'), а в качестве параметра КонецПериода передать 31 декабря 2009 года ('20091231'), то в результате и виртуальная таблица получения оборотов, и результат метода Обороты() будут построены с даты 01.12.2009 00:00:00 по дату 31.12.2009 00:00:00. То есть в обороты, по сути, войдут данные продаж только первой секунды 31 декабря (рис. 11.38).
Единственное отличие состоит в названии колонок таблицы значений, получаемой в результате применения метода. В данном случае их имена совпадают с именами измерений и ресурсов. Например, если требуется на основе данных регистра Продажи сообщить об объемах продаж по конкретной номенклатурной позиции (ссылка на нее – в переменной ТоварОтбора) в интервале между НачалоПериода и КонецПериода, в разрезе покупателей, то можно использовать следующий фрагмент кода (листинг 11.63). Листинг 11.63. Пример получения оборотов оборотного регистра накопления
Отбор = Новый Структура("Номенклатура", ТоварОтбора); ТаблицаОборотов = РегистрыНакопления.Продажи.Обороты(НачалоПериода, КонецПериода, Отбор, "Контрагент",); Для каждого СтрокаТаблицы Из ТаблицаОборотов Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Покупатель " + СтрокаТаблицы.Контрагент + ": Количество " + СтрокаТаблицы.Количество + "; Сумма " + СтрокаТаблицы.Сумма; Сообщение.Сообщить(); КонецЦикла;
Том 1
Рис. 11.38. Получение оборотов на даты указанного интервала
Для предотвращения возможных недоразумений по этому поводу удобно использовать функцию КонецДня(). Эта функция возвращает значение последней секунды дня, указанной в качестве параметра даты (листинги 11.64, 11.65).
587
Глава 11. Учет движения средств Листинг 11.64. Пример получения оборотов регистра накопления на конец дня
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладахОбороты.Номенклатура, | ТоварыНаСкладахОбороты.Склад, | ТоварыНаСкладахОбороты.КоличествоОборот, | ТоварыНаСкладахОбороты.КоличествоПриход, | ТоварыНаСкладахОбороты.КоличествоРасход |ИЗ | РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода) | КАК ТоварыНаСкладахОбороты"; Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода); Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода)); Листинг 11.65. Пример получения оборотов регистра накопления на конец дня
Рис. 11.40. Включение граничных записей при получении оборотов
ТаблицаОборотов = РегистрыНакопления.ТоварыНаСкладах.Обороты(НачалоПериода, КонецДня(КонецПериода));
Параметры «НачалоПериода» и «КонецПериода» типа «МоментВремени» используют для получения оборотов, если требуются итоги, полученные с точностью большей, чем до секунды. Например, если несколько документов имеют одинаковое время, но для решения задачи нужно получение оборотов с начала месяца по момент времени текущего документа (рис. 11.41).
В обоих случаях в результате будут получены данные оборотов с даты 01.12.2009 00:00:00 по дату 31.12.2009 23:59:59 включительно (рис. 11.39).
Рис. 11.39. Получение оборотов на конец дня
Таблица оборотов строится с включением записей, соответствующих граничным периодам. То есть с начала секунды значения параметра НачалоПериода по конец секунды параметра КонецПериода (рис. 11.40). Если в вышеприведенных примерах вместо конца дня 31.12.2009 23:59:59 указать дату 01.01.2010 00:00:00 и в таблице движений регистра будут присутствовать записи со значением поля Период, равным дате 01.01.2010 00:00:00, то они будут учтены. То есть с прикладной точки зрения получится, что в результат запроса войдут данные первой секунды 2010 года.
588
Рис. 11.41. Использование момента времени при получении оборотов
Данная задача может быть решена посредством метода Обороты() или применения запроса с указанием значений параметров НачалоПериода и КонецПериода, вычисляемых следующим образом (листинг 11.66). Листинг 11.66. Пример указания границ периода с использованием момента времени
НачалоПериода = НачалоМесяца(СсылкаНаДокумент.Дата); КонецПериода = Новый МоментВремени(СсылкаНаДокумент.Дата, СсылкаНаДокумент);
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления В обоих случаях обороты будут получены, включая движения документа, ссылка на который содержится в переменной СсылкаНаДокумент. Для случаев, когда необходимо получить данные об оборотах, исключая движения, относящиеся к дате или моменту времени, применяют значения параметров НачалоПериода и КонецПериода с типом значения Граница. Объект Граница получается посредством применения соответствующего конструктора. Именно в конструкторе указывается вид границы. Например, если требуется получить обороты в интервале дат, исключая первую и последнюю секунды, можно использовать следующий код (листинг 11.67). Листинг 11.67. Пример задания границ интервала с использованием объекта «Граница»
ГраницаСДатыИсключая = Новый Граница(НачалоПериода, ВидГраницы.Исключая); ГраницаНаДатуИсключая = Новый Граница(КонецДня(КонецПериода), ВидГраницы.Исключая);
Если требуется получить обороты с начала месяца (включая) по момент времени документа, исключая движения самого документа, тогда можно поступить следующим образом (листинг 11.68, рис. 11.42). Листинг 11.68. Пример задания границ интервала
ГраницаСНачалаМесяца = НачалоМесяца(СсылкаНаДокумент.Дата); ГраницаНаДокумент = Новый Граница(СсылкаНаДокумент.МоментВремени(), ВидГраницы.Исключая);
Агрегаты Для оптимизации получения итоговых данных из оборотных регистров накопления, например, для быстрого получения аналитических отчетов в различных разрезах, в системе «1С:Предприятие» реализован механизм агрегатов. Агрегат – физическая таблица в базе данных, в которой хранятся сводные обороты всех ресурсов регистра за определенный период, по набору измерений и с периодичностью, соответствующими конкретному агрегату. Таблиц-агрегатов в базе данных может быть много (они отличаются друг от друга набором измерений и периодичностью), в то время как таблица итогов (она хранит обороты в разрезе всех измерений регистра) – одна. За счет этого и обеспечивается более быстрый доступ к итоговым данным, если режим использования агрегатов включен. Однако необходимо учитывать, что: ■■ во-первых, оборотный регистр, использующий агрегаты, должен иметь не более 30 измерений; ■■ во-вторых, агрегаты рассчитаны на крупные внедрения, в которых требуется анализировать сотни и миллионы записей в регистрах. Поэтому не имеет смысла использовать их в регистрах, содержащих менее 3–5 тысяч записей. Зачем вообще использовать агрегаты? Для ответа на этот вопрос вспомним механизм получения итоговых данных оборотных регистров накопления. Для получения различных аналитических отчетов обычно используется виртуальная таблица оборотов оборотного регистра накопления. Как было рассказано выше, для построения этой таблицы в зависимости от параметров, переданных в виртуальную таблицу оборотов, могут использоваться или данные только таблицы движений регистра, или данные только таблицы итогов, или данные таблицы движений и таблицы итогов. В таблице итогов регистра хранятся данные месячных оборотов. Эти данные будут использованы в случаях, когда дополнительная периодичность не задана или задана равной или большей месяцу и в интервал формирования виртуальной таблицы попадают целые месяцы. Остальная информация при необходимости получается из таблицы движений.
Рис. 11.42. Использование границы при получении оборотов
Самый быстрый способ получения итоговых данных из оборотного регистра – путем запроса только к таблице итогов. Но на практике зачастую большую или меньшую часть требуемых данных приходится досчитывать по таблице движений. И совсем уже катастрофический случай, когда таблицей итогов воспользоваться не удается и приходится все рассчитывать по таблице движений. При использовании агрегатов в подавляющем большинстве запросов к информационной базе система сможет выбрать один или несколько агрегатов для получения из них нужных данных, не обращаясь к таблице
Том 1
589
Глава 11. Учет движения средств движений регистра. Таким образом, скорость исполнения запросов может быть значительно увеличена, следовательно, аналитические отчеты будут выполняться быстрее, что особенно важно для крупных внедрений.
1. Сначала в конфигураторе нужно создать необходимый список агрегатов, который будет использовать оборотный регистр накопления. Сделать это можно двумя способами:
Нужно понимать, что использование или неиспользование агрегатов никак не сказывается на прикладном коде или тексте запросов, написанных разработчиком. Если у оборотного регистра накопления есть агрегаты и разрешено их использование, то при получении итоговых данных из регистра платформа будет работать в режиме агрегатов, что при больших объемах данных регистра будет эффективнее. Если агрегатов нет или их использование запрещено, платформа будет работать в режиме итогов, как было описано выше.
□□ В режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции Стандартные Управление итогами Полные возможности Агрегаты Оптимальные…) рассчитать оптимальные агрегаты для регистра, сохранить список агрегатов в файл .xml (рис. 11.44) и затем в конфигураторе, в диалоге редактирования агрегатов регистра загрузить их из файла командой Открыть оптимальные агрегаты. Из встроенного языка можно получить список оптимальных агрегатов методом менеджера регистра накопления ОпределитьОптимальныеАгрегаты(). При первом построении списка агрегатов платформа анализирует только таблицу движений регистра. Если агрегаты для регистра ранее использовались, то платформа анализирует также и статистику использования этих агрегатов. На основании этих данных платформа предлагает набор агрегатов для регистра, которые она считает оптимальными.
В составе демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, находится оборотный регистр накопления ПродажиАгрегаты, содержащий 34 тысячи записей и использующий агрегаты. Данные в этом регистре получены случайным образом и никакого прикладного значения не имеют. Но на примере этого регистра мы проиллюстрируем работу с агрегатами. Работа с агрегатами может быть представлена следующей схемой (рис. 11.43).
Рис. 11.44. Получение списка оптимальных агрегатов
ВНИМАНИЕ!
Чтобы закладка Агрегаты обработки Управление итогами стала доступной, нужно создать хотя бы один агрегат вручную (при помощи команды контекстного меню оборотного регистра накопления Открыть агрегаты).
Рис. 11.43. Общая схема работы с агрегатами
590
□□ Создать собственный список агрегатов регистра на основе анализа запросов к регистру. Для этого нужно использовать диалог редактирования агрегатов регистра. Вызвать его можно из дерева конфигурации при помощи команды контекстного меню оборотного регистра накопления Открыть агрегаты или из окна редактирования объекта конфигурации, на закладке Данные, при помощи кнопки Агрегаты. Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления 2. После обновления конфигурации базы данных включить для регистра режим использования агрегатов. Это можно сделать в режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции Стандартные Управление итогами Полные возможности Агрегаты Режим Включить режим агрегатов). Из встроенного языка можно установить режим агрегатов методом менеджера регистра накопления УстановитьРежимАгрегатов(). 3. Далее необходимо выполнить перестроение агрегатов. Это можно сделать в режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции Стандартные Управление итогами Полные возможности Агрегаты Перестроить…). Из встроенного языка можно перестроить использование агрегатов методом менеджера регистра накопления ПерестроитьИспользованиеАгрегатов(). Перестроение сети агрегатов нужно для того, чтобы платформа определила, какие из агрегатов она будет использовать в ближайшее время. Для этого платформа анализирует имеющиеся агрегаты и статистику запросов к регистру. Операцию перестроения нужно производить регулярно. Особенно в случаях, если характер данных в регистре мог измениться или есть вероятность изменения состава запросов к регистру, что ведет к изменению статистики использования агрегатов. После перестроения агрегатов платформа заполняет дату перестроения и вычисляет эффект от использования агрегатов для регистра. Эффект измеряется в процентах и показывает, насколько быстрее будет выполняться запрос при использовании агрегатов по сравнению с запросом при использовании таблицы итогов. 4. Затем необходимо выполнить обновление агрегатов, так как, в отличие от таблицы итогов, агрегаты автоматически не заполняются данными. Это можно сделать в режиме 1С:Предприятие при помощи стандартной функции Управление итогами (Все функции Стандартные Управление итогами Полные возможности Агрегаты Обновить…). Из встроенного языка можно обновить данные агрегатов методом менеджера регистра накопления ОбновитьАгрегаты(). При обновлении агрегатов происходит перенос данных из таблиц движений, которые были произведены после предыдущего обновления агрегатов, в таблицы агрегатов, которые в данный момент используются платформой. Если в информационную базу постоянно вводится много новых данных, то обновлять агрегаты нужно часто (каждый час, минуту, секунду). Если в агрегатах не найдется нужных итоговых данных, система все равно досчитает их по таблице движений, что будет значительно медленнее. Поэтому обновление агрегатов влияет лишь на производительность, а не на саму возможность получения актуальных итогов. 5. Далее следует накопить статистику использования агрегатов. Для этого нужно в течение некоторого интервала времени, например месяца, выполнять типовые задачи, использующие данные регистра, для которого включен режим использования агрегатов. В процессе работы необходимо выполнять обновление агрегатов. Том 1
6. По прошествии выбранного временного интервала, например, через месяц, следует заново рассчитать оптимальные агрегаты (метод ОпределитьОптимальныеАгрегаты()). Данная операция не является регулярной, ее можно выполнять при необходимости, когда количественные изменения в статистике использования агрегатов переходят в качественные. Судить об этом можно по существенному падению производительности на текущем списке агрегатов или по существенному изменению характера данных или состава запросов к регистру и т. п. 7. Затем необходимо определить, требуется ли изменение списка агрегатов для регистра. Если нет, то следует продолжить работу, перейдя на шаг 3. 8. Если необходимо обновить список агрегатов регистра, то в диалоге редактирования агрегатов регистра следует загрузить необходимые (или все) агрегаты из списка оптимальных командой Открыть оптимальные агрегаты. Затем нужно обновить конфигурацию базы данных и продолжить работу с шага 3. ВНИМАНИЕ!
Обновление агрегатов можно выполнять в фоновом режиме, в процессе работы пользователей. При этом есть возможность обновлять агрегаты порциями, и рекомендуется использовать режим разделения итогов. Перестроение сети агрегатов и получение оптимальных агрегатов – довольно длительные и ресурсоемкие операции. Поэтому лучше их выполнять в период минимальной нагрузки на систему, например, ночью. Поскольку после получения оптимальных агрегатов может потребоваться реструктуризация базы данных, нужно быть заранее готовым к тому, что работа пользователей на это время должна быть прекращена.
Следует отдельно сказать об установке свойства Использование в диалоге редактирования агрегатов регистра в конфигураторе. Стандартно это свойство устанавливается в значение Авто. Это значит, что при перестроении агрегатов платформа сама будет решать, использовать данный агрегат или нет. Если же свойство Использование агрегата установить в значение Всегда, то независимо от «желания» платформы она будет использовать данный агрегат при получении итоговых данных (рис. 11.45). Например, разработчик может создать специальный агрегат, обеспечивающий максимально быстрое получение руководителем какого-то аналитического отчета, и установить для него свойство Использование в значение Всегда. Но предположим, этот отчет выполняется довольно редко. Тогда при перестроении списка агрегатов платформа, проанализировав статистику запросов, не сможет исключить его из списка используемых агрегатов, а будет использовать его всегда в соответствии с желанием разработчика.
591
Глава 11. Учет движения средств Таблица 11.68. Детальные показатели остатков и оборотов Номенклатура
Пульт PW Пульт PW Пульт PW Пульт PW Рис. 11.45. Свойство агрегата «Использование»
Пульт VH Пульт VH
Получение остатков и оборотов в одной таблице
Пульт VH
Для решения прикладных задач управления ресурсами предприятий система предоставляет возможности учета этих ресурсов (впрочем, как и любых других показателей) на регистрах накопления. Как правило, в подобных ситуациях речь идет о показателях остатков. Потому что именно показатели остатков позволяют ответить на вопрос, какое именно значение имел этот показатель в тот или иной момент времени. Но для полноценного контроля зачастую мало информации только о значениях остатков. Требуется видеть одновременно и статическую картину, и как она была получена (динамику развития ситуации). Например, для контроля наличия товара на складах предприятия пользователю часто необходимо видеть картину и остатков, и оборотов за некий промежуток времени (табл. 11.67). Таблица 11.67. Показатели остатков и оборотов Номенклатура Количество начальный остаток
Количество Количество Количество Количество конечный остаток оборот приход расход
Пульт PW Пульт VH
15 11
1 10
14 1
15 10
1 9
То есть информацию о начальном остатке значения ресурса (КоличествоНачальныйОстаток), о том, какой за указанные промежуток времени был оборот данного ресурса (КоличествоОборот), как этот оборот был получен (КоличествоПриход, КоличествоРасход), какое конечное значение ресурса после этого получилось (КоличествоКонечныйОстаток). Увидев такую картину укрупнено, пользователь может потребовать показать ее более детально, с дополнительной периодичностью до дня, когда происходили события в отношении товаров на складах (табл. 11.68).
592
Период
13.05.2010 0:00:00 17.05.2010 0:00:00 31.05.2010 0:00:00 13.05.2010 0:00:00 27.05.2010 0:00:00
Количество Количество Количество Количество Количество начальный конечный оборот приход расход остаток остаток
1 1
15 8
14 7
15 7
1 0
8
11
3
3
0
11
15
4
5
1
10 10
11 20
1 10
10 10
9 0
20
11
-9
0
9
Обратите внимание: в результате подробного варианта представления данных длина таблицы может возрастать на несколько порядков. И тогда для быстрого осмысления «локальных участков» информации важно, чтобы значения полей НачальныйОстаток и КонечныйОстаток отражали реальную картину дня и были согласованы с информацией об остатках по предыдущему и последующему периоду (дням). То есть значения полей остатков верхнего уровня группирования информации (по номенклатуре) в данном отчете не получены простым суммированием таких же полей нижнего уровня группирования информации (по дням), а скорее перенесены из соответствующих записей нижнего уровня. А ведь пользователь может потребовать еще большей детальности, уже внутри дня. Для построения таких отчетов можно отдельно получить остатки, отдельно получить обороты и затем каким-либо образом обработать полученные данные. Такой способ в принципе возможен, но достаточно трудоемок. Поэтому в рамках платформы системы «1С:Предприятие» предусмотрены специальные механизмы для решения подобных задач. Они основаны на применении виртуальной таблицы остатков и оборотов регистра накопления остатков и включают в себя реализацию достаточно сложных алгоритмов, решающих одновременно вопросы требуемой функциональности и возможной оптимизации с точки зрения быстродействия. Разработчик же может пользоваться уже готовыми результатами. Но для эффективного использования данных механизмов важно понимать их возможности и принципы реализации. Ниже эти вопросы рассматриваются более подробно.
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления
Виртуальная таблица остатков и оборотов Виртуальная таблица остатков и оборотов регистра накопления остатков позволяет получать итоговые значения и остатков, и оборотов ресурсов за временной интервал. Итоговые значения могут быть получены в разрезе комбинаций значений измерений и/или в развороте дополнительной периодичности. Виртуальная таблица остатков и оборотов содержит следующие поля: ■■ Период – имеет тип Дата. Поле существует, только если указано значение параметра виртуальной таблицы остатков и оборотов Периодичность: Год, Полугодие, Квартал, Месяц, Декада, Неделя, Секунда, Минута, Час, День, Регистратор или Запись. Данное поле содержит начальную дату периода, к которому относится оборот регистра; ■■ Регистратор – имеет тип ДокументСсылка.. Поле существует, если указано значение параметра виртуальной таблицы остатков и оборотов Периодичность: Регистратор или Запись. Данное поле содержит ссылку на документ-регистратор, к которому относится оборот регистра; ■■ НомерСтроки – имеет тип Число. Это поле существует, если указано значение параметра виртуальной таблицы остатков и оборотов Периодичность: Запись. Содержит значение поля НомерСтроки записи движения регистра; ■■ – тип произвольный, определяется типом измерения. Количество таких полей равно количеству измерений регистра накопления. Каждое из полей содержит значения измерений регистра. Имена полей совпадают с названиями измерений, заданными для объекта конфигурации; ■■ Оборот – имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма приходов за минусом суммы расходов ресурса регистра по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Оборот»; ■■ Приход – имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма приходов ресурса регистра по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Приход»; ■■ Расход – имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значения, посчитанные как сумма расходов ресурса регистра по всем движениям внутри соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «Расход»;
Том 1
■■ НачальныйОстаток – имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значение остатка ресурса на начало соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «НачальныйОстаток»; ■■ КонечныйОстаток – имеет тип Число. Количество таких полей равно количеству ресурсов регистра накопления. Каждое из полей содержит значение остатка ресурса на конец соответствующего периода. Имена полей составляются из названий ресурсов с добавлением слова «КонечныйОстаток». Виртуальная таблица остатков и оборотов имеет следующие параметры: ■■ – Дата, МоментВремени или Граница. Используется для указания начала периода расчета итогов. Значение начала периода по умолчанию включается в период расчета итогов. Если параметр не задан, итоги рассчитываются с самой первой записи; ■■ – Дата, МоментВремени или Граница. Используется для указания конца периода расчета итогов. Значение конца периода по умолчанию включается в период расчета итогов. Если параметр не задан, итоги рассчитываются по самую последнюю запись; ■■ – конструкция языка запросов. Задается одним из следующих вариантов: Период, Запись, Регистратор, Секунда, Минута, Час, День, Неделя, Декада, Месяц, Квартал, Полугодие, Год. Используется для указания дополнительного разворота итогов по периодичности. При указании значения Период обороты представляются за весь период (с НачалоПериода по КонецПериода) без дополнительных разворотов. В остальных случаях – с разворотами по записям, регистраторам, неделям, декадам, месяцам, кварталам, полугодиям, годам соответственно. Значение по умолчанию – Период; ■■ – конструкция языка запросов. Задается одним из следующих вариантов: Движения, ДвиженияИГраницыПериода. Используется для указания включения граничных периодов в состав выдаваемых виртуальной таблицей записей. Если выбирается вариант Движения, то граничные периоды не будут включаться (будут выданы записи только за те периоды, когда имели место движения). Если выбирается вариант ДвиженияИГраницыПериода, то граничные периоды будут включаться независимо от наличия или отсутствия движений в рамках интервала между НачалоПериода и КонецПериода. Значение по умолчанию – ДвиженияИГраницыПериода; ■■ – конструкция языка запросов – условие. Строится по полям измерений, регистра накопления (или подчиненным им полям). Используется для ограничения состава исходных записей, по которым при построении виртуальной таблицы будут собираться итоги. Если параметр не указан, то для сбора итогов будут анализироваться все активные записи регистра.
593
Глава 11. Учет движения средств
В случае же использования дополнительной периодичности на каждом этапе алгоритма запросы выполняются, результаты запросов объединяются, полученная в результате объединения таблица записывается во временную таблицу базы данных, чтобы впоследствии быть использованной при выполнении основного запроса, в рамках которого была применена виртуальная таблица остатков и оборотов. Рассмотрим примеры использования виртуальной таблицы остатков и оборотов для регистра ТоварыНаСкладах. Пусть таблица движений регистра ТоварыНаСкладах заполнена так, как показано в табл. 11.69.
594
Активность
Номенклатура
Склад
Количество
Если дополнительная периодичность не указана, то расчет всех данных производится в рамках одного запроса, включающего подзапросы, согласно разделам алгоритма. Подзапросы при этом примерно те же, что и для получения соответствующих виртуальных таблиц получения остатков и оборотов.
ПоступлениеТоваров № 1 10.04.2010 11:00:00 ПоступлениеТоваров № 2 10.04.2010 11:00:00 ПоступлениеТоваров № 3 13.05.2010 15:00:01 ПоступлениеТоваров № 3 13.05.2010 15:00:01 ПоступлениеТоваров № 8 17.05.2010 18:00:00 ПоступлениеТоваров № 4 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 ПоступлениеТоваров № 5 31.05.2010 13:00:00 ПоступлениеТоваров № 6 31.05.2010 14:00:00 Реализация № 2 31.05.2010 15:59:00 ПоступлениеТоваров № 7 31.05.2010 23:59:59
Вид движения
■■ получение остатков на начало заданного периода (так же, как это выполняется для построения виртуальной таблицы остатков); ■■ получение оборотов за заданный период с заданной периодичностью (так же, как это выполняется для построения виртуальной таблицы оборотов); ■■ объединение полученных остатков и оборотов с учетом значения параметра МетодДополнения; ■■ досчет значений остатков для каждой записи.
10.04.2010 11:00:00 10.04.2010 11:01:00 13.05.2010 15:00:01 13.05.2010 15:00:01 17.05.2010 18:00:00 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 13:00:00 31.05.2010 14:00:00 31.05.2010 15:59:00 31.05.2010 23:59:59
Номер cтроки
Сам алгоритм построения этой виртуальной таблицы включает в себя следующие этапы:
Регистратор
Виртуальная таблица может строиться только по тем регистрам, у которых использование итогов включено. При попытке выполнения запроса, в котором используется виртуальная таблица остатков для регистра накопления с отключенными итогами, выдается сообщение об ошибке.
Таблица 11.69. Таблица движений регистра накопления
Период
Виртуальная таблица остатков и оборотов не хранится в базе данных, а строится в момент обращения к ней. Для построения виртуальной таблицы всегда используются данные таблицы итогов и таблицы движений регистра (из базы данных). При этом учитываются значения параметров виртуальной таблицы. Итоги ресурсов собираются только по активным записям.
1
Приход
Истина
Пульт PW
Главный
1
1
Приход
Истина
Пульт VH
Фили-2
10
1
Приход
Истина
Пульт VH
Главный
10
2
Приход
Истина
Пульт PW
Главный
7
1
Приход
Истина
Пульт PW
Розничный
3
1
Приход
Ложь
Пульт VH
Фили-2
5
1
Расход
Истина
Пульт VH
Главный
9
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
1
Расход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
Допустим, выполняется следующий запрос (листинг 11.69). Листинг 11.69. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты АВТОУПОРЯДОЧИВАНИЕ
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Таблица 11.71. Результат выполнения запроса
Склад
Количество начальный остаток
Количество конечный остаток
Количество оборот
Количество приход
Количество расход
Период
Номенклатура
Тогда результат выполнения приведенного запроса будет выглядеть следующим образом (табл. 11.70).
Пульт PW
Главный
1
8
7
7
0
Пульт PW
Розничный 0
3
3
3
0
Пульт PW
Фили-2
0
4
4
5
1
Пульт VH
Главный
0
10
10
10
0
Пульт VH
Главный
10
1
-9
0
9
Таблица 11.70. Результат выполнения запроса Номенклатура Склад
Количество начальный остаток
Количество Количество Количество Количество конечный оборот приход расход остаток
Пульт PW Пульт PW Пульт PW Пульт VH Пульт VH
0 0 0 0 0
8 3 4 1 10
Главный Розничный Фили-2 Главный Фили-2
8 3 4 1 10
8 3 5 10 10
0 0 1 9 0
Для получения информации с дополнительным разворотом по временным периодам, например по дням, когда были движения, можно применять следующий вариант написания запроса (листинг 11.70). Листинг 11.70. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Период, ТоварыНаСкладахОстаткиИОбороты.Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, Движения,) КАК ТоварыНаСкладахОстаткиИОбороты АВТОУПОРЯДОЧИВАНИЕ
Если при этом значения параметров установлены так, как показано в листинге 11.71, то в результате выполнения запроса будут получены данные, представленные в табл. 11.71. Листинг 11.71. Пример установки параметров запроса
Запрос.УстановитьПараметр("НачалоПериода", '20100501'); Запрос.УстановитьПараметр("КонецПериода", КонецДня('20100531'));
Обратите внимание: значение поля Период соответствует началу каждого дня (дополнительная периодичность была именно День). Поскольку в параметрах виртуальной таблицы был указан метод дополнения Движения, то в данном случае выходная таблица содержит записи по всем комбинациям значений измерений, по которым в периоде с НачалоПериода по КонецПериода были движения. Поэтому в рассмотренном примере в таблице результата не оказалось записей с комбинацией Пульт VH и Фили-2. Том 1
13.05.2010 00:00:00 17.05.2010 00:00:00 31.05.2010 00:00:00 13.05.2010 00:00:00 27.05.2010 00:00:00
Если же в выходной таблице результата должна быть информация по остаткам номенклатурных позиций на складах, несмотря на наличие или отсутствие движений внутри периода между НачалоПериода и КонецПериода, то виртуальная таблица остатков и оборотов может быть построена следующим образом (листинг 11.72). Листинг 11.72. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Период, ТоварыНаСкладахОстаткиИОбороты.Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты АВТОУПОРЯДОЧИВАНИЕ
Если значения параметров установлены так же (см. листинг 11.71), то благодаря тому, что параметр МетодДополнения имеет по умолчанию значение ДвиженияИГраницыПериода, получается следующий результат (табл. 11.72).
595
Глава 11. Учет движения средств С какой скоростью система получает результат виртуальной таблицы остатков и оборотов?
Количество приход
Количество расход
Остаток на границу «КонецПериода» Остаток на границу «НачалоПериода» Остаток на границу «КонецПериода»
Количество оборот
Остаток на границу «КонецПериода»
Количество конечный остаток
Остаток на границу «КонецПериода»
Количество начальный остаток
Остаток на границу «КонецПериода»
01.05.2010 00:00:00 13.05.2010 00:00:00 31.05.2010 00:00:00 17.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 13.05.2010 00:00:00 27.05.2010 00:00:00 31.05.2010 00:00:00 01.05.2010 00:00:00 31.05.2010 00:00:00
Склад
Остаток на границу «НачалоПериода»
Номенклатура
Период
Таблица 11.72. Результат выполнения запроса
Пульт PW
Главный
1
1
0
0
0
Пульт PW
Главный
1
8
7
7
0
Пульт PW
Главный
8
8
0
0
0
Пульт PW
Розничный
0
3
3
3
0
Пульт PW
Розничный
3
3
0
0
0
Пульт PW
Фили-2
0
4
4
5
1
Пульт PW
Фили-2
4
4
0
0
0
Пульт VH
Главный
0
10
10
10
0
Пульт VH
Главный
10
1
-9
0
9
Пульт VH
Главный
1
1
0
0
0
Пульт VH
Фили-2
10
10
0
0
0
Пульт VH
Фили-2
10
10
0
0
0
Исходя из приведенного выше описания алгоритма, можно сказать, что в общем случае скорость построения виртуальной таблицы остатков и оборотов зависит от периода рассчитанных итогов (для расчета начальных остатков) и от количества записей движений регистра, попавших в требуемый период построения таблицы, а больше всего от дополнительной периодичности разворота результатов, указанной в параметрах виртуальной таблицы. От количества записей за другие периоды (например, за прошлые годы) скорость выполнения этой задачи не зависит. Для обеспечения максимальной скорости выполнения запроса по этой виртуальной таблице также важно правильное применение отборов по измерениям. подробнее
Правила применения таких отборов описаны в разделе «Применение отборов в запросах, использующих виртуальные таблицы регистров накопления», стр. 602.
Особенности использования периодов и моментов времени при получении остатков и оборотов По умолчанию при использовании виртуальной таблицы остатков и оборотов итоги по остаткам и оборотам рассчитываются, включая граничные периоды (рис. 11.46).
Для комбинаций измерений, по которым были начальные остатки на момент НачалоПериода, добавились записи, содержащие значения этих остатков и в поле КоличествоНачальныйОстаток, и в поле КоличествоКонечныйОстаток, до записей, содержащих данные по движениям. Для комбинаций измерений, по которым были конечные остатки на момент КонецПериода, добавились записи, содержащие значения этих остатков и в поле КоличествоНачальныйОстаток, и в поле КоличествоКонечныйОстаток, после записей, содержащих записи по движениям. В результате цель достигнута: в таблицу результата запроса попадают записи также и по тем комбинациям значений измерений, по которым не было движений во временном интервале построения виртуальной таблицы остатков и оборотов.
596
Рис. 11.46. Получение остатков и оборотов, включая границы периода
Поэтому все особенности использования параметров НачалоПериода и КонецПериода аналогичны виртуальной таблице оборотов (см. раздел «Особенности использования периодов и моментов времени при получении оборотов», стр. 587). Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления
Предположим, что таблица движений регистра ТоварыНаСкладах заполнена так, как показано в табл. 11.73.
Склад
Количество
1
Приход
Истина
Пульт PW
Главный
1
1
Приход
Истина
Пульт VH
Фили-2
10
1
Приход
Истина
Пульт VH
Главный
10
2
Приход
Истина
Пульт PW
Главный
7
1
Приход
Истина
Пульт PW
Розничный 3
1
Приход
Ложь
Пульт VH
Фили-2
5
1
Расход
Истина
Пульт VH
Главный
9
1
Приход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
1
Расход
Истина
Пульт PW
Фили-2
1
1
Приход
Истина
Пульт PW
Фили-2
2
Если параметры запроса установлены так, как показано в листинге 11.74, результат выполнения запроса будет иметь вид, представленный в табл. 11.74. Листинг 11.74. Пример установки параметров запроса
Запрос.УстановитьПараметр("НачалоПериода", '20100501'); Запрос.УстановитьПараметр("КонецПериода", КонецДня('20100531')); Таблица 11.74. Результат выполнения запроса Номенклатура Склад
Пульт PW Пульт PW Пульт PW Пульт PW Пульт VH Пульт VH
Том 1
Номенклатура
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , Движения, ) КАК ТоварыНаСкладахОстаткиИОбороты ИТОГИ СУММА(КоличествоНачальныйОстаток), СУММА(КоличествоКонечныйОстаток), СУММА(КоличествоОборот), СУММА(КоличествоПриход), СУММА(КоличествоРасход) ПО Номенклатура АВТОУПОРЯДОЧИВАНИЕ
Активность
Листинг 11.73. Пример получения остатков и оборотов регистра накопления
ПоступлениеТоваров № 1 10.04.2010 11:00:00 ПоступлениеТоваров № 2 10.04.2010 11:00:00 ПоступлениеТоваров № 3 13.05.2010 15:00:01 ПоступлениеТоваров № 3 13.05.2010 15:00:01 ПоступлениеТоваров № 8 17.05.2010 18:00:00 ПоступлениеТоваров № 4 23.05.2010 15:30:45 Реализация № 1 27.05.2010 12:30:45 ПоступлениеТоваров № 5 31.05.2010 13:00:00 ПоступлениеТоваров № 6 31.05.2010 14:00:00 Реализация № 2 31.05.2010 15:59:00 ПоступлениеТоваров № 7 31.05.2010 23:59:59
Вид движения
Например, для запроса, текст которого приведен в листинге 11.73, итоги будут получены простым суммированием данных соответствующих записей.
10.04.2010 11:00:00 10.04.2010 11:01:00 13.05.2010 15:00:01 13.05.2010 15:00:01 17.05.2010 18:00:00 23.05.2010 15:30:45 27.05.2010 12:30:45 31.05.2010 13:00:00 31.05.2010 14:00:00 31.05.2010 15:59:00 31.05.2010 23:59:59
Номер строки
Для того чтобы задействовать этот алгоритм, система прежде всего должна распознать необходимость специфичного расчета итогов по полям остатков.
Регистратор
Отдельного рассмотрения заслуживает вопрос расчета итогов по полям остатков, поскольку с прикладной точки зрения не всегда они могут быть получены простым суммированием, а должны рассчитываться с привлечением специального алгоритма.
Таблица 11.73. Таблица движений регистра накопления
Период
Расчет итогов по полям остатков при использовании виртуальной таблицы остатков и оборотов
Количество Количество Количество Количество Количество начальный конечный оборот приход расход остаток остаток
1 Главный 1 Розничный 0 Фили-2 0 0 Главный 0
15 8 3 4 1 1
14 7 3 4 1 1
15 7 3 5 10 10
1 0 0 1 9 9
597
Глава 11. Учет движения средств Теперь изменим текст запроса так, как показано в листинге 11.75.
Таблица 11.75. Результат выполнения запроса Склад
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Период КАК Период, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода,) КАК ТоварыНаСкладахОстаткиИОбороты ИТОГИ СУММА(КоличествоНачальныйОстаток), СУММА(КоличествоКонечныйОстаток), СУММА(КоличествоОборот), СУММА(КоличествоПриход), СУММА(КоличествоРасход) ПО Номенклатура АВТОУПОРЯДОЧИВАНИЕ
В этом случае при расчете итогов остатков система будет действовать по следующему алгоритму: ■■ исходные записи временной промежуточной таблицы (записанной в базе данных в процессе выполнения алгоритма построения виртуальной таблицы остатков и оборотов) упорядочиваются по полям первого уровня (в нашем случае – Номенклатура и Склад), далее – хронологически; ■■ при обходе упорядоченных записей: □□ первые записи по каждой комбинации полей первого уровня используются для суммирования начального остатка; □□ последние записи по каждой комбинации полей первого уровня используются для суммирования конечного остатка. Если использовать тот же вариант установки значений параметров виртуальной таблицы остатков и оборотов (см. листинг 11.74), то таблица результата будет выглядеть уже по-другому (табл. 11.75). Серым фоном отмечены те поля, которые были просуммированы при получении итогов полей остатков по номенклатуре. Аналогичным образом система поступила бы, если бы группировок итогов было больше. Главное, что они перечислены в запросе до группировки итогов Период.
598
Период
Номенклатура
Листинг 11.75. Пример получения остатков и оборотов регистра накопления
Пульт PW Пульт PW Главный
01.05.2010 00:00:00 Пульт PW Главный 13.05.2010 00:00:00 Пульт PW Главный 31.05.2010 00:00:00 Пульт PW Розничный 17.05.2010 00:00:00 Пульт PW Розничный 31.05.2010 00:00:00 Пульт PW Фили-2 31.05.2010 00:00:00 Пульт PW Фили-2 31.05.2010 00:00:00 Пульт VH Пульт VH Главный 13.05.2010 00:00:00 Пульт VH Главный 27.05.2010 00:00:00 Пульт VH Главный 31.05.2010 00:00:00 Пульт VH Фили-2 01.05.2010 00:00:00 Пульт VH Фили-2 31.05.2010 00:00:00
Количество Количество Количество Количество Количество начальный конечный оборот приход расход остаток остаток
1 1
15 1
14 0
15 0
1 0
1
8
7
7
0
8
8
0
0
0
0
3
3
3
0
3
3
0
0
0
0
4
4
5
1
4
4
0
0
0
10 0
11 10
1 10
10 10
9 0
10
1
-9
0
9
1
1
0
0
0
10
10
0
0
0
10
10
0
0
0
Если среди итогов есть группировка Период (листинг 11.76), алгоритм расчета полей остатков еще более сложный. Листинг 11.76. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Период КАК Период, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК личествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода,) КАК ТоварыНаСкладахОстаткиИОбороты ИТОГИ СУММА(КоличествоНачальныйОстаток),
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления СУММА(КоличествоКонечныйОстаток), СУММА(КоличествоОборот), СУММА(КоличествоПриход), СУММА(КоличествоРасход) ПО Номенклатура, Период АВТОУПОРЯДОЧИВАНИЕ
Для приведенного примера при расчете полей остатков будут выполняться следующие действия: ■■ расчет итогов для группировки (группировок) перед группировкой Период (в нашем примере это расчет для группировки Номенклатура) выполняется по тому же алгоритму, что в предыдущем примере; ■■ расчет итогов для группировки Период: □□ исходные записи временной промежуточной таблицы остатков и оборотов (записанной в базе данных в процессе выполнения алгоритма построения виртуальной таблицы остатков и оборотов) упорядочиваются по полям, использованным в группировках выше (в нашем случае это группировка Номенклатура), затем хронологически (по полю Период), далее – по оставшимся полям первого уровня (в нашем случае Склад); □□ внутри группировки первого уровня (Номенклатура) для каждого значения группировки Период рассчитываются значения полей остатков посредством обходов записей и суммирования значений нужных полей: ○○ для начального остатка: обход всех записей, у которых дата больше или равна значению даты группировки Период, начиная от этой даты (то есть «вниз»). При обходе выполняется суммирование значений поля НачальныйОстаток для записей, содержащих различные (ранее не встреченные в процессе обхода) комбинации значений полей первого уровня (в нашем примере Номенклатура и Склад); ○○ для конечного остатка: обход всех записей, у которых дата меньше или равна значению даты группировки Период, начиная от этой даты (то есть «вверх»). При обходе выполняется суммирование значений поля КонечныйОстаток для записей, содержащих различные (ранее не встреченные в процессе обхода) комбинации значений полей первого уровня (в нашем примере Номенклатура и Склад). Для наглядности работы алгоритма расчета итогов остатков группировки Период рассмотрим фрагмент заполнения таблицы результата. Пусть заполнение регистра будет тем же, что рассматривали раньше (см. табл. 11.73), с теми же значениями параметров НачалоПериода и КонецПериода (см. листинг 11.74). Расчет промежуточных итогов остатков товара Пульт PW для значения периода 17.05.2010 00:00:00 будет произведен по следующей схеме (табл. 11.76). Том 1
Таблица 11.76. Результат расчета промежуточных итогов Номенклатура
Упорядоченные записи из временной таблицы остатков и оборотов Рассчитываемая запись итога по периоду
Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW
Упорядоченные записи из временной таблицы остатков и оборотов
Пульт PW Пульт PW Пульт PW
Период
01.05.2010 00:00:00 13.05.2010 00:00:00 17.05.2010 00:00:00 17.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00
Склад
Количество начальный остаток
Количество конечный остаток
Главный
1
1
Главный
1
8
8
11
Розничный
0
3
Главный
8
8
Розничный
3
3
Фили-2
0
4
Фили-2
4
4
Серым фоном отмечены те поля, которые были просуммированы при получении итогов. В целом таблица результата запроса будет выглядеть как на табл. 11.77. Обратите внимание: «особыми» алгоритмами были рассчитаны только поля остатков, поля же оборотов рассчитываются простым суммированием в рамках требуемых группировок. Для более сложных случаев, когда среди группировочных полей итогов есть и предшествующие полю Период, и находящиеся после него, алгоритм расчета итогов включает в себя следующие этапы: ■■ расчет итогов для группировок, предшествующих группировке Период; ■■ расчет итогов для группировки Период; ■■ расчет итогов для группировок после группировки Период производится как для обычных полей, то есть простым суммированием. Хотелось бы еще раз подчеркнуть, что в любом случае применение этих «особых» алгоритмов происходит уже после того, как виртуальная таблица остатков и оборотов была получена и сохранена во временной таблице базы данных. Рассмотрим еще ряд особенностей различных вариантов использования полей остатков, когда система будет применять еще более сложные алгоритмы.
599
Глава 11. Учет движения средств Таблица 11.77. Результат выполнения запроса Количество начальный остаток
Количество конечный остаток
Количество оборот
Количество приход
Количество расход
15
14
15
1
Пульт PW 01.05.2010 00:00:00 Пульт PW 01.05.2010 00:00:00
1
1
0
0
0
Итоги по граничному значению «НачалоПериода» Итоги по периоду «День»
1
1
0
0
0
1
8
7
7
0
1
8
7
7
0
8
11
3
3
0
3
3
3
0
11
15
4
5
1
8
8
0
0
0
Розничный 3
3
0
0
0
Фили-2
0
4
4
5
1
Фили-2
4
4
0
0
0
10
11
1
10
9
10
10
0
0
0
10
10
0
0
0
10
20
10
10
0
0
10
10
10
0
20
11
-9
0
0
10
1
-9
0
9
11
11
0
0
0
Главный
1
1
0
0
0
Фили-2
10
10
0
0
0
Пульт PW 13.05.2010 00:00:00 Пульт PW 13.05.2010 00:00:00 Итоги по периоду «День» Пульт PW 17.05.2010 00:00:00 Пульт PW 17.05.2010 00:00:00 Итоги по периоду «День» Пульт PW 31.05.2010 00:00:00 Итоги по граничному Пульт PW 31.05.2010 значению «КонецПериода» 00:00:00 Итоги по граничному Пульт PW 31.05.2010 значению «КонецПериода» 00:00:00 Пульт PW 31.05.2010 00:00:00 Итоги по граничному Пульт PW 31.05.2010 значению «КонецПериода» 00:00:00 Итоги по номенклатурной Пульт VH позиции Итоги по периоду «День» Пульт VH 01.05.2010 00:00:00 Итоги по граничному Пульт VH 01.05.2010 значению 00:00:00 «НачалоПериода» Итоги по периоду «День» Пульт VH 13.05.2010 00:00:00 Пульт VH 13.05.2010 00:00:00 Итоги по периоду «День» Пульт VH 27.05.2010 00:00:00 Пульт VH 27.05.2010 00:00:00 Итоги по периоду «День» Пульт VH 31.05.2010 00:00:00 Итоги по граничному Пульт VH 31.05.2010 значению «КонецПериода» 00:00:00 Итоги по граничному Пульт VH 31.05.2010 значению «КонецПериода» 00:00:00
600
Склад
1
Период
Пульт PW
Номенклатура
Итоги по номенклатурной позиции Итоги по периоду «День»
Получение итогов по одному полю остатков
Главный
Главный
Розничный 0
Главный
Фили-2
Главный
Главный
Для того чтобы запрос мог рассчитать итоги по полям остатка, необходимо чтобы в запросе получались оба значения остатка за период (начальный и конечный). Если в запросе получается только один остаток и по нему ведется расчет итога, программа неявно добавит в запрос получение данных из информационной базы поле парного остатка. Например, в случае выполнения запроса, представленного в листинге 11.77, будет неявно добавлено поле ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток, потому что иначе возникли бы сложности с расчетом итогов последних периодов, если в них не было движений. Листинг 11.77. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Период КАК Период, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот КАК КоличествоОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода,) КАК ТоварыНаСкладахОстаткиИОбороты ИТОГИ СУММА(КоличествоНачальныйОстаток), СУММА(КоличествоОборот), СУММА(КоличествоПриход), СУММА(КоличествоРасход) ПО Номенклатура, Период АВТОУПОРЯДОЧИВАНИЕ
Аналогичным образом система поступает и в ситуации, когда поле-остаток используется в выражении (листинг 11.78). Листинг 11.78. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Период КАК Период, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток * ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЗакупочнаяЦена КАК СуммаКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот * ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЗакупочнаяЦена КАК СуммаОборот, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход * ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЗакупочнаяЦена КАК СуммаПриход,
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход * ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЗакупочнаяЦена КАК СуммаРасход ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода,) КАК ТоварыНаСкладахОстаткиИОбороты ИТОГИ СУММА(СуммаКонечныйОстаток), СУММА(СуммаОборот), СУММА(СуммаПриход), СУММА(СуммаРасход) ПО Номенклатура, Период АВТОУПОРЯДОЧИВАНИЕ
В этом случае будет неявно добавлено поле ТоварыНаСкладахОстат-
киИОбороты.КоличествоНачальныйОстаток * ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЗакупочнаяЦена.
Получение итогов по регистратору или номеру строки Поле Период записей, подчиненных одному регистратору, в общем случае может иметь неодинаковые значения. Поэтому для определения момента времени, начиная с которого запись влияет на рассчитываемые итоги, сначала учитывается значение поля Период записи, потом Регистратор, а потом – НомерСтроки. В результате из-за того, что регистратор, по сути, является уточнением периода, при расчете итогов по регистратору необходимо иметь в виду, что получать итоги по регистратору можно только внутри группировки Период. Если получить итоги по регистратору до получения итогов по периоду, они могут оказаться некорректными! Аналогично итоги по номеру строки можно получать только внутри группировки по периоду и регистратору.
Получение итогов остатков в комбинации с другими полями В ситуациях, когда выходные поля запроса получаются посредством выражения, содержащего начальный или конечный остаток, действия системы аналогичны. В этом случае запрос будет манипулировать значениями, вычисленными согласно описанным правилам. То есть значение поля, представленного в листинге 11.79, будет являться произведением конечного остатка и закупочной цены.
Том 1
Листинг 11.79. Поле выборки запроса
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток * ТоварыНаСкладахОстаткиИОбороты.Номенклатура.ЗакупочнаяЦена КАК СуммаКонечныйОстаток,
Но если в составе выражения используется более одного поля начального или конечного остатка, то итоги по таким полям получаются уже простым суммированием. Рассмотрим запрос, представленный в листинге 11.80. Листинг 11.80. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Период КАК Период, ТоварыНаСкладахОстаткиИОбороты.Склад, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток – ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК Разница ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток * ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК Произведение ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ДвиженияИГраницыПериода,) КАК ТоварыНаСкладахОстаткиИОбороты ИТОГИ СУММА(КоличествоНачальныйОстаток), СУММА(КоличествоКонечныйОстаток), СУММА(Разница), СУММА(Произведение) ПО Номенклатура, Период АВТОУПОРЯДОЧИВАНИЕ
Если установить параметры запроса так, как показано в листинге 11.81, то результат выполнения запроса будет выглядеть так, как показано в табл. 11.78. Листинг 11.81. Установка параметров запроса
Запрос.УстановитьПараметр("НачалоПериода", '20100501'); Запрос.УстановитьПараметр("КонецПериода", КонецДня('20100531'));
601
Глава 11. Учет движения средств Таблица 11.78. Результат выполнения запроса Номенклатура
Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт PW Пульт VH Пульт VH Пульт VH Пульт VH Пульт VH Пульт VH Пульт VH Пульт VH Пульт VH Пульт VH
Период
01.05.2010 00:00:00 01.05.2010 00:00:00 13.05.2010 00:00:00 13.05.2010 00:00:00 17.05.2010 00:00:00 17.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 01.05.2010 00:00:00 01.05.2010 00:00:00 13.05.2010 00:00:00 13.05.2010 00:00:00 27.05.2010 00:00:00 27.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00 31.05.2010 00:00:00
Склад
Использование соединений с таблицей остатков и оборотов
Количество Количество Разница начальный конечный остаток остаток
Произведение
1 1
15 1
11 0
98 1
1
1
0
1
1
8
7
8
1
8
7
8
8
11
3
0
0
3
3
0
11
15
4
89
Главный
8
8
0
64
Розничный
3
3
0
9
Фили-2
0
4
4
0
Фили-2
4
4
0
16
10 10
11 10
1 0
211 100
10
10
0
100
10
20
10
0
0
10
10
0
20
11
-9
10
10
1
-9
10
11
11
0
101
Главный
1
1
0
1
Фили-2
10
10
0
100
Главный
Главный
Розничный
Фили-2
Главный
Главный
В случае применения конструкции ИТОГИ ПО для запросов, включающих в себя соединения виртуальной таблицы остатков и оборотов с другими таблицами (например, с основной таблицей регистра), необходимо учитывать влияние наличия всех возможных комбинаций значений полей связанных таблиц (удовлетворяющих условиям соединения) на вышеописанные алгоритмы расчета полей итогов. Иначе легко получить «удивительные» с прикладной точки зрения результаты запросов. Например, рассмотрим в листинге 11.82.
запрос,
текст
которого
представлен
Листинг 11.82. Пример получения остатков и оборотов регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток, ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход, ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход, ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток, ТоварыНаСкладах.ВидОперации КАК ВидОперации ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура =ТоварыНаСкладах.Номенклатура ИТОГИ СУММА(КоличествоНачальныйОстаток), СУММА(КоличествоПриход), СУММА(КоличествоРасход), СУММА(КоличествоКонечныйОстаток) ПО Номенклатура, ВидОперации
В результате данные по остаткам и оборотам каждой номенклатурной позиции могут быть завышены в несколько раз или даже десятков тысяч раз в зависимости от того, сколько записей с этой номенклатурной позицией присутствует в таблице движений регистра и как они упорядочиваются по хронологии внутри вышестоящих группировок.
Применение отборов в запросах, использующих виртуальные таблицы регистров накопления Для обеспечения максимальной скорости выполнения запросов важно правильно применять условия отборов. Например, для получения остатков по отдельной номенклатурной позиции текст запроса может выглядеть так, как показано в листинге 11.83 или в листинге 11.84.
602
Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных из регистров накопления Листинг 11.83. Пример использования отбора в виртуальной таблице
Листинг 11.86. Пример получения остатков регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Номенклатура = &НоменклатураОтбора) КАК ТоварыНаСкладахОстатки
ВЫБРАТЬ ТаблицаДокумента.Номенклатура, СУММА(ТаблицаДокумента.Количество) КАК Количество, ТоварыНаСкладахОстатки.КоличествоОстаток, СУММА(ТаблицаДокумента.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваров.Состав КАК ТаблицаДокумента ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки( &Момент, Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровТовары.Номенклатура ИЗ Документ.РеализацияТоваров.Состав КАК РеализацияТоваровТовары ГДЕ РеализацияТоваровТовары.Ссылка = &ТекущийДокумент) И Склад = &Склад) КАК ТоварыНаСкладахОстатки ПО ТаблицаДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура ГДЕ ТаблицаДокумента.Ссылка = &ТекущийДокумент СГРУППИРОВАТЬ ПО ТаблицаДокумента.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток
Листинг 11.84. Пример неэффективного запроса, использующего виртуальную таблицу остатков
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки ГДЕ ТоварыНаСкладахОстатки.Номенклатура = &НоменклатураОтбора
По сравнению с первым вариантом второй является неэффективным по скорости исполнения, поскольку сначала по всем номенклатурным позициям будут проведены необходимые расчеты и получена виртуальная таблица остатков, а отбор будет использован уже после. Условия построения виртуальной таблицы могут реализовываться не только по равенству значений измерений, но и по вхождению их в массив или список значений (листинг 11.85). Листинг 11.85. Пример получения остатков регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Номенклатура В (&МассивНоменклатурныхПозиций) ) КАК ТоварыНаСкладахОстатки
Также может использоваться условие вхождения в таблицу результата вложенного запроса. Например, если при проведении документа РеализацияТоваров требуется получить данные о количестве товара в самом документе и в остатках регистра ТоварыНаСкладах на момент проведения документа, то для быстрого выполнения этой операции виртуальную таблицу остатков лучше строить только по тем номенклатурным позициям и тому складу, которые указаны в документе (листинг 11.86).
Том 1
Кроме того, условие построения виртуальной таблицы может быть по значениям полей, подчиненных полям измерений (листинг 11.87). Листинг 11.87. Пример получения остатков регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Номенклатура.ЗакупочнаяЦена > ПороговаяЦена ) КАК ТоварыНаСкладахОстатки
Однако необходимо учитывать, что подобные операции «разыменования» реализуются за счет неявных дополнительных соединений с соответствующими таблицами. В данном примере в момент построения виртуальной таблицы выполняется левое соединение с таблицей справочника. Наибольшего эффекта увеличения скорости построения виртуальных таблиц за счет применения параметра условия можно добиться в том случае, если условия накладываются на первые измерения, потом вторые и так далее. В принципе сам порядок описания условий не важен, важен порядок измерений, на которые эти условия накладываются. Тогда система сможет эффективно применять индексы при выполнении запроса.
603
Глава 11. Учет движения средств В вышеописанных примерах, если не применять условие отбора по первому измерению Номенклатура, а применить условие отбора по измерению Склад (листинг 11.88), для получения данных таблицы итогов система сможет применить индекс Период + Номенклатура + Склад, а из таблицы движений регистра данные будут взяты при помощи индекса Период + Регистратор + НомерСтроки. То есть произойдет отбор всех записей соответствующего периода из таблиц регистра. А уже просматривая эти записи, система сможет отсечь из рассмотрений записи по ненужным складам. Поскольку для регистра накопления обычной является ситуация, когда количество записей движений на порядок больше количества записей итогов, для повышения скорости построения виртуальной таблицы «бороться» прежде всего нужно с движениями по «лишним» складам. Листинг 11.88. Пример получения остатков регистра накопления
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура, ТоварыНаСкладахОстатки.Склад КАК Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &СкладОтбора) КАК ТоварыНаСкладахОстатки
Поэтому изначально, описывая данные регистра как объекта конфигурации, можно указать индексирование измерения Склад. Тогда система сможет использовать данные не только индекса Период + Регистратор + НомерСтроки, но и индекса Склад + Период + Регистратор + НомерСтроки. Необходимо заметить, что порядок применения или неприменения тех или иных индексных таблиц в каждом конкретном случае исполнения конкретного запроса берут на себя механизмы СУБД, отвечающие за доступ к информации. Однако оптимальный порядок следования измерений в структуре регистра и индексирование полей регистра помогают СУБД чаще принимать верные с точки зрения эффективности решения.
Когда следует использовать запрос вместо объектной модели обращения при получении данных регистров накопления В случаях простейших обращений к информации базы данных удобство и быстродействие использования табличной и объектной модели чтения одинаковы. Дело в том, что запрос, написанный на языке системы «1С:Предприятие», и использование соответствующего метода реализуются платформой посредством «перевода» этих обращений в язык запросов СУБД, зачастую совершенно (или почти) одинаковых. Исключение составляют ситуации использования механизма обращения к динамическим данным. Посредством этого механизма чтение информации осуществляется не полностью в момент обращения, а блоками.
604
подробнее
Раздел «Работа с регистрами при отображении динамических данных», стр. 605.
В данном же разделе обращается внимание на задачи, которые можно решить эффективно только посредством запросов. К ним относятся: ■■ гибкое применение отборов и группировок, ■■ соединение с информацией других объектов, ■■ применение разграничения доступа на уровне записей. В случае применения методов Остатки() и Обороты() возможно применение отборов для измерений на равенство неким значениям. Более сложные отборы необходимо реализовать с помощью установки значений параметров соответствующих виртуальных таблиц запросов. Это относится, например, к условию вхождения значений измерений в определенную группу; условию неравенства некоему значению; условию превышения некоего значения (например, если измерение имеет тип Дата); условию равенства двум значениям (логическое ИЛИ) и т. д. В случае необходимости соединения данных нескольких объектов применение запросов также является более эффективным. Например, задачу контроля остатка для каждой номенклатурной позиции при проведении документа реализации товаров можно решить как с использованием запроса, так и с использованием объектной модели. Если рассматривать запрос, использующий левое соединение (листинг 11.89), то результатом его работы будет таблица, содержащая колонки КоличествоВДокументе и КоличествоВОстаткеРегистра. Листинг 11.89. Пример получения остатков регистра накопления с помощью запроса
ВЫБРАТЬ ТаблицаДокумента.Номенклатура, СУММА(ТаблицаДокумента.Количество) КАК КоличествоВДокументе, ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоВОстаткеРегистра ИЗ Документ.РеализацияТоваров.Состав КАК ТаблицаДокумента ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура В (ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровТовары.Номенклатура ИЗ Документ.РеализацияТоваров.Состав КАК РеализацияТоваровТовары ГДЕ РеализацияТоваровТовары.Ссылка = &ТекущийДокумент) И Склад = &Склад) КАК ТоварыНаСкладахОстатки ПО ТаблицаДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура ГДЕ ТаблицаДокумента.Ссылка = &ТекущийДокумент СГРУППИРОВАТЬ ПО ТаблицаДокумента.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток
Профессиональная разработка в системе «1С:Предприятие 8»
Отдельные вопросы использования регистров накопления В данном случае виртуальная таблица остатков будет построена только по нужным товарным позициям (указанным в табличной части Состав проводимого документа), далее полученный результат соединен с записями табличной части проводимого документа. В результирующей таблице будет произведена группировка на случай упоминания одних и тех же товарных позиций в документе более одного раза. Все эти операции будут выполнены в рамках одного запроса обращения к данным базы данных. При использовании объектной модели необходимо будет выгрузить табличную часть Состав документа в таблицу значений. Затем свернуть полученную таблицу значений по колонке Номенклатура (на случай неоднократного упоминания одного и того же товара в табличной части). После этого в цикле перебора строк полученной таблицы значений обращаться к данным регистра методом Остатки(), применяя отбор по значению конкретной номенклатурной позиции. Неэффективность данного подхода проявляется в многократных обращениях к таблицам регистра в базе данных. Модификация использования объектной модели чтения для решения данной задачи, когда метод Остатки() получается не в цикле перебора строк, а до него, также неэффективна, поскольку тогда для функциональности алгоритма придется получать остатки по всем (а не по нужным) номенклатурным позициям, а в цикле перебора товаров документа искать нужные строки в таблице значений остатков. Использование же в данной ситуации запроса позволяет получать данные из таблиц регистра только по нужным значениям измерений, причем в рамках одного обращения к базе данных. Также запросы позволяют использовать при необходимости один из двух режимов получения данных из полей базы данных: ■■ получение всех записей; ■■ получение только тех записей, на которые у пользователя есть права. Во втором случае в таблице результата запроса будут обработаны только те записи, что разрешены при использовании ограничений доступа на уровне записей. Неразрешенные записи будут проигнорированы. Объектная же техника обращения к информации базы данных выполняется только в режиме получения всех записей.
Отдельные вопросы использования регистров накопления
Работа с регистрами при отображении динамических данных Форма списка регистра накопления Для обеспечения динамического просмотра записей регистра в таблице формы предназначен объект ДинамическийСписок. Он осуществляет считывание данных из информационной базы блоками, в процессе навигации пользователя в таблице формы или в процессе обращения к ним из встроенного языка. Это уменьшает время загрузки списка и объем отводимой для него памяти, что позволяет комфортно работать даже с очень большими списками. Например, не возникает задержек при открытии формы (считывается только нужный блок, а не весь список) или при переходе в конец списка (система не обязана считывать все данные регистра, будет считан блок только с нужными) и т. д. С помощью динамического списка построены все формы списка объектов конфигурации. Динамический список формируется путем запроса к основной таблице, указанной в соответствующем свойстве реквизита типа ДинамическийСписок, или путем произвольного запроса к базе данных. Форма списка регистра накопления также содержит основной реквизит типа ДинамическийСписок, который использует систему компоновки данных и позволяет задать группировку, отбор, порядок и условное оформление списка путем установки соответствующих свойств. Обычно далеко не все поля динамического списка используются для отображения в форме. Особенность использования динамического списка в том, что запросом из базы данных считываются значения только тех реквизитов, которые отображаются в форме, причем даже в том случае, если соответствующие им колонки таблицы формы невидимы. То есть система не будет считывать «ненужные» данные из базы данных. Логика проста: если не нужно показывать, то не нужно и считывать, чтобы еще больше сократить время считывания. Но иногда возникают задачи, когда может оказаться необходимым, чтобы объект ДинамическийСписок содержал некоторые колонки, которые не отображаются в таблице формы. Например, при отображении данных регистра накопления ТоварыНаСкладах для некой последующей обработки нужно, чтобы значение поля ВидДвижения динамического списка было доступно для обращения из встроенного языка (например, Элементы.Список.ТекущиеДанные.ВидДвижения).
Том 1
605
Глава 11. Учет движения средств Этого можно добиться при помощи свойства полей динамического списка Использовать всегда. Установив это свойство, можно получить значения реквизитов объекта независимо от того, отображаются они в форме или нет (рис. 11.47).
Рис. 11.48. Форма настройки динамического списка
Работа с итогами при отображении динамических данных При работе с отображением динамических данных иногда возникает задача отображения итогов регистров по значениям измерений, взятых из этих динамических данных. Например, при отображении списка справочника Номенклатура необходимо отображать остатки по номенклатурным позициям в отдельной колонке списка. Рис. 11.47. Форма списка регистра накопления
Такого же эффекта можно добиться, если поместить поле динамического списка в состав колонок таблицы и сделать его невидимым.
Для решения данной задачи нужно установить свойство ПроизвольныйЗапрос для основного реквизита типа ДинамическийСписок формы списка номенклатуры, данные которого она отображает (рис. 11.49).
Настройка динамического списка может осуществляться не только в режиме Конфигуратор (палитра свойств Настройка списка – Открыть), но и пользователем в режиме 1С:Предприятие. Это можно реализовать посредством команды Все действия Настроить список… В окне настройки динамического списка можно установить группировку, отбор, сортировку и условное оформление списка. На закладке Сортировка изначально присутствует настройка сортировки динамического списка по возрастанию поля Период, так как платформа стандартно упорядочивает записи регистра накопления по этому полю (рис. 11.48). Рис. 11.49. Установка произвольного запроса для динамического списка
606
Профессиональная разработка в системе «1С:Предприятие 8»
Отдельные вопросы использования регистров накопления Затем, выполнив в строке Настройка списка команду Открыть, следует ввести текст запроса для получения остатков (листинг 11.90). Листинг 11.90. Запрос для определения остатков номенклатуры
ВЫБРАТЬ СправочникНоменклатура.Код, СправочникНоменклатура.Наименование, СправочникНоменклатура.ЗакупочнаяЦена, СправочникНоменклатура.ПолноеНаименование, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ Справочник.Номенклатура КАК СправочникНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки ПО (ТоварыНаСкладахОстатки.Номенклатура = СправочникНоменклатура.Ссылка)
В запросе при помощи левого соединения справочника Номенклатура с виртуальной таблицей остатков регистра ТоварыНаСкладах выбираются остатки по каждой позиции номенклатуры.
Если требуется выделять отрицательные остатки номенклатуры в форме списка, то можно воспользоваться свойством расширения поля формы ВыделятьОтрицательные. При установке этого свойства в значение Да отрицательные остатки номенклатуры стандартно будут выделены красным цветом текста. Но если нужно использовать более гибкое выделение строк списка по какому-либо условию, то можно установить свойство УсловноеОформление динамического списка. Поскольку основной реквизит формы списка имеет тип ДинамическийСписок, который использует систему компоновки данных, то можно настроить для него отбор, порядок, группировку и условное оформление. Например, открыв окно настройки динамического списка Список (палитра свойств Настройка списка – Открыть, см. рис. 11.49), зададим условное оформление списка так, чтобы строки номенклатуры с остатком меньше трех выделялись розовым цветом (рис. 11.51).
Таким образом, свойство ТекстЗапроса реквизита формы Список заполняется приведенным выше запросом, и при считывании данных из этого динамического списка платформа вместо автоматической генерации текста запроса к таблице справочника номенклатуры будет использовать указанный запрос. Остается только перенести поле КоличествоОстаток из доступных полей динамического списка в список колонок таблицы формы, отображающей данные этого списка (рис. 11.50).
Рис. 11.51. Условное оформление динамического списка
В результате список номенклатуры в режиме 1С:Предприятие будет выглядеть следующим образом (рис. 11.52).
Рис. 11.52. Форма списка справочника «Номенклатура»
Рис. 11.50. Форма списка справочника «Номенклатура»
Том 1
В режиме 1С:Предприятие пользователь может также выполнять настройку списка по своему желанию с помощью команды Все действия Настроить список…
607
Глава 11. Учет движения средств подробнее
Пример такого решения приведен в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компактдиске.
Хотелось бы все же отметить, что в решении задач автоматического отображения остатков в отдельной колонке динамического списка быстродействие системы сильно зависит от сложности алгоритма расчета. Ведь, например, при прокрутке списка пользователем система вынуждена будет слишком часто обращаться к базе данных для расчета остатков появляющихся полей. Если быстродействие получается неприемлемым, тогда нужно рассматривать другие варианты отображения остатков, то есть изменять условия задачи. Например, нужно отображать остатки в отдельном поле в форме только для текущей строки таблицы при нажатии соответствующей кнопки. Как еще один вариант решения можно применять элементы механизма динамического просмотра данных, но с дополнительной функциональностью получения остатков. подробнее
Пример такого решения приведен в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компактдиске.
В форму документа РеализацияТоваров помещена кнопка Подбор, при нажатии которой вызывается форма ФормаПодбораНоменклатуры справочника Номенклатура. Форма подбора номенклатуры включает в себя две таблицы: ДеревоНоменклатуры и ТаблицаПодбора. Таблица ДеревоНоменклатуры отображает данные динамического списка, выбирающего только группы справочника Номенклатура. При выборе пользователем группы в этой таблице в обработчике события Выбор таблица значений ТаблицаПодбора заполняется списком номенклатуры из выбранной группы и соответствующими остатками на складе, указанном в документе (рис. 11.53). Для реализации данной функциональности используется обработчик события Выбор таблицы ДеревоНоменклатуры. В процедуре сначала запросом собираются данные об остатках номенклатуры, входящей в выбранную группу, на нужном складе. Далее таблица, отображаемая нижней таблицей, сначала очищается, потом заполняется необходимой информацией, полученной выборкой из результата запроса (листинг 11.91).
608
Рис. 11.53. Форма подбора номенклатуры Листинг 11.91. Обработчик события «Выбор» таблицы «ДеревоНоменклатуры»
Процедура ДеревоНоменклатураВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка) // Выбрать товары группы с остатками. Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | Товары.Код, | Товары.Ссылка КАК Номенклатура, | ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток |ИЗ | Справочник.Номенклатура КАК Товары | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрНакопления.ТоварыНаСкладах.Остатки( | , | Номенклатура В (ВЫБРАТЬ | Номенклатура.Ссылка | ИЗ | Справочник.Номенклатура КАК Номенклатура | ГДЕ | Номенклатура.Родитель = &Родитель) | И | Склад = &Склад) | КАК ТоварыНаСкладахОстатки | ПО Товары.Ссылка = ТоварыНаСкладахОстатки.Номенклатура |ГДЕ | Товары.Родитель = &Родитель | И (НЕ Товары.ЭтоГруппа)"; // Установить в качестве параметра выбранную группу. Запрос.УстановитьПараметр("Родитель", ВыбраннаяСтрока); Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();
Профессиональная разработка в системе «1С:Предприятие 8»
Отдельные вопросы использования регистров накопления
// Очистить таблицу подбора. НоменклатураДляПодбора.Очистить();
// Заполнить таблицу подбора. Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл
НоваяСтрока = НоменклатураДляПодбора.Добавить(); НоваяСтрока.Код = Выборка.Код; НоваяСтрока.Номенклатура = Выборка.Номенклатура; НоваяСтрока.Остаток = Выборка.Остаток;
КонецЦикла;
КонецПроцедуры
Теперь независимо от действий пользователя (например, использование полосы прокрутки), пока не будет перевыбрана группа в верхней таблице, никаких обращений к базе данных происходить не будет.
Рис. 11.54. Контроль наличия товара
подробнее
В данном примере намеренно не используется механизм динамического отображения данных. Однако обеспечивается достаточно комфортная работа пользователя.
Получение остатков при проведении документов При решении бизнес-задач зачастую возникают вопросы конкурентного управления ресурсами автоматизируемого предприятия. Сам учет ресурсов, как правило, ведется посредством регистров. Поэтому рассмотрим классическую задачу и пути ее решения. Пользователи оформляют и проводят документы ЗаказПокупателя. Данный документ связан с двумя регистрами: РезервыНоменклатуры и ТоварыНаСкладах. При проведении данного документа необходимо отложить товар в резерв (выполнить движения по регистру РезервыНоменклатуры), но перед этим выполнить контроль возможности проведения данной операции. Отложить товар в резерв можно только в том случае, если его хватает, то есть если достаточно свободного (не зарезервированного другими) остатка (рис. 11.54). Кроме того, контроль остатка нужно проводить не только при оперативном проведении. Иначе пользователи «понарезервируют» задним числом столько, сколько компания вовек не продаст. А если заставить все заказы проводить только оперативно, то первый, кто возразит против такого решения, – начальник отдела продаж. Зачастую выправление ситуаций коллизий остро конкурирующих заказов он разрешает, именно управляя хронологией заказов. Мол, «вон тот заказ поставим на вчера, а Иванов пусть следующей поставки ждет…». Таким образом, при реализации алгоритма проведения документа необходимо будет читать данные остатков регистров накопления. Том 1
Пример реализации данного алгоритма проведения реализован в модуле документа ЗаказПокупателя демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компактдиске.
Рассмотрим этот пример (листинг 11.92). Листинг 11.92. Обработчик события «ОбработкаПроведения»
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Укажем, по каким регистрам нужно записывать движения. Движения.РезервыНоменклатуры.Записывать = Истина; // Создать менеджер временных таблиц. МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; // Укажем, какой менеджер временных таблиц использует этот запрос. Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = "ВЫБРАТЬ | ЗаказПокупателяСостав.Номенклатура, | СУММА(ЗаказПокупателяСостав.Количество) КАК КоличествоВДокументе |ПОМЕСТИТЬ НоменклатураДокумента |ИЗ | Документ.ЗаказПокупателя.Состав КАК ЗаказПокупателяСостав |ГДЕ | ЗаказПокупателяСостав.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ЗаказПокупателяСостав.Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка);
609
Глава 11. Учет движения средств
Результат = Запрос.Выполнить();
Запрос2 = Новый Запрос; Запрос2.МенеджерВременныхТаблиц = МенеджерВТ; Запрос2.Текст = "ВЫБРАТЬ | НоменклатураДокумента.Номенклатура, | НоменклатураДокумента.КоличествоВДокументе |ИЗ | НоменклатураДокумента КАК НоменклатураДокумента"; // Установим необходимость блокировки данных в регистре РезервыНоменклатуры. Движения.РезервыНоменклатуры.БлокироватьДляИзменения = Истина; // Запишем пустые наборы записей, чтобы читать резервы без учета данных в документе. Движения.РезервыНоменклатуры.Записать(); Результат = Запрос2.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Сформировать движения по регистру РезервыНоменклатуры. Движение = Движения.РезервыНоменклатуры.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; Движение.Количество =ВыборкаДетальныеЗаписи.КоличествоВДокументе; КонецЦикла; // Запишем движения. Движения.Записать(); // Контроль остатков. Запрос3 = Новый Запрос; Запрос3.МенеджерВременныхТаблиц = МенеджерВТ; Запрос3.Текст = "ВЫБРАТЬ | НоменклатураДокумента.Номенклатура, | ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток, | ЕСТЬNULL(РезервыНоменклатурыОстатки.КоличествоОстаток, 0) КАК Резерв |ИЗ | НоменклатураДокумента КАК НоменклатураДокумента | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ | НоменклатураДокумента.Номенклатура | ИЗ | НоменклатураДокумента)) КАК ТоварыНаСкладахОстатки | ПО НоменклатураДокумента.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РезервыНоменклатуры.Остатки( | &Момент, | Номенклатура В | (ВЫБРАТЬ
610
| НоменклатураДокумента.Номенклатура | ИЗ | НоменклатураДокумента)) КАК РезервыНоменклатурыОстатки | ПО НоменклатураДокумента.Номенклатура = РезервыНоменклатурыОстатки.Номенклатура |ГДЕ | ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) | ЕСТЬNULL(РезервыНоменклатурыОстатки.КоличествоОстаток,0) < 0"; ГраницаПоДокумент = Новый Граница(МоментВремени(), ВидГраницы.Включая); Запрос3.УстановитьПараметр("Момент", ГраницаПоДокумент); РезультатСНехваткой = Запрос3.Выполнить(); ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать(); Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не хватает " + Строка(– (ВыборкаРезультатаСНехваткой.Остаток – ВыборкаРезультатаСНехваткой.Резерв)) + "единиц товара""" + ВыборкаРезультатаСНехваткой.Номенклатура + "."; Сообщение.Сообщить(); Отказ = Истина;
КонецЦикла;
КонецПроцедуры
Краткий комментарий: сначала в обработчике ОбработкаПроведения указывается, что движения документа по регистру РезервыНоменклатуры должны быть записаны при проведении документа. Затем данные табличной части документа ЗаказПокупателя помещаются во временную таблицу. Эти данные посредством менеджера временных таблиц будут затем использованы в запросе для формирования движений документа и в запросе к регистрам накопления для контроля свободных (не зарезервированных) остатков товаров. Заметьте, что данные табличной части документа группируются по полю Номенклатура, чтобы суммировать поле Количество при наличии в документе нескольких строк с одинаковой номенклатурой. Затем данные регистра РезервыНоменклатуры блокируются путем установки свойства БлокироватьДляИзменения в значение Истина. Чтобы обеспечить чтение количества зарезервированных товаров без учета существующих движений документа, движения данного документа в регистре очищаются путем записи пустого набора данных. Далее выполняется запрос к временной таблице, содержащей перечень заказанных товаров, и в цикле выборки результата запроса формируются движения по регистру РезервыНоменклатуры. Затем движения документа в регистрах записываются в явном виде (Движения.Записать()). Профессиональная разработка в системе «1С:Предприятие 8»
Отдельные вопросы использования регистров накопления После этого выполняется контроль свободного (не зарезервированного) остатка товаров. Для этого выполняется запрос для получения отрицательных свободных остатков номенклатуры, содержащейся в табличной части проводимого документа. Запрос реализован левым соединением данных временной таблицы с данными виртуальных таблиц остатков из регистров ТоварыНаСкладах и РезервыНоменклатуры. Поскольку документу запрещено оперативное проведение (свойство документа Оперативное проведение установлено в значение Запретить), остатки номенклатуры нужно контролировать на момент времени документа, включая движения самого документа. Поэтому в качестве параметра Период при установке параметра запроса передается значение момента времени документа, включая движения самого документа (Новый Граница(МоментВремени(), ВидГраницы.Включая)). Заметьте, что виртуальные таблицы остатков получены с применением отбора только по тем номенклатурным позициям, которые входят в состав проводимого документа. Поскольку может быть ситуация, когда данные по неким номенклатурным позициям в регистре отсутствуют, для выходных полей запроса применена функция преобразования возможных Null значений в числовое значение 0. Это сделано для того, чтобы впоследствии выполнять арифметические действия с данными результата запроса без опасений, что те окажутся непригодными для подобных действий.
системой автоматически применяются блокировки на уровне таблиц базы данных. Соответственно, другая транзакция при проведении другого документа не сможет прочитать или изменить остатки в регистре накопления с того момента, как записаны движения, и до того момента, как начато чтение для контроля отрицательных остатков. В клиент-серверном варианте для максимального быстродействия системы при использовании ее большим числом пользователей обеспечивается параллельность работы пользователей. Это реализуется за счет применения блокировок не на уровне таблиц базы данных, а на уровне записей таблиц и диапазонов записей таблиц регистров. При этом для ускорения записи в регистр и увеличения параллельности проведения документов регистры стандартно используют режим разделения итогов. Механизм разделения итогов вводит в состав хранимой таблицы итогов специальное поле (Разделитель), позволяющее распараллелить обновление записей итогов. Таким образом, при записи движений документа блокироваться будут только записи с тем разделителем, который получила текущая транзакция. Но возможна ситуация, когда другая транзакция с другим разделителем изменит остатки по тем же измерениям регистра, что первая, и еще до того момента, как первая начнет чтение для контроля отрицательных остатков (рис. 11.55).
После этого выборка записей запроса обходится в цикле, и если есть такие записи, в которых количество резерва по товару в регистре РезервыНоменклатуры превосходит его остаток в регистре ТоварыНаСкладах, сообщение о них выводятся пользователю. В этом случае параметр Отказ процедуры обработчика события получает значение Истина, что приведет к откату транзакции записи документа с проведением.
Блокировка записей регистров Для «1С:Предприятия» стандартным является режим управляемых блокировок. Он задается свойством конфигурации Режим управления блокировкой данных, которое для новых конфигураций устанавливается в значение Управляемый. Блокировки данных в информационной базе выполняются менеджером блокировок «1С:Предприятия». Стандартный вариант проведения документа, при котором выполняется контроль остатков из регистров накопления остатков, предусматривает следующую последовательность действий: сначала выполняется запись движений документа, затем контролируются остатки. При записи движений регистра накопления пересчитываются также и его итоги, и при этом на таблицу движений и таблицу итогов регистра накопления накладываются управляемые блокировки. В файловом варианте работы системы при выполнении транзакции, в которую входит проведение документа, для считывания и записи данных Том 1
Рис. 11.55. Блокировки записей регистра накопления при проведении с использованием режима разделения итогов
В тот момент, когда первый документ начнет чтение остатков из регистра, записи итогов по одинаковым измерениям будут сложены, и в результате при проведении первого документа будут получены неверные остатки. Ведь при записи блокировалась только итоговая запись с разделителем
611
Глава 11. Учет движения средств «0» именно для того, чтобы параллельная транзакция могла записать свои итоги по тем же измерениям, но с другим разделителем. Чтобы избежать изменения итогов между моментом записи и моментом чтения остатков, еще до формирования и записи движений регистра свойство набора записей БлокироватьДляИзменения устанавливается в значение Истина. В этом случае в момент записи набора записей платформа отключит разделитель итогов в регистре. Таким образом, другая транзакция не сможет записать движения по тем же измерениям, что и текущая, до окончания проведения документа. В результате после записи движений будут получены правильные остатки из регистров.
Чтение данных регистра остатков при неоперативном проведении Помимо блокировок, хотелось бы еще обратить внимание на следующее: на какой момент нужно получать данные регистров при проведении документа. Для решения этого вопроса, прежде всего, важно определить, используется ли для ведения учета механизм оперативного проведения. Если механизм используется, то при получении информации остатков из регистров достаточно получать данные текущих итогов, что сильно повышает быстродействие этой операции. То есть можно применять виртуальные таблицы получения остатков без указания значения параметра Период.
Таблица 11.79. Таблица движений регистра накопления остатков Период
13.05.2010 15:00:01 23.05.2010 12:30:45 23.05.2010 12:30:45
Регистратор
Вид движения
ПоступлениеТоваров № 1 Приход 13.05.2010 15:00:01 РеализацияТоваров № 1 Расход 23.05.2010 12:30:45 РеализацияТоваров № 2 Расход 23.05.2010 12:30:45
Номенклатура
Количество
Пульт VX
7
Пульт VX
2
Пульт VX
10
Таблица 11.80. Данные документа «Заказ товаров» ЗаказПокупателя Номер: № 1 Дата: 23.05.2010 12:30:45
Номенклатура Пульт VX
Количество 3
В результате, если остатки регистра будут посчитаны на значение Дата, получим, что на складе 10 пультов (то есть документ ЗаказПокупателя можно провести, хотя это не так). Поэтому данные остатков нужно брать на момент времени проводимого документа (рис. 11.56).
подробнее
Подобный пример приведен в демонстрационной конфигурации «Хранение информации», которая находится на прилагаемом компакт-диске, при проведении документа РеализацияТоваров. Также этот пример описан в разделе «Использование механизма оперативного проведения» на стр. 515.
В приведенном выше алгоритме (см. листинг 11.92) реализована ситуация, когда по каким-то причинам не используется механизм оперативного проведения документа. Тогда для обеспечения корректности контрольных операций при проведении документов нужно будет получать не актуальные данные регистров остатков, а данные на момент времени документа посредством использования соответствующего значения для параметров виртуальных таблиц. Хочется подчеркнуть, что не на дату документа, а именно на момент времени, включая движения самого документа. Например, возможна такая ситуация. В таблице движений регистра остатков есть три записи (табл. 11.79). Проводится очередной документ ЗаказПокупателя № 1, в нем указана следующая информация (табл. 11.80). Поскольку оперативное проведение не используется, то дата документа вполне может иметь точно такое же значение, как и у предыдущего документа.
612
Рис. 11.56. Получение остатков на момент времени документа
Однако необходимо иметь в виду, что управлять положением документов внутри одной секунды возможности нет. То есть не факт, что новый документ (ЗаказПокупателя) займет на временной оси положение после уже введенных с той же датой документов (РеализацияТоваров). Но при получении данных на момент времени по крайней мере есть уверенность в однозначном порядке расположения документов на временной оси с точки зрения чтения информации регистров при проведении документов. Поэтому возможные коллизии в результате неоперативного проведения документов все же можно разрешать за счет перепроведения документов, в частности, с помощью последовательностей документов. Более подробно это описано в разделе «Последовательности документов» на стр. 533. Профессиональная разработка в системе «1С:Предприятие 8»
Диаграмма взаимодействия объектов
Глава 12. Бухгалтерский учет Эта глава нашей книги посвящена задачам бухгалтерского учета и возможностям системы «1С:Предприятие» для их решения. Говорят, что правильно поставленная задача – наполовину решенная задача. Мы считаем, что это утверждение недалеко от истины, но уделить достаточное внимание вопросам теории бухгалтерского учета не позволяет формат нашей книги. Тем не менее, мы будем стараться, где это возможно, разъяснять основные понятия и методы предметной области, задачи которой будем решать. Все примеры, рассмотренные в этой главе, содержатся в демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске. Основная задача любой учетной системы – управление и контроль работы объектов учета. Задача бухгалтерского учета – учет операций хозяйственной деятельности всего предприятия в целом. Цель учета – контроль финансово-хозяйственной деятельности и управление всем предприятием посредством замкнутой системы показателей. Далее при рассмотрении внутреннего устройства регистра бухгалтерии (основного объекта, предназначенного для реализации задач бухгалтерского учета) мы будем проводить сравнение с другим объектом – регистром накопления. Эти объекты весьма похожи, но предназначены и оптимизированы для решения разных задач. Поэтому умение выделить задачи бухгалтерского учета и задачи оперативного учета позволит значительно оптимизировать работу конфигурации.
Диаграмма взаимодействия объектов Схему взаимодействия объектов системы «1С:Предприятие» при реализации задачи бухгалтерского учета можно представить следующим образом (рис. 12.1). Рассмотрим объекты, участвующие в схеме, и начнем это делать с плана счетов. Бухгалтерский учет ведется на счетах, каждый из которых предназначен для группировки однородных хозяйственных операций. Все счета, используемые для ведения учета на предприятии, объединяются в план счетов. Счета – это основной разрез учета. Все остальные разрезы (аналитический учет, измерения) являются вспомогательными и необязательными.
Том 1
Рис. 12.1. Схема взаимодействия объектов
613
Глава 12. Бухгалтерский учет Для хранения бухгалтерских проводок по счетам используется объект конфигурации Регистр бухгалтерии. Самый простой регистр бухгалтерии, предназначенный для ведения бухгалтерского синтетического учета, может содержать всего один ресурс (для учета средств в валюте учета, в которой будет составляться вся отчетность и формироваться баланс) и более ничего. Такой регистр бухгалтерии позволит анализировать остатки и обороты по счетам, а также и обороты между счетами. Для получения оборотов между счетами регистр должен поддерживать схему учета с поддержкой корреспонденций, при которой каждая запись обязательно включает два счета: дебетуемый и кредитуемый. Дополнительными разрезами при ведении учета являются аналитические разрезы (аналитический учет) и измерения регистра бухгалтерии (с помощью которых возможно реализовать многовалютный учет, консолидированный учет и другие). Аналитический учет описывается в системе «1С:Предприятие» с помощью понятий Вид субконто и Субконто. Под видом субконто подразумевается группа однородных объектов аналитического учета (список контрагентов, номенклатуры, статей и др.). Субконто – это один конкретный объект из этого множества (объект аналитического учета, например: контрагент, карточка товара, статья затрат и др.). Для реализации аналитического учета используется «связка» объектов План видов характеристик, План счетов, Регистр бухгалтерии. План видов характеристик, использующийся для ведения аналитического учета на выбранном плане счетов, выбирается в соответствующем свойстве плана счетов. Виды характеристик «привязываются» к счетам плана счетов, требующим ведения аналитического учета. Результат этих действий – изменяющиеся таблицы регистра бухгалтерии, которые позволят хранить остатки и обороты не только по счетам, но и по счетам в разрезе субконто. Чтобы понять, как используется план видов характеристик, можно разделить название этого объекта на две части – «план» и «видов характеристик». Получаются два уровня вложенности: план, представляющий собой совокупность видов субконто, и вид субконто. Каждый вид субконто хранит информацию о типе характеристик, являющихся объектами аналитического учета, т. е. субконто. Характеристика – это один экземпляр вида характеристик, так же как субконто – это один экземпляр вида субконто. Характеристика не является самостоятельным объектом конфигурации. Для ведения аналитического учета, как правило, используются элементы справочников, значения перечисления, ссылки на документы. Виды характеристик, как правило, имеют ссылочный тип данных (хотя возможны и другие варианты). Решение задач консолидированного, многовалютного учета, единого для всех счетов аналитического учета, и некоторых других осуществляется с использованием измерений регистра бухгалтерии, которые так же, как правило, принимают значения ссылочных типов данных.
614
Каждая запись (проводка) регистра бухгалтерии подчинена какому-то регистратору (документу) и, как правило, им же создана. При проектировании реквизитного состава документов, которые должны формировать записи в регистре бухгалтерии, как правило, используются ссылочные типы данных. Документ при проектировании задачи бухгалтерского учета – это, прежде всего, средство формирования движений в регистре бухгалтерии. А движения эти, как уже было сказано выше, содержат субконто и измерения, которые и заполняются обычно значениями реквизитов документа. Каждый документ имеет свойство Движения, представляющее собой коллекцию наборов записей тех регистров, регистратором для которых он является. Схема проведения документа по регистрам унифицирована для всех регистров – регистры сведений, накопления, расчетов, бухгалтерии. Она включает запись выбранных при проведении, измененных вручную с помощью набора записей «ручной операции» или другим способом наборов записей в регистр при записи документа интерактивно или программно. Регистр бухгалтерии с точки зрения традиционной (бумажной) бухгалтерии можно рассматривать как собрание форм бухгалтерского учета, включающее в себя как формы для хронологической (проводки), так и для систематической (итоги по счетам, по субконто, обороты между счетами) записи. Кроме записи и хранения бухгалтерских проводок и итогов по счетам, регистр бухгалтерии предоставляет ряд методов и таблиц для выполнения запросов. И те и другие предназначены для удобного и оптимального получения остатков и оборотов по счетам и аналитикам. Так как основным методом извлечения данных в системе является запрос, то именно таблицы (в первую очередь виртуальные) используются в большинстве случаев для построения бухгалтерской отчетности, являющейся главным результатом бухгалтерского учета.
План счетов и его основные свойства План счетов – центральное место любой конфигурации для ведения бухгалтерского учета. Бухгалтерский учет ведется на счетах. Все счета, входящие в один баланс, объединяются в один план счетов. По свой сути план счетов – это справочник счетов. Рассмотрим пример несложного бухгалтерского учета на небольшом предприятии. Каждое предприятие обладает каким-то имуществом (активами) и обязательствами (пассивами). Пусть у нашего предприятия будут активы: ■■ наличные деньги в кассе; ■■ деньги, которые нам должны наши покупатели за поставленные им товары; ■■ сами товары, которые мы приготовили для продажи; ■■ прочие материальные ценности для собственных нужд. Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства Все эти активы взялись «не откуда-то», а были получены нашим предприятием или от инвестора (хозяина, владельца, которому принадлежит наше предприятие), или от сторонних по отношению к предприятию организаций и физических лиц (например, поставщиков). Таким образом, пассивы нашего предприятия складываются из обязательств перед хозяином, сторонними контрагентами и собственными сотрудниками, которые работают на нашем предприятии. Итак, наши пассивы:
Закладка Основные позволяет назначить имя, синоним и комментарий для плана счетов, а также представление объекта, представление списка и пояснение для представления плана счетов в интерфейсе «1С:Предприятия» (рис. 12.2).
■■ задолженность перед сотрудниками, ■■ задолженность перед поставщиками, ■■ задолженность перед владельцем. Таким образом, мы имеем два ряда счетов, которые обусловлены балансом нашего предприятия1. Так как активы не могли взяться из «ниоткуда» и не могут исчезнуть в «никуда», то сумма всех активов в денежном выражении будет равна сумме всех обязательств в том же денежном выражении. В нашем учете нас интересуют и остатки, и обороты по каждому виду активов и обязательств. Поэтому для каждого из них мы заведем отдельный счет в плане счетов. По свой сути каждый счет – это один (или несколько) учетный регистр (форм). От количества и назначения счетов будет зависеть весь учетный процесс, поэтому перепроектирование плана счетов почти всегда связано с существенными изменениями конфигурации. Группировка этих счетов, их порядок в плане счетов во многом зависят от традиций, стандартов и просто предпочтений бухгалтера. Если речь идет о регламентированном учете, то эти свойства плана счетов описываются в законе и стандартах. В нашем случае мы создадим план счетов сами, и он будет включать следующие счета (табл. 12.1). Таблица 12.1. Состав плана счетов Код Имя
Назначение
1 1.1 1.2 1.3 1.4 1.5 2 2.1 2.2 3
Группа счетов, объединяет все активы нашего предприятия Наличные деньги Деньги, которые нам должны наши покупатели за поставленные им товары Товары, которые мы приготовили для продажи Прочие материальные ценности для собственных нужд Взаиморасчеты с контрагентами Объединяет все обязательства перед контрагентами и сотрудниками Задолженность перед сотрудниками Задолженность перед поставщиками Задолженность перед владельцем
1
Активы Касса Покупатели Товары Материалы Контрагенты Обязательства Сотрудники Поставщики Капитал
План счетов – объект конфигурации, который позволяет описать состав счетов, используемый для ведения учета на предприятии, и их свойства. Рассмотрим план счетов для ведения нашего бухгалтерского учета.
Том 1
Рис. 12.2. Основные свойства плана счетов
Следует заметить, что в одной конфигурации может быть несколько планов счетов. Для целей регламентированного учета это не требуется, но встречаются задачи управленческого учета, требующие ведения учета по разным стандартам или ведения не только бухгалтерского учета, который фиксирует свершившиеся факты, но и бюджетного учета, который учитывает планируемые операции. Закладка Данные (рис. 12.3), кроме таких свойств, как Реквизиты и Табличные части, назначение которых – хранение дополнительной информации о счете, содержит следующие свойства (табл. 12.2). Таблица 12.2. Свойства плана счетов Свойство Длина кода Длина наименования Маска кода Автопорядок по коду Длина порядка Основное представление Признаки учета
Назначение
Максимальная длина кода счета, включая все его субсчета и знаки, используемые для отделения счета и субсчета Максимальная длина наименования счета Свойство позволяет задать правила использования символов (цифровой, буквенно-цифровой код и т. д.) и иерархичность кода счета Это свойство будет рассмотрено подробно ниже Максимальная длина дополнительного индексируемого поля, значение которого используется для сортировки счетов в форме списка плана счетов и запросах Выбор основного представления счета в полях ввода документов, отчетов и др. Обычно счет принято отображать в виде кода, но в методических целях будем использовать наименование Дополнительное свойство счета, позволяющее определить необходимость ведения на выбранном счете дополнительного вида учета (например, валютного или количественного)
615
Глава 12. Бухгалтерский учет
Рис. 12.3. Данные плана счетов
Закладка Нумерация позволяет определить правила нумерации счетов в плане счетов и мало отличается от подобных закладок других объектов (рис. 12.4). Рис. 12.5. Субконто плана счетов
Здесь устанавливается, какой из планов видов характеристик будет использоваться для хранения списка видов субконто (свойство Виды субконто), максимально возможное количество параллельных (независимых) видов субконто на любом счете плана счетов. Здесь же создаются дополнительные свойства субконто на счете – Признаки учета субконто, которые позволяют управлять необходимостью ведения того или иного вида учета для одного из видов субконто выбранного счета.
Рис. 12.4. Нумерация плана счетов
Закладка Субконто предназначена для описания общих правил ведения аналитического учета плана счетов (рис. 12.5).
616
Закладка Формы кроме настройки форм позволяет настроить способы выбора счета в диалогах в поле выбора. Здесь же указывается, по каким полям будет осуществляться ввод по строке в диалогах выбора (при наборе с клавиатуры кода счета или его наименования система будет осуществлять поиск счета в плане счетов), рис. 12.6. Закладка Прочее – последняя по порядку, но не по значимости. Кроме ввода справочной информации предназначена для изменения модуля объекта, модуля менеджера объекта, списка предопределенных счетов, справочной информации о плане счетов и т. п. (рис. 12.7).
Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства
Коды счетов Использование кодов плана счетов во многом определяется стандартами, в соответствии с которыми ведется бухгалтерский учет. Это может быть «Закон о бухгалтерском учете» (если решается задача регламентированного учета), GAAP или другие зарубежные стандарты (при решении задачи получения бухгалтерской отчетности в соответствии с МСФО), внутренние стандарты предприятия (если необходимо ведение управленческого учета). Кроме кода, который в понимании бухгалтера «…и есть счет», необходимы и другие свойства. Эти свойства и состав счетов плана счетов позволяют определить в системе объект конфигурации План счетов.
Рис. 12.6. Формы плана счетов
Код счета предназначен для идентификации счета пользователем и, как правило, используется как основное представление объекта. Именно код счета обычно вводит пользователь при заполнении бухгалтерской проводки, код счета выводится в качестве измерений (строк и колонок) бухгалтерских отчетов. Свойство Длина кода позволяет задать максимальную длину кода, которой будет ограничено описание кодов для счетов выбранного плана счетов. При описании максимальной длины кода счета необходимо учитывать возможную иерархичность плана счетов. Для счетов одного плана счетов можно установить (и обычно устанавливается) контроль уникальности кода, который может контролировать серии кодов или во всем справочнике, или в пределах подчинения владельцу. Основное отличие от справочника здесь заключается в том, что код счета включает в себя коды всех его родителей. Поэтому при установке уникальности в пределах подчинения владельцу мы можем добавить к счету с кодом 02 субсчет с кодом 01.1, ведь там такого еще нет. Свойство Наименование счета и его длина не требуют, с нашей точки зрения, отдельного описания, т. к. свойство не отличается по своему назначению от аналогичного свойства объектов Справочник и План видов характеристик. Так же как и в перечисленных объектах, это свойство предназначено для хранения вводимого пользователем наименования элемента плана счетов (счета).
Рис. 12.7. Прочие свойства плана счетов
А теперь рассмотрим подробнее основные из перечисленных свойств счетов и их использование при решении задач бухгалтерского учета.
Том 1
Свойство Маска кода заслуживает отдельного и более подробного описания. Это свойство предназначено для ограничения использования символов в коде счета и задания иерархической структуры плана счетов. Система позволяет описывать как линейные, так и иерархические планы счетов. Каждый план счетов может включать неограниченное число счетов первого уровня, неограниченное число субсчетов к каждому счету первого уровня и т. д. Первая задача – ограничение использования символов – решается с помощью использования при заполнении маски кода счета символов, описание которых можно найти в документации, например, в описании метода Маска().
617
Глава 12. Бухгалтерский учет В строке маски допустимо использование следующих специальных символов: ■■ ! – любой введенный символ преобразуется в верхний регистр; ■■ 9 – допустимо ввести произвольный символ цифры; ■■ # – допустимо ввести произвольный символ цифры, или - (знак минус), или + (знак плюс), или пробел; ■■ N – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры); ■■ U – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры), и любой введенный символ преобразуется в верхний регистр; ■■ X (латинского алфавита) – допустимо ввести произвольный символ; ■■ @ – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел; ■■ и других. Таким образом, если мы зададим маску кода счета ##, в план счетов можно будет вводить счета с кодами, состоящими только из цифр, знаков минуса, плюса и пробела. Кроме того, максимальный код счета становится равным 99 (счет с кодом 100 содержит уже три символа, что не разрешается выбранной маской). Вторая задача – задание иерархической структуры плана счетов (или, точнее, кодов счетов, потому что иерархия кодов и иерархия счетов может отличаться, и об этом пойдет речь ниже) – решается за счет использования символов-разделителей в составе маски кода счета. Разделителем может выступать любой символ, не перечисленный в описании специальных символов маски. Для отделения счета верхнего уровня от субсчета, как правило, используется «.» (символ точка). Таким образом, если мы считаем, что нам будет достаточно плана счетов с двумя уровнями вложенности (счет – субсчет), нам будет достаточно задать маску кода счета ##.##, что соответствует длине кода счета, которую мы выбрали ранее (5 символов: два знака – счет, два знака – субсчет, точка-разделитель между ними). Отдельно следует остановиться на использовании символа @ в описании маски кода счета. Использование этого специального символа не только позволяет вводить любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел, как уже было отмечено выше, но и влияет на хранение кода в базе и отображение его в диалогах ввода. При использовании символа @ в маске кода счета группа знаков кода, для которой использованы символы @, при сохранении кода в базу данных упаковывается – из него вырезаются пробелы. Рассмотрим на примере нашего плана счетов, для которого мы установили в свойствах маску кода счета @@.@@, соответствующую максимальной длине кода счета. Проиллюстрируем работу маски, содержащей символы @, на примере ввода счета с кодом 1 .1 (единица, пробел, точка, единица), табл. 12.3, 12.4.
618
Таблица 12.3. Маска кода с использованием символа @ Номера символов 1
2
3
4
5
Маска Вводится Хранится Символов
@ пробел .
. . 1
@ 1 нет
@ пробел нет
@ 1 1 3
Таблица 12.4. Маска кода без использования символа @ (используется #) Номера символов 1
2
3
4
5
Маска Вводится Хранится Символов
# пробел пробел
. . .
# 1 1
# пробел пробел
# 1 1 5
Таким образом, вводится код 1 .1 (единица, пробел, точка, единица), а в базе данных сохраняется 1.1. При редактировании счета в плане счетов код счета распаковывается до вида, подходящего под маску. При записи опять упаковывается. При работе пользователя с диалогами форм, содержащими ссылки на счет плана счетов, ввод по подстроке осуществляется по «упакованному» коду. В нашем случае пользователь должен будет набрать с клавиатуры 1.1 (без пробелов, т. е. не дополняя код до вида маски).
Упорядочивание счетов в плане счетов План счетов, как и объекты Справочник и План видов характеристик, стандартно сортируется в формах списка и упорядочивается (автоупорядочивание) в запросах по основному представлению. Но, во-первых, есть вероятность, что основным представлением будет выбрано наименование (в целях управленческого учета это возможно), а упорядочить необходимо по коду. А, во-вторых, код, особенно при использовании в маске кода счета символов @, позволяющих упаковывать код счета, может не подходить для сортировки. Рассмотрим это на примере первой группы счетов плана счетов, который мы начали делать. Пользователь ввел счета со следующими кодами (табл. 12.5). Таблица 12.5. Счета, введенные пользователем Коды по порядку их ввода (как должно быть)
1.1 1.2 1.3 1.N 1.10 1.11
Счета, отсортированные по коду
1.1 1.10 1.11 1.2 1.3 1.N
Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства Возможное решение проблемы неверной сортировки счетов – использование лидирующих нулей или пробелов при кодировании счетов в плане счетов (табл. 12.6). Таблица 12.6. Использование лидирующих нулей в коде счета Коды по порядку их ввода (как должно быть)
Счета, отсортированные по коду
01.01 01.02 01.03 01.0N 01.10 01.11
01.01 01.02 01.03 01.0N 01.10 01.11
Альтернативный вариант решения проблемы сортировки – воспользоваться свойством счета Порядок. Это поле с автоматическим индексированием, предназначенное для хранения значения, по которому будет выполняться упорядочивание счетов в форме списка и результатах запроса. В отличие от кода, который для хранения в базе данных может упаковываться, порядок хранится в базе в неизменном виде. Порядок становится доступным для использования, если его длина больше нуля. При этом платформа не разрешит записать в базу данных счет с пустым порядком. Зададим длину порядка в нашем плане счетов (5 символов), порядок зададим произвольный (рис. 12.8).
Листинг 12.1. Пример автоматического формирования порядка счета
Процедура ПередЗаписью(Отказ)
Порядок = ПолучитьПорядокКода();
КонецПроцедуры
Метод ПолучитьПорядокКода() развернет упакованный код и дополнит его «лидирующими пробелами», что позволит упорядочить план счетов правильно, без использования в коде счета лидирующих нулей (табл. 12.7). Таблица 12.7. Пример использования метода «ПолучитьПорядокКода()» Номера символов
1
2
3
4
5
Вводим код счета Маска кода счета Хранится в базе данных ПолучитьПорядокКода()
1 @ 1 пробел
пробел @ . 1
. . 1 .
1 @ нет пробел
пробел @ Нет 1
После выполнения записи всех счетов в пользовательском режиме и установки сортировки по полю Порядок план счетов приобретет следующий вид (рис. 12.9).
Рис. 12.9. Сравнение сортировки по порядку и по коду Рис. 12.8. Сравнение сортировки по коду и по порядку
На картинке видно, что при сортировке по полю Порядок счет Капитал с кодом 3 занял первое место (порядок 01), а счет Активы переместился вниз. Если в маске кода счета используются только символы @ и символыразделители, то для счетов, вводимых в пользовательском режиме, поле Порядок можно сформировать автоматически. Для этого в модуле формы счета или в модуле объекта (закладка Прочее, кнопка Модуль объекта) необходимо разместить процедуру – обработчик события (листинг 12.1).
Том 1
Мы видим, что при сортировке по полю Порядок введенный пользователем счет Новый счет с кодом 1.11 занял свое «законное» место – последним в группе Активы. Тем не менее, остается возможность отсортировать план счетов по коду. Кроме того, при вводе предопределенного счета поле Порядок автоматически не заполняется. Для автоматического заполнения поля Порядок кодом, дополненным лидирующими пробелами при вводе предопределенного счета, и для подмены сортировки по коду сортировкой по порядку используется свойство счета Автопорядок по коду. После его установки, во-первых, при вводе предопределенного счета в момент перехода с поля Код (Tab или Enter) при незаполненном порядке счета поле Порядок будет заполняться по описанным выше правилам (как при использовании
619
Глава 12. Бухгалтерский учет метода ПолучитьПорядокКода()). А во-вторых, в формах списка и запросах при указании сортировки по полю Код сортировка будет выполняться не по полю Код, а по полю Порядок, т. е. получить порядок кодов будет невозможно (рис. 12.10).
«Бесконечная иерархичность» плана счетов обеспечивается благодаря свойству Родитель счета. Это свойство может заполняться и для предопределенных счетов, и для счетов, вводимых пользователем. Это свойство содержит ссылку на родительский счет. Рассмотрим свойство Иерархичность на схеме (рис. 12.11).
Рис. 12.10. Сравнение сортировки по коду и по порядку
Две приведенные картинки отличаются между собой колонкой, по которой выполняется сортировка. Левый список отсортирован по полю Код, правый – по полю Порядок, но сортировка на обоих выполняется по полю Порядок. Это можно увидеть по положению счета 1.11, который ранее, при сортировке по полю Код, всегда занимал место после счета с кодом 1.1. Подобная же сортировка (по полю Порядок) будет выполняться и в запросах при указании в предложении УПОРЯДОЧИТЬ ПО в качестве поля сортировки Код (листинг 12.2). Листинг 12.2. Сортировка по полю «Код» в тексте запроса
УПОРЯДОЧИТЬ ПО Код
Иерархичность плана счетов Как уже было замечено выше, объект План счетов позволяет создавать иерархические планы счетов. Наш план счетов имеет два уровня вложенности – счета первого уровня Активы, Обязательства и Капитал и несколько субсчетов к счетам Активы и Обязательства. Платформа позволяет создавать неограниченное число счетов и уровней вложенности. Это свойство плана счетов позволяет детализировать учет, однако детализация эта будет иерархической и не позволит организовать фасетное (параллельное) деление итогов. Например, не удастся организовать учет товаров на складах с возможностью автоматического получения итогов по складу, по товару и по товару на складе. Т. е. иерархическая организация плана счетов не может в полной степени обеспечить ведение аналитического учета. Для ведения аналитического учета предназначены понятия Вид субконто и Субконто, о которых пойдет речь в разделе «Основы организации аналитического учета» на стр. 624.
620
Рис. 12.11. Иерархичность плана счетов
При необходимости иерархичность плана счетов всегда можно изменить, например, разделив счет Касса на два субсчета – Рублевая касса и Валютная касса. При такой иерархичности счета первого уровня (в нашем случае Активы, Обязательства и Капитал), имеющие субсчета, не теряют возможности участвовать в проводках и выполнять те же функции, что и счета конечного уровня. И, кроме того, они позволяют сгруппировать данные в отчетах, суммируя итоги со своих субсчетов. План счетов напоминает справочник, у которого установлено свойство Иерархия элементов.
Ввод проводок и формирование отчетов по счетам, содержащим подчиненные Подобная организация плана счетов позволяет перепроектировать подчинение счетов в плане счетов в процессе работы с программой. Счет, предназначенный изначально для ведения по нему учета, однажды может стать группой счетов, объединяющей в себе субсчета более низкого уровня. Рассмотрим пример на нашем плане счетов. Предположим, что до какого-то момента счета Активы и Обязательства не имели субсчетов и участвовали в проводках (рис. 12.12). Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства в информационной базе присутствуют проводки по счетам, имеющим субсчета. Все проводки, сделанные по счету, имеющему субсчета, группируются системой и отображаются в отчете по «служебному» субсчету. При написании запросов к регистру бухгалтерии можно получить данные только по проводкам счета, имеющего субсчета (листинг 12.3). Листинг 12.3. Условие для получения данных по счету
Счет = &Счет Рис. 12.12. Документ «Операция»
Далее было принято решение разбить счета Активы и Обязательства на субсчета и не использовать их в проводках в дальнейшем. Запрет использования в проводках можно реализовать, добавив в план счетов реквизит, принимающий два значения: разрешить или запретить использовать в проводах, и проверяя его значение при выборе счета в диалоге формы документа. Итак, решение было принято, были созданы субсчета, и все дальнейшие проводки вводились пользователем по субсчетам. На рис. 12.13 приведен фрагмент отчета, который показывает состояние остатков и оборотов по счетам после того, как в базу были введены и проводки по счетам Активы и Обязательства, и проводки по их субсчетам.
В приведенном примере &Счет – это параметр типа ПланСчетовСсылка., содержащий ссылку на счет, имеющий субсчета. Если необходимо получить в отчете данные по счету и всем его субсчетам, условие будет выглядеть иначе (листинг 12.4). При этом в итоги попадут и проводки по самому счету-группе. Листинг 12.4. Условие для получения данных по счету и всем субсчетам
Счет В ИЕРАРХИИ(&Счет)
Однако приведенный пример не является руководством к действию. Если у счета есть подчиненные субсчета, то в проводках, как правило, участвуют они. А сам счет-группа предназначен для сбора итогов по всем своим субсчетам. Приведенный пример лишь демонстрирует следующее: ■■ система корректно отрабатывает ситуации, когда существуют движения и по счету, и по подчиненным ему субсчетам; ■■ всегда существует возможность «разбить» счет на субсчета даже на этапе промышленной эксплуатации системы без необходимости вносить изменения в проводки в закрытом отчетном периоде.
Свойства счета-родителя и подчиненных ему счетов
Рис. 12.13. Отчет «Оборотно-сальдовая ведомость»
Мы видим, что в группах счетов Активы и Обязательства появились остатки и обороты по одноименным субсчетам. Подобных субсчетов нет в плане счетов. Так платформа интерпретирует в отчетах ситуацию, когда Том 1
Продолжая рассматривать иерархическую организацию плана счетов, обратим внимание на такую особенность, как возможные отличия свойств счета-родителя и подчиненных ему субсчетов. Это свойство плана счетов позволяет создать у активного счета пассивные субсчета, или использовать на счете и его субсчетах различную аналитику, или задавать коды субсчетов без учета кода счета родителя. Как можно использовать, например, различную аналитику на счете и его субсчетах? Это может иметь смысл, только если ранее использовавшийся счет был разбит на субсчета и на них потребовалась другая аналитика, или если один из субсчетов выбивается из общего правила (все субсчета имеют одну детализацию и счет-родитель ее же, а один субсчет – другую).
621
Глава 12. Бухгалтерский учет Может ли на практике счет-родитель быть активным, а его субсчета активными и пассивными? Может! Например, счет Внеоборотные активы будет, несомненно, активным (ведь это же активы!), а среди его субсчетов могут быть и активные (Первоначальная стоимость), и пассивные (Накопленная амортизация). Схожей особенностью обладает и код счета. Каждый счет в плане счетов нумеруется в соответствии с маской кода счета и включает в себя коды «предполагаемых» родителей. Подчеркнем слово «предполагаемых». Если уникальность кода не используется, то для счета возможна смена родителя. Таким образом, счет с кодом 1.1, говорящим нам, что он располагается внутри группы счетов с кодом 1, на самом деле может оказаться в группе 3 или любой другой по усмотрению пользователя (рис. 12.14).
Рис. 12.15. Отчет «Карточка счета» Листинг 12.5. Фрагмент отчета «Карточка счета» Рис. 12.14. Счет «Касса»
В результате иерархичность счетов и иерархичность кодов счетов могут отличаться, что необходимо учитывать при написании кода, как в объектной модели, так и при написании запросов. Рассмотрим возможные ошибки на примере. Задача – сделать отчет Карточка счета, который позволит пользователю получить отбор всех проводок по одному счету. Воспользуемся в качестве источника данных для этого отчета виртуальной таблицей регистра бухгалтерии ДвиженияССубконто. Таблица, которая должна получиться в результате выполнения отчета, показывает все проводки по счету (или группе счетов). Отбор осуществляется по счету (или группе счетов), выбранному в диалоге пользователем. Если выбранный пользователем счет участвует в проводке по дебету, сумму проводки необходимо отобразить в колонке СуммаДт; если по кредиту – СуммаКт (рис. 12.15). При построении отчета по группе счетов можно разными способами проверить, принадлежит ли выбранной группе дебетуемый или кредитуемый счет проводки. Первый вариант кода (листинг 12.5) выполняет проверку при обработке результатов запроса.
622
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДвиженияССубконто.Период КАК Период, | ДвиженияССубконто.Регистратор, | ПРЕДСТАВЛЕНИЕ(ДвиженияССубконто.Регистратор), | ДвиженияССубконто.СчетДт, | ДвиженияССубконто.СчетКт, | ДвиженияССубконто.Сумма |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ДвиженияССубконто(&НачПериода, | &КонПериода, Счет В ИЕРАРХИИ (&Счет)) | КАК ДвиженияССубконто | |УПОРЯДОЧИТЬ ПО Период"; Запрос.УстановитьПараметр("КонПериода", КонПериода); Запрос.УстановитьПараметр("НачПериода", НачПериода); Запрос.УстановитьПараметр("Счет", Счет); Результат = Запрос.Выполнить(); КодКоррСчета = Счет.Код; ОборотДт = 0; ОборотКт = 0; ВыборкаДетали = Результат.Выбрать();
Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства Пока ВыборкаДетали.Следующий() Цикл Если Найти(ВыборкаДетали.СчетДт.Код, КодКоррСчета) > 0 Тогда ОбластьДетальныхЗаписей.Параметры.СуммаДт = ВыборкаДетали.Сумма; ОборотДт = ОборотДт + ВыборкаДетали.Сумма; КонецЕсли; Если Найти(ВыборкаДетали.СчетКт.Код, КодКоррСчета) > 0 Тогда ОбластьДетальныхЗаписей.Параметры.СуммаКт = ВыборкаДетали.Сумма; ОборотКт = ОборотКт + ВыборкаДетали.Сумма; КонецЕсли; КонецЦикла;
Этот вариант проверяет вхождение кода счета дебета или кода счета кредита (метод Найти()) в код счета, выбранного в диалоге. Не учитывается возможность несовпадения иерархии кодов и иерархии счетов. В случае несовпадения иерархии кодов и счетов отчет будет сформирован неверно. Второй вариант (листинг 12.6) выполняет сравнение в запросе, его и рекомендуется использовать. Листинг 12.6. Фрагмент отчета «Карточка счета»
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДвиженияССубконто.Период КАК Период, | ДвиженияССубконто.Регистратор, | ПРЕДСТАВЛЕНИЕ(ДвиженияССубконто.Регистратор), | ВЫБОР | КОГДА ДвиженияССубконто.СчетДт В ИЕРАРХИИ (&Счет) | ТОГДА ДвиженияССубконто.Сумма | ИНАЧЕ 0 | КОНЕЦ КАК СуммаДт, | ВЫБОР | КОГДА ДвиженияССубконто.СчетКт В ИЕРАРХИИ (&Счет) | ТОГДА ДвиженияССубконто.Сумма | ИНАЧЕ 0 | КОНЕЦ КАК СуммаКт |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ДвиженияССубконто(&НачПериода, | &КонПериода, Счет В ИЕРАРХИИ (&Счет)) | КАК ДвиженияССубконто | |УПОРЯДОЧИТЬ ПО | Период |ИТОГИ | СУММА(СуммаДт), | СУММА(СуммаКт) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("КонПериода", КонПериода); Запрос.УстановитьПараметр("НачПериода", НачПериода); Запрос.УстановитьПараметр("Счет", Счет); Результат = Запрос.Выполнить();
Том 1
ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ВыборкаОбщийИтог.Следующий(); // Общий итог ВыборкаДетали = ВыборкаОбщийИтог.Выбрать(); Пока ВыборкаДетали.Следующий() Цикл // … КонецЦикла;
Это не означает, что нельзя проверить принадлежность группе при обходе результатов запроса. Можно. Но нужно проверять принадлежность родителю, а не «коду».
Предопределенные и пользовательские счета План счетов может содержать счета, вводимые пользователем, и счета, введенные на этапе конфигурирования. Последние называются предопределенными и являются объектами конфигурации (имеют свое уникальное имя в рамках плана счетов). Нужно отметить, что для плана счетов, в отличие, например, от справочника, который обладает такой же возможностью, ввод счетов в режиме Конфигуратор является в большинстве случаев основным вариантом заполнения. План счетов, ну или по крайней мере его основа (счета первого уровня), создается еще на этапе конфигурирования и во многом определяет логику учета. Ввод новых счетов (субсчетов) пользователем является скорее исключением, чем правилом.
Свойства счета Предопределенные счета вводятся по кнопке Предопределенные с закладки Прочие плана счетов. При вводе для предопределенного счета есть возможность задать следующие свойства (табл. 12.8). Таблица 12.8. Свойства счета Свойство
Комментарий
Может изменяться пользователем
Имя
Имя объекта Счет-родитель Код счета в соответствии с маской Наименование счета Активный, Пассивный, Активный/ Пассивный определяет вариант подсчета остатков по счету По счету не выполняется контроль двойной записи Сортировка счетов в списке и запросах
Нет Да Да Да
Участие счета в том или ином виде учета
Нет
Родитель Код Наименование Вид счета Забалансовый Порядок Признаки учета (сколько
введено в плане счетов)
Нет Нет Да
623
Глава 12. Бухгалтерский учет Свойство Виды субконто (не более чем
определено в плане счетов) Признаки учета субконто
(сколько определено в плане счетов)
Комментарий
Может изменяться пользователем
Детализация счета в аналитическом учете
Нет*
Возможность отключить ведение того или иного вида учета для одного вида субконто на счете
Нет*
* Для предопределенных счетов в режиме 1С:Предприятие можно добавлять новые виды субконто и изменять признаки учета субконто для этих видов субконто. Но нельзя удалять виды субконто счета, введенные в конфигураторе. А также нельзя изменять признаки учета субконто для этих видов субконто.
Как мы видим, часть свойств, которые мы задаем на этапе конфигурирования, может изменяться пользователем при работе в информационной базе. По сути, задавая такие поля, как Код, Родитель, Наименование, Порядок, мы лишь указываем начальные стандартные значения. Пользователь сможет присвоить свой код, изменить наименование, переопределить родителя, установить новый порядок сортировки счетов.
Особенности написания запросов Возможность изменения этих свойств необходимо учитывать при конфигурировании. Так, например, при написании запроса для получения остатка по одному счету можно поступить следующим образом (листинг 12.7). Листинг 12.7. Пример получения остатка по счету
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.СуммаОстаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(, Счет.Код = ""1.1"", | , ) КАК Остатки"; Остатки = Запрос.Выполнить().Выбрать(); Остатки.Следующий(); Остаток = Остатки.СуммаОстаток;
В этой процедуре выполняется запрос, получающий из виртуальной таблицы регистра бухгалтерии РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки остаток по счету с кодом 1.1, который в нашем плане счетов называется Касса. Ну или, точнее, назывался на этапе конфигурирования. Если пользователь изменит код счета, запрос или не будет выполнен, или будет выполнен не по тому счету. Поэтому всегда имеет смысл при установке отборов по счетам использовать или ссылку (полученную, например, путем выбора в диалоге элемента из плана счетов), или неизменяемое имя предопределенного счета (рис. 12.16).
624
Рис. 12.16. Свойства предопределенного счета
ВНИМАНИЕ!
Когда мы сказали о необходимости использовать имя для получения ссылки на предопределенный счет плана счетов, имелось в виду свойство счета Имя, а не наименование счета. Имя – свойство любого объекта метаданных конфигурации, в том числе и предопределенного счета плана счетов. Имя служит для однозначной идентификации счета в плане счетов конфигурации и как следствие может использоваться для получения ссылки на объект. Листинг 12.8. Пример получения остатка по счету
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.СуммаОстаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(, Счет = &Счет, , ) КАК Остатки"; Запрос.УстановитьПараметр("Счет", ПланыСчетов.ОсновнойПланСчетов.Касса); Остатки = Запрос.Выполнить().Выбрать(); Остатки.Следующий(); Остаток = Остатки.СуммаОстаток;
Основы организации аналитического учета Иерархический план счетов позволяет организовать детальный учет. И при желании можно организовать детальный аналитический учет, используя возможность организации иерархического плана счетов и ввода новых субсчетов пользователем. Однако эта детализация будет иерархической. При такой организации аналитического учета не представляется возможным получение итогов по нескольким параллельным срезам. Рассмотрим учет товаров на складах. Предположим, в нашей организации есть несколько складов, на каждом из которых множество видов номенклатурных позиций. Перед нами стоит задача обеспечить получение остатков и оборотов по каждому складу и товару в отдельности и сводно по всем. Задачу можно решить, используя субсчета счета Товары. Изменив длину кода счета (до 10 символов) и маску кода счета @@.@@.@.@@, мы можем завести к счету учета товаров необходимое количество субсчетов (рис. 12.17). Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства ■■ список складов для учета товаров на складах; ■■ список статей затрат для учета затрат; ■■ и другие. Каждый элемент списка вида субконто представляет собой объект аналитического учета и называется Субконто. Ни субконто, ни вид субконто не имеют объектного представления в системе и существуют лишь как понятия, реализуемые с помощью других объектов. Виды субконто, как правило, бывают ссылочного типа и содержат в себе ссылку на справочник, документ или перечисление, хотя возможны и другие варианты. Если видом субконто является справочник, то субконто – один элемент этого справочника. Сами по себе виды субконто не хранят никакой информации об остатках и оборотах по счетам и являются, по сути, подключаемыми измерениями для счетов плана счетов. Рис. 12.17. План счетов «Основной план счетов»
Подобная организация аналитического учета возможна, но имеет ряд существенных недостатков. Во-первых, план счетов будет расти (и расти существенно) по мере изменения номенклатуры товаров (добавления новых позиций, отказа от старых и появления неиспользуемых). Во-вторых, он будет расти нелинейно, т. к. одна и та же позиция номенклатуры может храниться на разных складах; таким образом, количество субсчетов на каждую позицию будет равняться количеству складов. И самое главное – не представляется возможным автоматически сгруппировать данные по одной позиции номенклатуры, хранимой на разных складах.
Использование видов субконто для организации аналитического учета можно представить в виде схемы на рис. 12.18.
Организацию аналитического учета с использованием субсчетов нельзя назвать неправильной. Это вполне возможный вариант, который имеет свои ограничения (мы перечислили их выше) и свои достоинства. К достоинствам можно отнести, например, интуитивную прозрачность учета для любого бухгалтера, который ранее не сталкивался с учетом при помощи компьютерной программы, всю жизнь проработал в «бумажной бухгалтерии». Однако подавляющее большинство бухгалтеров предпочитают бухгалтерские программы с большими возможностями в части ведения аналитического учета. Для описания возможностей системы при автоматизации задач аналитического учета используются понятия Вид субконто и Субконто. Вид субконто – группа однородных объектов аналитического учета. Понятие «вид субконто» соответствует понятию бухгалтерского учета «аналитический счет». В демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске, возможны следующие виды субконто: ■■ список контрагентов для ведения учета расчетов в разрезе контрагентов; ■■ список номенклатуры товаров; Том 1
Рис. 12.18. Использование видов субконто для организации аналитического учета
Левая часть схемы описывает наш иерархический план счетов. Каждый из счетов предназначен для ввода и хранения относительно укрупненной информации – остаток всех товаров на всех складах, долг всех покупателей, задолженность перед всеми поставщиками и др. Вместо того, чтобы развивать субсчета у названных счетов, мы открываем на них аналитический учет, используя виды субконто. Каждый счет на данной схеме можно
625
Глава 12. Бухгалтерский учет рассматривать как учетный регистр, накапливающий остатки и обороты в денежном выражении. Виды субконто позволяют добавлять измерения в эти регистры и создают новые сущности. Так, например, один и тот же справочник Контрагенты может использоваться для организации аналитического учета как на счете Покупатели, так и на счете Поставщики. Анализируя остатки и обороты по счету Покупатели в разрезе объектов аналитического учета (контрагентов), мы получим список наших покупателей, остатки (задолженность) и обороты (увеличение, погашение) по каждому из них. Возможность системы привязать к одному счету несколько самостоятельных видов субконто позволяет нам получить фасетное (параллельное) деление: например, на одном складе могут быть разные товары, один и тот же товар может быть на разных складах. Мы всегда можем получить остаток по складу, по товару и по товару на складе.
План видов характеристик для создания списка видов субконто
Рис. 12.19. Основные свойства плана видов характеристик
Для хранения списка видов субконто используется объект План видов характеристик. Получаются два уровня вложенности: план, представляющий собой совокупность видов субконто, и вид субконто. Каждый вид субконто хранит информацию о типе характеристик, являющихся объектами аналитического учета, т. е. субконто. Характеристика – это один экземпляр вида характеристик, так же как субконто – это один экземпляр вида субконто. Характеристика не является самостоятельным объектом конфигурации. Для ведения аналитического учета, как правило, используются элементы справочников, значения перечисления, ссылки на документы. Виды характеристик, как правило, имеют ссылочный тип данных (хотя возможны и другие варианты). Один план видов характеристик может использоваться для организации аналитического учета для нескольких планов счетов. Можно провести следующие параллели между понятиями системы и понятиями предметной области (табл. 12.9). Таблица 12.9. Соответствие понятий системы «1С:Предприятие» и понятий предметной области Объект
Понятие
Планы видов характеристик Все виды субконто Вид характеристики Вид субконто Характеристика Субконто
Начнем организацию аналитического учета с создания нового плана видов характеристик. Назовем его ВидыСубконто (рис. 12.19 и 12.20).
626
Рис. 12.20. Тип значения характеристик
Так как в качестве объектов аналитики могут выступать данные разных объектов (разных справочников, как в нашем случае, или справочников и документов и перечислений и др.), то тип значения характеристик устанавливается составным. Фактически в диалоге редактирования типа характеристик мы выбираем объекты конфигурации, которые будут использоваться для ведения аналитического учета. Выбираем, какого типа виды субконто мы (и пользователь) сможем создавать. Нужно отметить, что поле диалога для выбора значения субконто в документах, отчетах и других механизмах будет иметь тип Характеристика.ВидыСубконто плана видов характеристик ВидыСубконто. А тип значения поля в базе данных будет составным и будет включать все выбранные в типе значения характеристик типы. Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства ПРИМЕЧАНИЕ
Не рекомендуется включать в тип значения характеристик какие-либо типы, кроме ссылочных. Это существенно повышает нагрузку на систему. В базе данных поле составного типа, включающего в себя только ссылочные типы данных, хранится в трех полях таблицы (фактический тип хранимого значения, номер таблицы, на которую ссылается значение, и идентификатор записи, на которую ссылается значение). При добавлении в составной тип данных примитивных типов на каждый из них добавляется новое поле в базу данных. Кроме увеличения объема базы данных, это имеет еще одну негативную сторону: система выполняет индексирование полей для хранения итогов по субконто таблиц регистра бухгалтерии, и количество полей в индексе ограничено в SQL-версии 16 полями, часть из которых уже занята под счет, период, измерения. Более подробно эта тема рассмотрена в разделе «Индексы таблиц итогов регистра бухгалтерии» на стр. 681.
Теперь пользователь сможет создать сколько угодно видов субконто, имеющих тип этого справочника, но все его объекты аналитики будут лежать «вперемешку». Чтобы предоставить пользователю возможность создавать отдельные подмножества объектов аналитики, справочник Субконто необходимо сделать подчиненным плану видов характеристик. Подчиненность справочника Субконто плану видов характеристик – обязательное условие функционирования механизма дополнительных характеристик (рис. 12.22).
Как и счета плана счетов, виды субконто могут создаваться как в режиме Конфигуратор, так и в пользовательском режиме. Если мы не считаем необходимым предоставлять пользователю возможность создавать собственные виды субконто, то настройку закладки Общая можно на этом закончить, перейти на закладку Прочее и создать предопределенные виды характеристик (рис. 12.21).
Рис. 12.21. Предопределенные виды характеристик
У пользователя все равно будет возможность создавать новые виды субконто, но только тех типов данных, которые мы выбрали в качестве возможных типов значения характеристик. Например, он сможет создать еще один вид субконто Продавцы типа СправочникСсылка.Контрагенты, но физически эти продавцы будут находиться в справочнике Контрагенты. Маловероятно, что пользователю пригодится такая возможность. Скорее всего, он предпочел бы создать новый вид субконто и хранить в нем какие-то новые объекты аналитики, для которых не предусмотрено справочника в конфигурации. Для предоставления пользователю возможности создавать собственные виды субконто предусмотрен механизм дополнительных значений характеристик. Для этого создается новый справочник в конфигурации, который мы назовем, например, Субконто. Потом включим его в тип значения характеристик и получим таким образом «местечко про запас», где пользователь сможет хранить собственные объекты аналитики. Том 1
Рис. 12.22. Владельцы справочника «Субконто»
Тем самым мы предоставили пользователю возможность создать сколько угодно новых видов субконто. Физически все они будут храниться в одном справочнике, но «перемешиваться» не будут, т. к. на каждый новый вид субконто в справочнике будет выделяться новое множество подчиненных ему элементов. А чтобы нумерация этих элементов была также независимой, имеет смысл на закладке Нумерация объекта конфигурации Справочник Субконто установить переключатель Серии кодов в значение В пределах подчинения владельцу.
627
Глава 12. Бухгалтерский учет Последний штрих – выбрать справочник Субконто в качестве дополнительных значений характеристик (рис. 12.23). Теперь вновь создаваемые пользователем виды субконто (виды характеристик) по умолчанию будут иметь тип значения СправочникСсылка.Субконто.
Рис. 12.24. Субконто плана счетов
Закладка Субконто также позволяет определить максимальное количество субконто на счете. Это число параллельных аналитических срезов (видов субконто), которое можно будет выбрать для каждого счета. И число это в большинстве случаев определяется отчетными потребностями объекта автоматизации. На рисунке выбрано значение 2, в типовом решении «Бухгалтерия предприятия» выбрано значение 3, максимально возможное поддерживаемое платформой значение 50. Рис. 12.23. Дополнительные значения характеристик
подробнее
Раздел «Использование плана видов характеристик для хранения видов характеристик», стр. 483.
Детализация счета плана счетов по видам субконто Теперь, когда созданы «аналитические счета» – виды субконто, нужно, чтобы они заработали и позволили вести аналитический учет на счетах, которые ранее были синтетическими. Для этого необходимо привязать виды субконто к счетам плана счетов. Выполняется это в объекте План счетов. Начинаем настройку с закладки Субконто. На этой закладке в свойстве Виды субконто выбираем план видов характеристик, который хранит виды субконто для этого плана счетов (рис. 12.24).
628
Выбор максимального количества субконто – важный этап в проектировании системы автоматизации бухгалтерского учета, и мы остановимся на нем отдельно в разделе «Принятие решений при организации аналитического учета» на стр. 632. Пока же установка этого свойства привела к тому, что для каждого счета плана счетов было добавлено новое свойство – специализированная табличная часть Виды субконто. И содержать эта табличная часть в нашей конфигурации может максимум две строки. Подчеркнем: именно в нашей конфигурации (где в свойствах плана счетов выбрано значение максимального количества субконто равным двум) и именно для каждого счета (разные счета могут иметь различную детализацию), рис. 12.25. Каждая из строк табличной части содержит ссылку на вид характеристики плана видов характеристик, выбранного в свойстве плана счетов Виды субконто, и дополнительные свойства. Каждая строка табличной части ВидыСубконто содержит следующие поля: ВидСубконто, Предопределенное, ТолькоОбороты и признаки учета субконто. ВидСубконто – свойство типа ПланВидовХарактеристикСсылка.,
позволяющее получить доступ к свойствам вида характеристики плана видов характеристик. Это поле задает вид субконто, в разрезе которого будет вестись аналитический учет. Кроме того, оно может быть исполь-
Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства зовано, например, при установке типов значений для реквизитов формы или для полей построителя отчета (листинг 12.9).
Этот тип данных может быть назначен реквизиту формы и реквизиту объекта, хранимому в информационной базе. Этот тип данных является составным и включает в себя все типы данных, выбранные в свойстве Тип значения характеристик плана видов характеристик. Рассмотрим первый пример, в котором пользователь должен в документе (или справочнике) выбрать сначала в первом поле ввода вид субконто, а затем в другом – объект субконто выбранного ранее вида. Подробнее
Этот пример приведен в демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске, в форме обработки Демонстрационная, на закладке Выбор субконто.
Для этого добавим в форму обработки два реквизита: ВидСубконто типа ПланВидовХарактеристикСсылка.ВидыСубконто и Субконто типа Характеристика.ВидыСубконто (рис. 12.26). Рис. 12.25. Виды субконто Листинг 12.9. Пример использования свойства «ВидСубконто»
Для Каждого ВидСубконто Из Счет.ВидыСубконто Цикл Вид = ВидСубконто.ВидСубконто; ТипЗначения = Вид.ТипЗначения; Наименование = Вид.Наименование; ВведенВКонфигураторе = ВидСубконто.Предопределенное; Оборотный = ВидСубконто.ТолькоОбороты; Количественный = ВидСубконто.Количественный; КонецЦикла;
В приведенном примере счет – переменная или поле ввода типа ПланСчетовСсылка.. Цикл по видам субконто счета позволит узнать их типы, наименования, были они введены в конфигураторе (предопределенный вид субконто был добавлен на счет в режиме Конфигуратор) или добавлены пользователем, узнать признаки учета субконто.
Ввод в диалоге и хранение в базе данных объектов аналитического учета С тех пор, как нами была добавлена возможность ведения аналитического учета, в нашей конфигурации должны будут произойти изменения. Теперь пользователю будет необходимо в диалогах форм отчетов, документов, а может быть и не только, выбирать объекты аналитики, соответствующие выбранному уже в том же диалоге счету. А информационной базе придется сохранять этот сделанный пользователем выбор. Для хранения выбранного пользователем объекта аналитики в конфигурации предусмотрен специальный тип данных Характеристика.. Том 1
Рис. 12.26. Реквизиты «Субконто» и «ВидСубконто»
Если этим ограничиться, то при выборе значения субконто в диалоге формы пользователю сначала будет предлагаться выбор типа из списка типов значений характеристик Виды субконто. Следующая наша задача – ограничить выбор только типами выбранного пользователем вида субконто. Для этого в свойствах поля ввода Субконто необходимо установить свойство Связь по типу в значение, указывающее на реквизит Виды субконто. Теперь, если, например, пользователем выбран вид субконто Контрагенты (который в нашей конфигурации имеет тип
629
Глава 12. Бухгалтерский учет значения СправочникСсылка.Контрагенты), то диалог выбора типа будет содержать только те типы значений, которые может принимать данный вид субконто. Также свойство Связи параметров выбора поля ввода Субконто нужно установить как Отбор.Владелец(ВидСубконто). В результате при выборе значений субконто, содержащихся в справочнике Субконто, для выбора будут предлагаться только те значения, которые относятся к выбранному виду субконто. Диалог выбора типа данных будет предлагаться в случае, если выбранный вид субконто содержит несколько типов данных. В практике создания механизмов для ведения бухгалтерского учета чаще, однако, встречается другая ситуация, когда пользователь выбирает в диалоге формы счет и далее должен выбрать значения субконто того типа данных, который выбран для видов субконто этого счета. В таком случае в диалоге формы размещают поле ввода для реквизита Счет (тип ПланСчетовСсылка.) и устанавливают связь между полем ввода для выбора значения субконто и счетом (минуя вид субконто, который становится не нужен). Подробнее
Этот пример приведен в демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске, в форме документа ВыборСубконтоСчета.
Создадим в документе следующие реквизиты: Счет (тип ПланСчетовСсылка.ОсновнойПланСчетов), Субконто1 (тип Характеристика.ВидыСубконто) и Субконто2 (тип Характеристика.ВидыСубконто). В свойствах нашего плана счетов выбрано максимальное количество субконто равным двум, поэтому более двух значений субконто для одного счета выбирать не потребуется. Установим свойства Связь по типу реквизитов Субконто1 и Субконто2, в которых в этот раз мы укажем реквизит Счет (рис. 12.27). Теперь диалог выбора типа в форме документа будет содержать только те типы значений, которые могут принимать виды субконто выбранного пользователем счета. Чтобы оставить только те типы (или один тип, если используется субконто не составного типа), которые нужны для выбора первого вида субконто, необходимо установить значение свойства Элемент связи по типу равным 1. Для реквизита Субконто2 это свойство будет равным 2. Свойство Элемент связи по типу позволяет указать порядковый номер вида субконто на счете, значение которого должно выбираться в соответствующем поле ввода. Следующая наша задача – избавиться от диалога выбора типа. Для этого создадим форму документа и напишем процедуру – обработчик события ПриИзменении поля ввода Счет (листинг 12.10).
630
Рис. 12.27. Реквизиты «Субконто» и «Счет» документа «ВыборСубконтоСчета» Листинг 12.10. Обработчик события «ПриИзменении» поля ввода «Счет»
&НаКлиенте Процедура СчетПриИзменении(Элемент) ВыбиратьТипСубконто(); УстановитьВидимостьСубконто(); КонецПроцедуры
При изменении счета вызывается сначала процедура ВыбиратьТипСубконто() и затем процедура УстановитьВидимостьСубконто(), листинг 12.11. Листинг 12.11. Процедура «ВыбиратьТипСубконто»
&НаСервере Процедура ВыбиратьТипСубконто() ЧислоСубконто = Объект.Счет.ВидыСубконто.Количество(); Для Сч = 1 По ЧислоСубконто Цикл ТипСубконто = Объект.Счет.ВидыСубконто[Сч - 1].ВидСубконто.ТипЗначения; Элементы["Субконто" + Сч].ВыбиратьТип = (ТипСубконто.Типы().Количество() > 1); Если ТипСубконто.ПривестиЗначение(Объект["Субконто" + Сч]) Объект["Субконто" + Сч] Тогда Объект["Субконто" + Сч] = ТипСубконто.ПривестиЗначение(Объект["Субконто" + Сч]); КонецЕсли; КонецЦикла; КонецПроцедуры
Профессиональная разработка в системе «1С:Предприятие 8»
План счетов и его основные свойства Прокомментируем текст этой процедуры. Процедура написана достаточно универсально и не зависит от настроек ведения аналитического учета плана счетов. Сначала мы узнаем число субконто, задействованных для ведения аналитического учета на выбранном счете. В цикле по количеству субконто на счете мы получаем описание типов субконто. Для этого обращаемся к табличной части счета ВидыСубконто и получаем из нее строку, обращаясь к ней по индексу (индексация строк этой табличной части начинается с нуля). Выбор типа из поля ввода субконто имеет смысл только для субконто составного типа (такие тоже могут быть). Мы определяем количество типов, входящих в описание типа, и, если этот тип составной (более одного), устанавливаем флажок элемента формы ВыбиратьТип.
Признаки учета субконто Признаки учета субконто будут рассмотрены нами подробнее при изучении регистра бухгалтерии в разделе «Свойство ресурса «Признак учета субконто»» на стр. 642. Пока же рассмотрим вкратце их предназначение и создание. Признаки учета субконто дополняют специализированную табличную часть Виды субконто новыми свойствами типа Булево. Каждое свойство, связанное с ресурсом регистра бухгалтерии, позволяет управлять хранением остатков и оборотов выбранного ресурса для объектов субконто выбранного счета (рис. 12.28).
Наша процедура расположена в модуле формы документа. Основной реквизит этой формы ДокументОбъект. Мы стараемся писать процедуру универсально, поэтому предусматриваем возможность ее вызова не только при изменении счета, но и, например, при открытии формы. Чтобы не устанавливать флажок модифицированности при открытии формы, мы проверяем тип значения реквизита на соответствие типу субконто и приводим тип только в том случае, если тип реквизита отличается от типа описания субконто. Последний штрих в работе этого механизма – управление видимостью полей ввода субконто и заголовками для этих полей. Это связано с тем, что не на каждом счете используются оба вида субконто, могут быть счета, где задействован только один аналитический разрез или вообще ни одного (листинг 12.12). Листинг 12.12. Процедура «УстановитьВидимостьСубконто»
Процедура УстановитьВидимостьСубконто() Для НомерСубконто = 1 по 2 Цикл Если (НомерСубконто 0 Тогда Проводки.УстановитьАктивность(НЕ Проводки[0].Активность); КонецЕсли; ЗначениеВРеквизитФормы(Документ, "Объект"); КонецПроцедуры
Процедура получает активность первой записи из набора (с индексом 0), инвертирует ее (НЕ) и устанавливает полученную в результате активность для всего набора.
649
Глава 12. Бухгалтерский учет Рассмотрим еще один вариант использования этого свойства движения на примере документа Операция. Операция не хранит в себе движения, а лишь объединяет их одним регистратором, которым и является. Документ не проводится (не выполняет алгоритм проведения документа) и поэтому не может быть снят с проведения. Если установить на документ пометку на удаление, записи в регистре остаются неизмененными, т. е. даже удаленная операция продолжает участвовать в учете. Поставим задачу – удаленная операция не должна участвовать в учете, не должна попадать в отчеты. Но должна быть возможность, сняв пометку на удаление, вернуть ее в учет. Для этого воспользуемся свойством Активность движения регистра. При установке пометки удаления документа будем снимать активность записей, при снятии пометки на удаление – восстанавливать активность записей (листинг 12.16). Листинг 12.16. Управление активностью записей при установке/снятии пометки удаления документа
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Проводки = Движения.ОсновнойРегистрБухгалтерии; НужноСчитатьНабор = (НЕ Ссылка.Пустая() И НЕ Проводки.Модифицированность() И НЕ Проводки.Выбран()); Если НужноСчитатьНабор Тогда Проводки.Прочитать(); КонецЕсли; КоличествоПроводок = Проводки.Количество(); Если КоличествоПроводок > 0 Тогда ТекущаяАктивностьПроводок = Проводки[0].Активность; НужнаяАктивностьПроводок = НЕ ПометкаУдаления; Если ТекущаяАктивностьПроводок НужнаяАктивностьПроводок Тогда Проводки.УстановитьАктивность(НужнаяАктивностьПроводок); КонецЕсли; КонецЕсли; КонецПроцедуры
Прокомментируем работу процедуры. Обработчик события Перед записью объекта документа выполняется перед каждой записью документа. Отметка о проведении документа является свойством документа. После изменения этого свойства платформа производит запись документа в базу. Процедура получает в переменной Проводки набор записей регистра движений документа. Запись движений в регистр осуществляется в разных ситуациях. Это может быть интерактивная запись нового документа пользователем, запись измененного документа пользователем, удаление или снятие пометки удаления документа.
650
Документ в момент открытия формы считывает набор записей из регистра бухгалтерии. Если форму не открывали, а установка пометки удаления осуществляется без открытия формы, необходимо прочитать из информационной базы набор записей регистра. Необходимость считывать набор из регистра определяется совпадением трех условий: ■■ этот документ не новый; если он новый, то набор записей документа еще не записан в базу, а находится в документе; ■■ набор записей регистра не был изменен; если он был изменен, то считывание его из базы затрет изменения пользователя; ■■ набор еще не считывался из базы данных, что позволяет узнать метод Выбран(). Если все три условия присутствуют, считываем из регистра набор записей и выполняем действия с ним. Проверив количество движений в наборе записей, мы получаем текущую активность движений набора записей по первой записи и устанавливаем нужную активность для набора записей.
Программно при проведении документа Формирование и запись проводок в момент проведения документа можно считать основными вариантами изменения регистра бухгалтерии. В отличие от документа Операция, запись проводок при проведении позволяет описать сложный алгоритм формирования проводок, вычисление сумм и обусловленное заполнение других свойств записей и используется для автоматизации ввода часто встречающихся в практике учета операций. В этом случае заполнение набора записей регистра осуществляется в обработчике события проведения документа ОбработкаПроведения. Несложный алгоритм проведения, использующий при заполнении свойств движений преимущественно значений реквизитов документа, можно разработать с использованием конструктора движений. Рассмотрим его работу на примере документа ПриходнаяНакладная. Документ предназначен для ввода проводок закупки товаров у поставщика. Подробнее
Этот пример приведен в демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске.
В шапке документа пользователь сможет выбрать организацию (из справочника Организации), поставщика (из справочника Контрагенты) и склад (из справочника Склады). В табличной части будут выбираться товары (из справочника Номенклатура), вводиться цена покупки, количество и сумма товара (рис. 12.49). Форма документа включает все перечисленные реквизиты. Профессиональная разработка в системе «1С:Предприятие 8»
Запись движений в регистр бухгалтерии Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто. Номенклатура] = ТекСтрокаТовары.Номенклатура; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Склады] = Склад; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто. Контрагенты] = Поставщик; КонецЦикла; КонецПроцедуры
Рис. 12.49. Данные документа «ПриходнаяНакладная»
Конструктор движений документа Алгоритм проведения такого документа может быть полностью сформирован конструктором движений документа, вызываемым по кнопке Конструктор движений с закладки Движения свойств документа (рис. 12.50). Результатом работы конструктора (убраны только комментарии) будет процедура в модуле объекта (листинг 12.17). Листинг 12.17. Процедура «ОбработкаПроведения()»
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОсновнойРегистрБухгалтерии.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ОсновнойРегистрБухгалтерии.Добавить(); Движение.СчетДт = ПланыСчетов.ОсновнойПланСчетов.Товары; Движение.СчетКт = ПланыСчетов.ОсновнойПланСчетов.Поставщики; Движение.Период = Дата; Движение.Организация = Организация; Движение.Сумма = ТекСтрокаТовары.Сумма; Движение.КоличествоДт = ТекСтрокаТовары.Количество; Движение.Содержание = "Покупка товара";
Том 1
Рис. 12.50. Конструктор движений регистров
Сначала указываются наборы записей, содержащие движения документа по регистрам, которые должны быть записаны при проведении документа. В цикле по табличной части Товары в набор записей регистра бухгалтерии, расположенный в коллекции движений, добавляется новое движение. Далее заполняются свойства записи регистра. После выхода из обработки проведения те наборы записей, у которых свойство Записывать имеет значение Истина, будут автоматически записаны платформой. В этот типовой алгоритм, сформированный конструктором, можно было бы внести изменения. Возможен альтернативный вариант синтаксиса при заполнении субконто проводки. Вариант, используемый конструктором, является более универсальным и больше подходит для документов, где счет выбирается в диалоге пользователем (листинг 12.18).
651
Глава 12. Бухгалтерский учет Листинг 12.18. Пример установки значения субконто
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Поставщик;
В этой строке обращение к элементу коллекции субконто кредита проводки производится с использованием оператора «[ ]», в который в качестве параметра необходимо передать ссылку на вид характеристик. В нашем случае ссылки на элементы видов субконто получаются по предопределенным (неизменяемым) именам видов субконто, и поэтому можно было бы использовать упрощенный синтаксис (листинг 12.19).
расширения формы документа стандартно установится в значение Автоматически. Если установить свойство ИспользоватьРежимПроведения в значение Оперативный и попытаться провести документ задним числом, то пользователю будет выдано предупреждение и отказано в проведении документа (рис. 12.52).
Листинг 12.19. Пример установки значения субконто
Движение.СубконтоКт.Контрагенты = Поставщик; Рис. 12.52. Предупреждение о невозможности оперативного проведения задним числом
Оперативное и неоперативное проведение Оперативность – это свойство документа, используемое в первую очередь при решении задач оперативного учета в реальном времени. Бухгалтерия редко работает в реальном времени. Как правило, бухгалтер работает со свершившимися событиями, обрабатывая первичные документы за отчетный период. Поэтому свойство документа Оперативное проведение обычно при решении задач бухгалтерского учета устанавливают в значение Запретить. Тем не менее, практика автоматизации учета малых предприятий показывает частое использование механизмов бухгалтерского учета для решения задач учета оперативного, поэтому мы кратко рассмотрим это свойство и возможности его использования. подробнее
Раздел «Оперативный учет. Описание задач, решаемых регистрами накопления», стр. 545.
Свойство Оперативное проведение, установленное в значение Разрешить, позволит контролировать ввод документов задним числом и запретить ввод документов будущей датой. При попытке проведения документа будущей датой пользователю будет выдано предупреждение и отказано в проведении документа (рис. 12.51).
Рис. 12.51. Предупреждение о невозможности оперативного проведения будущей датой
При вводе документа задним числом платформа автоматически проведет документ неоперативно, так как свойство ИспользоватьРежимПроведения
652
Если же установить свойство ИспользоватьРежимПроведения в значение Запрашивать, то пользователю будет предложено выбрать режим проведения документа (рис. 12.53).
Рис. 12.53. Выбор режима проведения
Пользователь может изменить дату документа на текущую и провести документ оперативно, выбрав режим Оперативное проведение, или отказаться от оперативного проведения, и тогда документ будет проведен неоперативно и записан в базу с существующей датой и временем. подробнее
Раздел «Установка режима проведения», стр. 521.
При проведении документа во второй параметр процедуры ОбработкаПроведения будет передано значение системного перечисления РежимПроведенияДокумента – Оперативный или Неоперативный, которое и может анализировать разработчик конфигурации с целью принятия решения о способе проведения документа. Основная задача, которую может помочь решить разделение проведения документа на оперативное и неоперативное, – это сокращение времени на проведение документа, если документы вводятся в реальном времени и в правильной (реальной, соответствующей событиям в реальной жизни) хронологической последовательности. Время на проведение документа всегда является критичным фактором в оценке удобства эксплуатации Профессиональная разработка в системе «1С:Предприятие 8»
Запись движений в регистр бухгалтерии системы, особенно если в ней работает большое число пользователей, и особенно если они работают в реальном времени. Рассматриваемая нами в качестве примера приходная накладная вряд ли может улучшить свою работу, ведь всю необходимую для проведения информацию она содержит в себе и не обращается к другим объектам базы данных. А вот, например, расходная накладная, списывая товар, обязательно должна проверить его наличие по данным учетных регистров (в нашем случае счета Товары регистра бухгалтерии), рассчитать себестоимость и многое другое. В большинстве случаев извлечение данных из базы выполняется с помощью запроса (исключение может составлять лишь получение одного значения, тогда допускается использование метода объекта). Физическая организация таблиц регистра бухгалтерии (более подробно об этом пойдет речь ниже) позволяет наиболее быстро выполнить запрос к текущим итогам. Текущие итоги хранятся в регистре и пересчитываются при любом движении в регистре. Но в каком случае мы можем воспользоваться этими текущими итогами? Только тогда, когда уверены, что, во-первых, не вводились документы будущей датой, и, во-вторых, документ вводится с текущим временем, и, стало быть, нужно «снимать» текущие итоги. Если документ вводится задним числом, то для оценки возможности его проведения, расчета остатков и себестоимости обязательно нужно получать не текущие итоги, а итоги на момент времени документа, что увеличивает время проведения документа. Таким образом, если стоит задача учета документов в реальном времени и большинство документов вводятся в правильной хронологической последовательности, оперативное проведение может существенно сократить время на проведение и улучшить работу пользователей.
Автоматическое удаление движений Свойство документа Удаление движений устанавливается на закладке Движения и может принимать значения Удалять автоматически при отмене проведения (стандартное значение), Удалять автоматически или Не удалять автоматически. В случае значения Удалять автоматически при отмене проведения для свойства Удаление движений движения, связанные с документом, удаляются автоматически только при удалении и отмене проведения документа. При проведении документа движения не удаляются, а перезаписываются. Такое поведение является стандартным для платформы «1С:Предприятие». Используя два других значения свойства Удаление движений, разработчик может реализовывать нестандартные сценарии проведения документа. В случае значения Удалять автоматически для свойства Удаление движений платформа автоматически удаляет старые записи движений, связанных с данным документом, при повторном проведении документа перед Том 1
записью новых движений, а также при удалении и отмене проведения документа. Отключение этого режима имеет смысл, прежде всего, при решении задач оперативного учета в реальном времени. В случае же значения Не удалять автоматически для свойства Удаление движений автоматическое удаление движений для этих ситуаций производиться не будет. Один из вариантов использования документа с отключенным автоматическим удалением движений – построчное проведение документа. При решении задачи автоматизации учета продавцов товаров в реальном времени это свойство может быть актуально. Представим себе ситуацию, что два менеджера продают один и тот же товар, количество которого ограничено. Пока первый из них, удостоверившись в наличии товара на складе по данным регистра, проводит свой документ с установленным свойством Автоматическое удаление движений, второй менеджер за те мгновения, когда старые движения уже удалены, а новые еще не записаны, успевает провести свой документ. Научившись на горьком опыте, первый менеджер начинает нажимать кнопку Провести после добавления каждой строки документа. Но при проведении каждый раз удаляются все ранее сформированные записи в регистре и формируются новые. И между этими двумя событиями все равно остается временной лаг, достаточный для списания товара вторым менеджером. Решение этой проблемы – построчное проведение документа первым менеджером, при котором запись по новой строке добавляется в регистр без удаления всех ранее сделанных движений документа. В этом случае контроль удаления записей при проведении документа в целом, отмене проведения и удалении документа лежит на программисте, разрабатывающем этот документ. Мы рассмотрели последние две темы поверхностно по одной и той же причине: бухгалтерский учет почти никогда не требует работы пользователей в реальном времени.
Программно без проведения документа Документ может иметь движения в регистре, и не будучи проведенным. Для записи движений в регистр можно использовать или свойство документа Движения, содержащее коллекцию наборов записей, или набор записей регистра бухгалтерии. Этот вариант формирования движений в регистр нельзя считать основным. Его можно рекомендовать для офф-лайнового проведения документа, когда в реальном времени документ проводится в оперативном учете, а отражение операции в бухгалтерском учете выполняется в конце отчетного периода. В этом случае можно предложить один из следующих вариантов (листинг 12.20).
653
Глава 12. Бухгалтерский учет Листинг 12.20. Пример записи движений документа
Приходные = Документы.ПриходнаяНакладная.Выбрать(); Пока Приходные.Следующий() Цикл ПриходнаяОбъект = Приходные.ПолучитьОбъект(); Проводки = ПриходнаяОбъект.Движения.ОсновнойРегистрБухгалтерии;
НоваяПроводка = Проводки.Добавить(); НоваяПроводка.Период = ПриходнаяОбъект.Дата; НоваяПроводка.Организация = ПриходнаяОбъект.Организация; НоваяПроводка.СчетДт = ПланыСчетов.ОсновнойПланСчетов.Товары; НоваяПроводка.СчетКт = ПланыСчетов.ОсновнойПланСчетов.Поставщики; НоваяПроводка.Сумма = ПриходнаяОбъект.Всего;
Проводки.Записать(Ложь); КонецЦикла;
Предложенный выше код может располагаться в любой обработке. Программный код получает из базы данных выборку документов, и для каждого из них, создавая объект документа, выполняет заполнение набора записей движениями и запись его в регистр добавлением к тем записям, которые уже существуют в регистре. В приведенном примере для записи движений в регистр используется свойство документа Движения. Можно не использовать его, а воспользоваться набором записей регистра бухгалтерии. Следующий фрагмент кода выполняет ту же задачу, но с использованием объекта РегистрБухгалтерииНаборЗаписей.ОсновнойРегистрБухгалтерии (листинг 12.21).
Оба варианта кода предусматривают возможность непроведенного документа иметь движения. Необходимо, однако, учитывать, что повторное проведение документа штатным способом (интерактивно из формы или программно методом документа Записать(РежимЗаписиДокумента. Проведение)) не будет учитывать наличие добавленной нами записи. Так, например, если в свойствах документа установлено свойство автоматического удаления движения, будет удалено и дополнительное, сделанное обработкой движение. А при формировании движений из процедуры ОбработкаПроведения не будет добавлено движение, описанное в обработке.
Чтение данных регистра бухгалтерии Для чтения данных регистра бухгалтерии в системе «1С:Предприятие» предусмотрены методы объекта РегистрБухгалтерии и набор таблиц, используемых запросом как источники данных. Основным способом извлечения данных в системе является запрос. Мы полагаем, что это утверждение актуально и для регистра бухгалтерии, поэтому начнем изучение подходов к извлечению данных об остатках и оборотах на счетах с изучения таблиц регистра – источников данных запроса. Методы объекта, которые можно считать вспомогательным механизмом, будут рассмотрены позднее.
Таблицы регистра бухгалтерии Регистр бухгалтерии – сложный объект, представленный в табличной модели данных рядом таблиц (рис. 12.54).
Листинг 12.21. Пример записи движений документа
Приходные = Документы.ПриходнаяНакладная.Выбрать(); Проводки = РегистрыБухгалтерии.ОсновнойРегистрБухгалтерии.СоздатьНаборЗаписей(); Пока Приходные.Следующий() Цикл ПриходнаяСсылка = Приходные.Ссылка; Проводки.Отбор.Регистратор.Установить(ПриходнаяСсылка);
НоваяПроводка = Проводки.Добавить(); НоваяПроводка.Период = ПриходнаяСсылка.Дата; НоваяПроводка.Организация = ПриходнаяСсылка.Организация; НоваяПроводка.СчетДт = ПланыСчетов.ОсновнойПланСчетов.Товары; НоваяПроводка.СчетКт = ПланыСчетов.ОсновнойПланСчетов.Поставщики; НоваяПроводка.Сумма = ПриходнаяСсылка.Всего;
Проводки.Записать(Ложь); КонецЦикла;
При использовании набора записей регистра от документа нам нужна ссылка, чтобы по ней установить отбор в наборе записей. Затем, используя методы набора записей регистра, мы добавляем нужную запись в набор записей и записываем его с добавлением.
654
Рис. 12.54. Таблицы запросов регистра бухгалтерии
Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии Все таблицы регистра бухгалтерии можно разделить на две группы: реальные и виртуальные. Реальные таблицы предоставляют доступ посредством запроса к физически существующим в информационной базе таблицам. У регистра бухгалтерии таких таблиц две: основная таблица и таблица значений субконто, которая создается в информационной базе после добавления в конфигурацию механизмов аналитического учета.
Реальные таблицы Имя основной таблицы регистра бухгалтерии содержит имя регистра. И для использования ее в качестве источника данных в нашем случае необходимо написать следующее предложение (листинг 12.22). Листинг 12.22. Обращение к таблице записей регистра бухгалтерии
ИЗ
РегистрБухгалтерии.ОсновнойРегистрБухгалтерии
Основная таблица регистра бухгалтерии с поддержкой корреспонденции содержит следующие поля (табл. 12.27). Таблица 12.27. Поля основной таблицы регистра бухгалтерии Поле
Тип
Комментарий
Период
Дата
Регистратор
ДокументСсылка.
НомерСтроки
Число
Активность
Булево
СчетДт
ПланыСчетовСсылка.
СчетКт
ПланыСчетовСсылка.
Определяется типом измерения
Дата движения Документ движения Номер движения в наборе записей Участвует ли запись в таблицах итогов Дебетуемый счет Кредитуемый счет Балансовое измерение регистра бухгалтерии Небалансовое измерение регистра бухгалтерии создает два поля в регистре
Дт Определяется типом измерения Кт
Определяется типом измерения
Число
Дт
Число
Кт
Число
Балансовый ресурс регистра бухгалтерии Небалансовый ресурс регистра бухгалтерии создает два поля в регистре
Определяется типом реквизита
Характеристика движения регистра
Основная таблица регистра бухгалтерии без поддержки корреспонденции отличается отсутствием корреспонденции счетов и отсутствием деления измерений на балансовые и небалансовые, которые в таблице регистра с поддержкой корреспонденции были представлены двумя полями – свое для дебета и свое для кредита. В регистре без поддержки корреспонденции также присутствуют поля ВидДвижения и Счет. Основная таблица хранит проводки (движения регистра бухгалтерии) без данных аналитического учета. Для хранения данных аналитического учета Том 1
предназначена вторая реальная таблица регистра бухгалтерии – таблица значений субконто. Эта таблица не содержит числовых характеристик и вряд ли может использоваться самостоятельно. В таблице хранится информация о виде и значении каждого субконто проводки. Для получения полной информации о проводке (включая данные аналитического учета) система соединяет данные таблицы движений и таблицы значений субконто по периоду, регистратору и виду движения. Субконто хранятся платформой компактно, и количество полей этой таблицы не зависит от количества субконто на счете. Чем больше субконто описано в проводке, тем больше записей будет содержать таблица значений субконто. Одной проводке из основной таблицы может соответствовать несколько записей таблицы значений субконто. Обращение к таблице значений субконто в нашем случае будет выглядеть так (листинг 12.23). Листинг 12.23. Обращение к таблице значений субконто
ИЗ
РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Субконто
Таблица значений субконто регистра бухгалтерии содержит следующие поля (табл. 12.28). Таблица 12.28. Поля таблицы значений субконто Поле
Тип
Период
Дата
Регистратор
ДокументСсылка.
НомерСтроки ВидДвижения Вид Значение
В
регистре
Комментарий
Дата движения Документ движения Число Номер движения в наборе записей ВидДвиженияБухгалтерии Дебет или Кредит ПланВидовХарактеристикСсылка. Вид субконто Характеристика. Значение субконто
ВидДвижения.
без
поддержки
корреспонденции
отсутствует
поле
Виртуальные таблицы Реальные таблицы регистра бухгалтерии малопригодны для формирования большинства бухгалтерских отчетов и являются скорее вспомогательным механизмом. Для построения отчетов и анализа данных в большинстве случаев используются виртуальные таблицы. Эти таблицы не хранятся в информационной базе и создаются системой при обращении к ним. По своей сути это вложенные запросы. Запросы выполняются системой к физическим таблицам регистра бухгалтерии, о которых мы расскажем ниже. Виртуальные таблицы параметризированы: обращаясь к ним, мы можем передать в качестве параметров условия выполнения запроса.
655
Глава 12. Бухгалтерский учет Виртуальные таблицы узкоспециализированные, предназначены для решения конкретных задач, поэтому проще изучать их исходя из задач, которые с их помощью можно решить.
Таблица остатков Для получения остатков по счетам в разрезе субконто и измерений используется таблица остатков. Эта таблица позволяет решить такие задачи, как получение количественных и суммовых остатков материальнопроизводственных запасов при их списании, определение остатка задолженности для выполнения зачета аванса, расчет амортизации и курсовых разниц и многие другие, где требуется узнать остаток какого-либо ресурса по счету, субконто или измерению, свернутый или развернутый. Таблица не отличается для регистра с поддержкой и без поддержки корреспонденции. Использование таблицы остатков в качестве источника запроса представлено в листинге 12.24. Листинг 12.24. Обращение к таблице «Остатки»
ИЗ
РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки
После имени таблицы в круглых скобках могут (и в большинстве случаев будут) указываться параметры, задающие условия отбора данных из физических таблиц информационной базы. Рассмотрим поля виртуальной таблицы остатков. ■■ Счет – это поле имеет тип ПланСчетовСсылка.. Поле позволяет получить остатки, сгруппированные по счетам; ■■ Субконто – это поле имеет тип Характеристика.. Количество полей Субконто зависит от максимального количества субконто на счете плана счетов. Поле позволяет получить остатки, сгруппированные по значениям субконто; ■■ – тип этого поля задается при создании измерения регистра. Количество полей зависит от количества измерений, объявленных в регистре бухгалтерии. На поле не влияет свойство измерения Балансовый. Поле позволяет получить остатки, сгруппированные по измерениям регистра; ■■ Остаток – это поле имеет тип Число. Абсолютный остаток (как он хранится в физических таблицах информационной базы) без учета вида счета: дебетовый остаток показывается положительным числом, кредитовый – отрицательным; ■■ ОстатокДт – это поле имеет тип Число. Дебетовый остаток с учетом вида счета. Если счет пассивный, значение этого поля всегда равно нулю. Если счет активный, значение поля равно значению поля
656
Остаток. Если счет активно-пассивный, значение поля равно значению поля Остаток, если Остаток больше или равен нулю. Если Остаток
меньше нуля, значит – ноль; ■■ ОстатокКт – это поле имеет тип Число. Кредитовый остаток с учетом вида счета. Если счет активный, значение этого поля всегда равно нулю. Если счет пассивный, равно «- Остаток». Если счет активно-пассивный, значение поля равно нулю, если значение поля Остаток больше или равно нулю. Если значение поля Остаток меньше нуля, значение этого поля равно «- Остаток»; ■■ РазвернутыйОстатокДт – это поле имеет тип Число. Развернутый дебетовый остаток. Имеет смысл только при использовании в запросе итогов. Для детальной записи значение этого поля равно значению поля ОстатокДт. Для итоговой записи равно сумме дебетовых остатков всех детальных записей; ■■ РазвернутыйОстатокКт – это поле имеет тип Число. Развернутый кредитовый остаток. Имеет смысл только при использовании в запросе итогов. Для детальной записи значение этого поля равно значению поля ОстатокКт. Для итоговой записи равно сумме кредитовых остатков всех детальных записей. В физических таблицах регистра хранится абсолютный остаток (поле Остаток), все остальные рассчитываются при формировании системой виртуальной таблицы остатков. Алгоритм расчета полей ОстатокДт и ОстатокКт можно представить в виде схемы (рис. 12.55).
Рис. 12.55. Алгоритм расчета полей «ОстатокДт» и «ОстатокКт»
При обращении к полям ОстатокДт или ОстатокКт система в первую очередь проверяет наличие в запросе группировки (или отбора) по счету. Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии Если такой разрез в запросе есть и этот счет один, вычисление полей зависит от вида счета. Если используемый в запросе счет активный, система отображает в поле ОстатокДт значение поля Остаток, кредитовый остаток для активного счета всегда равен нулю. Если используемый в запросе счет пассивный, значение поля ОстатокКт будет равно значению поля Остаток с обратным знаком («- Остаток»), дебетовый остаток для пассивного счета всегда равен нулю. При расчете полей остатков активно-пассивного счета система дополнительно будет анализировать знак остатка. Если поле Остаток содержит положительное число, остаток будет интерпретирован системой как ОстатокДт; если отрицательное – как ОстатокКт. В случае, если в запросе нет разреза по счету или в качестве условия используется отбор по списку счетов, поля ОстатокДт и ОстатокКт рассчитываются по правилам активно-пассивного счета. Алгоритм формирования развернутых остатков счета мы рассмотрим более подробно ниже. Параметры виртуальной таблицы остатков позволяют задать условие отбора данных из информационной базы. Параметры следует задавать строго в порядке их описания. ■■ Период – имеет тип значения Дата, МоментВремени или Граница. На этот момент будут рассчитаны остатки виртуальной таблицы. Если параметр не задан, будут получены актуальные остатки, включающие движения последнего проведенного документа. Физическая организация таблиц позволяет максимально быстро получить остатки за месяц (на начало следующего месяца) и актуальные остатки; ■■ УсловиеСчета – содержит конструкцию языка запросов. Позволяет установить фильтр по счету или счетам. Как правило, содержит следующие условия: Счет = (В ИЕРАРХИИ, В) &Счет; ■■ Субконто – имеет тип ПланВидовХарактеристикСсылка. или содержит массив значений типа ПланВидовХарактеристикСсылка.. В этот параметр таблицы можно передать ссылку на вид субконто для получения отбора по этому виду или массив видов для установки отбора и упорядочивания видов субконто в результате запроса; ■■ Условие – содержит конструкцию языка запросов. Позволяет устанавливать отбор данных виртуальной таблицей по значениям субконто и измерений регистра бухгалтерии. Рассмотрим примеры построения запросов к таблице остатков регистра бухгалтерии. При необходимости получить количественный остаток конкретного товара со счета товаров можно использовать следующий код (листинг 12.25). Том 1
Листинг 12.25. Пример получения остатка товара
ВЫБРАТЬ Остатки.КоличествоОстаток ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Момент, Счет = &СчетТоваров, , Организация = &Организация И Субконто1 = &Номенклатура) КАК Остатки
В приведенном тексте запроса используются параметры: ■■ Момент – Дата, МоментВремени или Граница, на которую необходимо получить остаток; ■■ СчетТоваров – ПланСчетовСсылка.. Ссылку для предопределенного счета можно получить по имени, например: СчетТоваров = ПланыСчетов.ОсновнойПланСчетов.Товары; ■■ Организация – ссылка на элемент справочника Организации, который используется как измерение регистра; ■■ Номенклатура – ссылка на элемент справочника Номенклатура, который используется на счете товаров как первый вид субконто. Результат запроса будет содержать одну строку в одном поле: абсолютный остаток по ресурсу регистра Количество. Следующий запрос позволяет отобрать остатки по всем счетам, по которым ведется валютный учет, и в разрезе валют проанализировать остатки в валюте сделки и в валюте учета (листинг 12.26). Листинг 12.26. Пример получения остатков регистра бухгалтерии
ВЫБРАТЬ Остатки.Счет, Остатки.Валюта, Остатки.ВалютнаяСуммаОстаток, Остатки.СуммаОстаток ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(, Счет.Валютный = ИСТИНА, , ) КАК Остатки
В результате выполнения этого запроса будет получена, например, следующая таблица (табл. 12.29). Таблица 12.29. Результат выполнения запроса Счет
Валюта
ВалютнаяСуммаОстаток
СуммаОстаток
Касса Касса Касса Новый счет
Рубль Доллар Евро Доллар
100 100 100 10
470 2850 3500 285
657
Глава 12. Бухгалтерский учет
Таблица оборотов Для получения оборотов по счету, по счету в разрезе субконто и измерений и оборотов счета с корреспондирующими счетами (как дебетуемыми, так и кредитуемыми) используется таблица оборотов. Таблица присутствует как у регистра с поддержкой, так и без поддержки корреспонденции, хотя и с небольшими отличиями. Таблица оборотов может быть использована при решении задач получения оборотных показателей таких отчетов, как анализ счета/субконто/по датам и др., журнальный ордер, ведомость по счету. Использование таблицы оборотов в качестве источника запроса представлено в листинге 12.27. Листинг 12.27. Обращение к таблице «Обороты»
ИЗ
РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты
После имени таблицы в круглых скобках могут (и в большинстве случаев будут) указываться параметры, задающие условия отбора данных из физических таблиц информационной базы. Рассмотрим поля виртуальной таблицы оборотов. ■■ Счет – это поле имеет тип ПланСчетовСсылка.. Поле позволяет получить обороты выбранного счета; ■■ КорСчет – это поле имеет тип ПланСчетовСсылка.. Поле позволяет получить обороты выбранного счета, указанного в параметре Счет с выбранным корреспондирующим счетом; ■■ Субконто – это поле имеет тип Характеристика.. Количество полей Субконто зависит от максимального количества субконто на счете плана счетов. Поле позволяет получить обороты, сгруппированные по значениям субконто; ■■ КорСубконто – это поле имеет тип Характеристика.. Количество полей КорСубконто зависит от максимального количества субконто на счете плана счетов. Поле позволяет получить обороты, сгруппированные по значениям субконто корреспондирующего счета; ■■ – тип поля задается при создании измерения регистра. Количество полей зависит от количества измерений, объявленных в регистре бухгалтерии. Поле существует как для балансовых, так и для небалансовых измерений; ■■ Кор – тип поля задается при создании измерения регистра. Количество полей зависит от количества измерений, объявленных в регистре бухгалтерии. Поле создается только для небалансовых измерений; ■■ Период – тип Дата, Регистратор – тип ДокументСсылка., НомерСтроки – тип Число. Поля создаются в том случае, если в параметрах виртуальной таблицы задана периодичность и она отличается от значения Период;
658
■■ Оборот – это поле имеет тип Число. Разница оборотов выбранного счета (дебетовый оборот минус кредитовый оборот); ■■ ОборотДт – это поле имеет тип Число. Дебетовый оборот счета; ■■ ОборотКт – это поле имеет тип Число. Кредитовый оборот счета; ■■ КорОборот – это поле имеет тип Число. Содержит разницу оборотов (кор. оборот дебета минус кор. оборот кредита) для небалансового ресурса корреспондирующего счета; ■■ КорОборотДт – это поле имеет тип Число. Дебетовый оборот для небалансового ресурса корреспондирующего счета; ■■ КорОборотКт – это поле имеет тип Число. Кредитовый оборот для небалансового ресурса корреспондирующего счета. Параметры виртуальной таблицы оборотов позволяют задать условие отбора данных из информационной базы. Параметры следует задавать строго в порядке их описания. ■■ НачалоПериода, КонецПериода – имеет тип Дата, МоментВремени или Граница. Период времени, за который будут получены обороты; ■■ Периодичность – содержит конструкцию языка запросов. Позволяет задать дополнительную группировку данных по стандартным периодам. Возможные значения: Период, Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Час, Минута, Секунда, Регистратор, Запись. Если периодичность не задана или задана как Период, дополнительная группировка не выполняется; ■■ УсловиеСчета – содержит конструкцию языка запросов. Позволяет установить фильтр по счету или счетам. Как правило, содержит следующие условия: Счет = (В ИЕРАРХИИ, В) &Счет; ■■ Субконто – имеет тип ПланВидовХарактеристикСсылка. или содержит массив значений типа ПланВидовХарактеристикСсылка.. В этот параметр таблицы можно передать ссылку на вид субконто для получения отбора по этому виду или массив видов для установки отбора и упорядочивания видов субконто в результате запроса; ■■ Условие – содержит конструкцию языка запросов. Позволяет устанавливать отбор данных виртуальной таблицей по значениям субконто и измерений регистра бухгалтерии; ■■ УсловиеКорСчета – содержит конструкцию языка запросов. Позволяет установить фильтр по корреспондирующему счету или счетам. Как правило, содержит следующие условия: КорСчет = (В ИЕРАРХИИ, В) &КорСчет; ■■ КорСубконто – имеет тип ПланВидовХарактеристикСсылка. или содержит массив значений типа ПланВидовХарактеристикСсылка.. В этот параметр таблицы можно передать ссылку на вид Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии субконто для получения отбора по этому виду или массив видов для установки отбора и упорядочивания видов субконто в результате запроса. Рассмотрим примеры построения запросов к таблице оборотов регистра бухгалтерии. Все запросы обращаются к итогам за весь период, который есть в регистре (не указываются параметры НачалоПериода и КонецПериода). Во всех запросах в качестве параметра передается условие по счету, где СчетТоваров –ссылка на счет Товары плана счетов. Запрос, который покажет, сколько было куплено и списано товаров разных видов в количественном выражении, представлен в листинге 12.28. Листинг 12.28. Пример использования таблицы «Обороты»
ВЫБРАТЬ Обороты.Субконто1, Обороты.КоличествоОборотДт, Обороты.КоличествоОборотКт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты(, , , Счет = &СчетТоваров, , , , ) КАК Обороты
Результат такого запроса представлен в табл. 12.30. Таблица 12.30. Результат запроса Субконто1
КоличествоОборотДт
Комплект Паркер Школьная Цветной
1 15 10 3
КоличествоОборотКт
10
Таблица 12.31. Результат запроса Субконто1
КорСчет
КорСубконто1
КоличествоОборотДт
Комплект Паркер Паркер Школьная Школьная Цветной
Товары Поставщики Поставщики Сотрудники Поставщики Поставщики
Паркер СтройТоргВсе Дисконт центр Иванов Дисконт центр МонтажДоставка
1 10 5 5 5 3
Таблица демонстрирует, какой именно товар (Субконто1), с какого корреспондирующего счета (КорСчет), от какого контрагента (первое субконто корреспондирующего счета) и в каком количестве был получен. Как мы видим, большинство товаров было получено со счета Поставщики, от разных контрагентов. Однако есть и такие, которые были получены со счета Сотрудники и счета Товары. Именно эта корреспонденция может нас заинтересовать. Количество является небалансовым ресурсом регистра бухгалтерии.
Регистр, который мы рассматриваем, поддерживает корреспонденцию, поэтому для каждого небалансового ресурса создаются два поля в таблице записей регистра бухгалтерии. Таким образом, допускается ситуация, когда корреспондируют два счета, поддерживающих вид учета, ведущийся в небалансовом ресурсе (в нашем случае Количество), и эти счета будут иметь различные обороты. То есть дебетовый оборот счета дебета проводки не будет равен кредитовому обороту счета кредита проводки. Как пример можно привести комплектацию (рис. 12.56).
Таблица показывает, какие из товаров в каком количестве были оприходованы (КоличествоОборотДт) и списаны (КоличествоОборотКт). Если требуется узнать, с какого корреспондирующего счета (субконто корреспондирующего счета) были получены те или иные товары, необходимо воспользоваться полями таблицы оборотов КорСчет и КорСубконто (листинг 12.29). Листинг 12.29. Пример использования таблицы «Обороты»
ВЫБРАТЬ Обороты.Субконто1, Обороты.КорСчет, Обороты.КорСубконто1, Обороты.КоличествоОборотДт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты(, , , Счет = &СчетТоваров, , , , ) КАК Обороты
Результат запроса представлен в табл. 12.31. Том 1
Рис. 12.56. Комплектация
В приведенном примере дебетуется счет Товары с аналитикой Комплект и кредитуется счет Товары с другой аналитикой (Паркер). При этом ресурс Сумма балансирует (балансовый ресурс регистра бухгалтерии), а количество дебета и кредита отличается: было списано десять «Паркеров», и оприходован один «Комплект». Воспользовавшись полем ОборотДт виртуальной таблицы оборотов, мы сможем проанализировать, сколько Комплектов было оприходовано
659
Глава 12. Бухгалтерский учет на счет Товары в количественном (КоличествоОборотДт) и суммовом выражении (СуммаОборотДт). Для балансового ресурса этой информации более чем достаточно. Ресурс небалансовый, как мы убедились, может быть заполнен для основного и для корреспондирующего счета проводки и заполнен независимо. Если потребуется проанализировать, из какого количества авторучек Паркер какое количество Комплектов было собрано, нам пригодится поле с постфиксом КорОборот. Напишем запрос, в котором для виртуальной таблицы оборотов установим фильтр по полям Счет и КорСчет и получим таким образом в качестве итогов обороты по всем проводкам, где корреспондировали между собой счет Товары и счет Товары (листинг 12.30). Листинг 12.30. Пример использования таблицы «Обороты»
ВЫБРАТЬ Обороты.Субконто1, Обороты.КоличествоОборотДт, Обороты.КорСубконто1, Обороты.КоличествоКорОборотДт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты(, , , Счет = &СчетТоваров, , , КорСчет = &СчетТоваров, ) КАК Обороты
Результат запроса приведен в табл. 12.32. Таблица 12.32. Результат запроса Субконто1
КоличествоОборотДт
КорСубконто1 КоличествоКорОборотДт
Комплект
1
Паркер
10
Аналогичное назначение имеет поле виртуальной таблицы оборотов Кор, которое позволит сгруппировать или отобрать данные, например, по валюте корреспондирующего счета. Таблица оборотов регистра без поддержки корреспонденции отличается отсутствием в ней полей, содержащих слово Кор.
Таблица остатков и оборотов Основное предназначение таблицы остатков и оборотов – формирование оборотно-сальдовых ведомостей, отчетов, где для каждой строки необходимо показать остаток на начало периода, обороты за период и остаток на конец периода. Нужно сразу заметить, что функционально таблица остатков и оборотов не является соединением таблицы остатков с таблицей оборотов (табл. 12.33).
660
Таблица 12.33. Сравнение функциональности таблиц регистра бухгалтерии Функциональность
Соединение таблицы остатков и таблицы оборотов
Таблица остатков и оборотов
Получить остатки Обороты по счету (субконто, измерению счета) Обороты счета с корреспондирующими (счетами, субконто, измерениями)
Да Да Да
Да Да Нет
Как видно из таблицы, таблица остатков и оборотов позволяет получить обороты по счету аналогично таблице оборотов, однако не предоставляет возможности анализировать обороты с корреспондирующими счетами, субконто, измерениями. По этой причине, например, не представляется возможным использовать ее для получения отчета Анализ счета. Использование таблицы в качестве источника запроса потребует следующего обращения (листинг 12.31). Листинг 12.31. Обращение к таблице остатков и оборотов
ИЗ
РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОстаткиИОбороты
Рассмотрим поля виртуальной таблицы остатков и оборотов: ■■ Счет – это поле имеет тип ПланыСчетовСсылка.. Поле содержит счет, для которого получены остатки и обороты; ■■ Субконто – это поле имеет тип Характеристика., тип этого поля определяется типом субконто. Количество таких полей зависит от максимального количества субконто на счете плана счетов. Поле позволяет получить остатки и обороты, сгруппированные по значениям субконто; ■■ – тип этого поля определяется типом измерения регистра накопления. Количество таких полей зависит от количества измерений, объявленных в регистре бухгалтерии. Поле существует как для балансовых, так и для небалансовых измерений; ■■ Период, Регистратор, НомерСтроки – эти поля имеют тип соответственно Дата, ДокументСсылка. и Число. Поля создаются в том случае, если в параметрах виртуальной таблицы задана периодичность и она отличается от Период; ■■ Оборот, ОборотДт, ОборотКт – эти поля имеют тип Число. Поля аналогичны полям таблицы оборотов. Подробнее можно прочитать в разделе «Таблица оборотов» на стр. 658; ■■ НачальныйОстаток, НачальныйОстатокДт, Ресурс>НачальныйОстатокКт, НачальныйРазвернутыйОстаток Дт, НачальныйРазвернутыйОстатокКт – эти поля имеют тип Число. Поля аналогичны полям таблицы остатков (подробнее можно Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии прочитать в разделе «Таблица остатков» на стр. 656), рассчитываются на дату начала интервала, указанного в параметре таблицы остатков и оборотов НачалоПериода; ■■ КонечныйОстаток, КонечныйОстатокДт, КонечныйОстатокКт, КонечныйРазвернутыйОстатокДт, КонечныйРазвернутыйОстатокКт – эти поля имеют тип Число. Поля аналогичны полям таблицы остатков (подробнее можно прочитать в разделе «Таблица остатков» на стр. 656), рассчитываются на дату окончания интервала, указанного в параметре таблицы остатков и оборотов КонецПериода. Параметры виртуальной таблицы остатков и оборотов позволяют задать условие отбора данных из информационной базы. Параметры следует задавать строго в порядке их описания: ■■ НачалоПериода, КонецПериода – эти параметры имеют тип соответственно Дата, МоментВремени и Граница. Период времени, за который будут получены обороты; ■■ Периодичность – этот параметр содержит конструкцию языка запросов. Позволяет задать дополнительную группировку данных по стандартным периодам. Возможные значения: Период, Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Час, Минута, Секунда, Регистратор или Запись. Если периодичность не задана или задана как Период, то дополнительная группировка не выполняется; ■■ МетодДополнения – этот параметр содержит конструкцию языка запросов. Возможны два значения: Движения или ДвиженияИГраницыПериода. Управляет включением в отчет периодов, не имеющих оборотов, но имеющих остатки; ■■ УсловиеСчета – этот параметр содержит конструкцию языка запросов. Позволяет установить фильтр по счету или счетам. Как правило, содержит следующие условия: Счет = (В ИЕРАРХИИ, В) &Счет; ■■ Субконто – этот параметр имеет тип ПланВидовХарактеристикСсылка. или может содержать массив значений типа ПланВидовХарактеристикСсылка.. В этот параметр таблицы можно передать ссылку на вид субконто для получения отбора по этому виду или массив видов для установки отбора и упорядочивания видов субконто в результате запроса; ■■ Условие – этот параметр содержит конструкцию языка запросов. Позволяет устанавливать отбор данных виртуальной таблицей по значениям субконто и измерений регистра бухгалтерии. Примером использования таблицы может быть отчет «Оборотно-сальдовая ведомость», текст которого приведен в листинге 12.32.
Листинг 12.32. Пример отчета «Оборотно-сальдовая ведомость»
ВЫБРАТЬ ОстаткиИОбороты.Счет КАК Счет, ПРЕДСТАВЛЕНИЕ(ОстаткиИОбороты.Счет), ОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НачОстДт, ОстаткиИОбороты.СуммаНачальныйОстатокКт КАК НачОстКт, ОстаткиИОбороты.СуммаОборотДт КАК ОборотДт, ОстаткиИОбороты.СуммаОборотКт КАК ОборотКт, ОстаткиИОбороты.СуммаКонечныйОстатокДт КАК КонОстДт, ОстаткиИОбороты.СуммаКонечныйОстатокКт КАК КонОстКт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОстаткиИОбороты(&НачПериода, &КонПериода, , , , , ) КАК ОстаткиИОбороты УПОРЯДОЧИТЬ ПО ОстаткиИОбороты.Счет.Код ИТОГИ СУММА(НачОстДт), СУММА(НачОстКт), СУММА(ОборотДт), СУММА(ОборотКт), СУММА(КонОстДт), СУММА(КонОстКт) ПО Счет ИЕРАРХИЯ
В результате выполнения этого запроса будут получены данные, представленные в табл. 12.34. Таблица 12.34. Результат выполнения запроса Счет
НачОстДт
НачОстКт
ОборотДт
ОборотКт
КонОстДт
КонОстКт
Активы Активы Касса Покупатели Товары Материалы
8804 100 6961 95 350 1000
7511 6903 490 100
1293 100 58 -395 250 1000
13
18
Контрагенты
5
Обязательства Обязательства Сотрудники Поставщики
2 2
1352 100 50 1202
1350 100 48 1202
Капитал
6810
6753
-57
Подробнее
Пример такого отчета приведен в демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компактдиске, – Оборотно-сальдовая ведомость.
Том 1
661
Глава 12. Бухгалтерский учет Другой пример использования таблицы остатков и оборотов – получение детальных аналитических отчетов схожей структуры, т. е. содержащих колонки Остаток на начало периода, Обороты за период, Остаток на конец периода (листинг 12.33). Листинг 12.33. Пример отчета «Оборотно-сальдовая ведомость по счету товаров»
ВЫБРАТЬ ОстаткиИОбороты.Субконто1 КАК Товар, ОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачОст, ОстаткиИОбороты.КоличествоОборотДт КАК Приход, ОстаткиИОбороты.КоличествоОборотКт КАК Расход, ОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонОст ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОстаткиИОбороты(&НачПериода, &КонПериода, , , Счет = &СчетТоваров, , ) КАК ОстаткиИОбороты
В данном случае запрос выполняется к таблице остатков и оборотов с фильтром за интервал дат и только по одному счету – счету учета товаров, на котором в качестве первого субконто используется Номенклатура товаров. Результатом запроса будет таблица, демонстрирующая количественные остатки и обороты каждой позиции номенклатуры (табл. 12.35). Таблица 12.35. Результат выполнения запроса Товар
НачОст
Комплект Паркер Школьная Цветной
Приход
1 15 10 3
Расход
10
КонОст
1 5 10 3
ВНИМАНИЕ!
Не нужно считать таблицу остатков и оборотов панацеей и использовать для построения всех отчетов. Таблица универсальна и содержит поля, необходимые во многих отчетах. Однако платой за универсальность всегда является производительность. Использование таблицы имеет смысл только в случаях, когда в одной группировке отчета требуется получение и остатков на начало, и оборотов, и остатков на конец периода. Если требуются только остатки, или только обороты, или все три составляющие, но в разных группировках строках отчета, стоит задуматься о возможности написания нескольких запросов к таблице остатков и таблице оборотов.
Таблица движений с субконто Для получения отборов проводок используется таблица движений с субконто. Таблица включает в себя все поля основной таблицы и таблицы значений субконто и получается их соединением. Поэтому таблица отличается для регистра с поддержкой и без поддержки корреспонденции.
662
Таблицу можно использовать для решения задач формирования отчетов Карточка счета/субконто, Отчет по проводкам. Таблица является виртуальной, но получается соединением двух реальных таблиц (основная таблица и таблица значений субконто), поэтому одна из отличительных особенностей этой таблицы состоит в том, что в нее попадают неактивные записи. Другая отличительная особенность таблицы – несовпадение полей таблицы, которые можно использовать для группировки данных, и полей, на которые можно ставить условие в параметре виртуальной таблицы. Таблица движений с субконто регистра с поддержкой корреспонденций содержит следующие поля (табл. 12.36). Таблица 12.36. Поля виртуальной таблицы движений с субконто Поле
Тип
Комментарий
Дата движения Документ движения МоментВремени МоментВремени Момент времени документа Число НомерСтроки Номер движения в наборе записей Булево Активность Участвует ли запись в таблицах итогов ПланСчетовСсылка. СчетДт Дебетуемый счет ПланСчетовСсылка. СчетКт Кредитуемый счет Определяется типом измерения регистра Балансовое измерение бухгалтерии регистра бухгалтерии Дт Небалансовое измерение регистра Кт бухгалтерии создает два поля в регистре Число Балансовый ресурс регистра бухгалтерии Дт Небалансовый ресурс регистра бухгалтерии Кт создает два поля в регистре Определяется типом реквизита регистра Характеристика бухгалтерии движения регистра ВидСубконтоДт ПланВидовХарактеристикСсылка. Количество полей зависит от настройки ВидСубконтоКт плана счетов СубконтоДт Определяется типом субконто Количество полей зависит от настройки СубконтоКт плана счетов Период
Дата
Регистратор
ДокументСсылка.
Виртуальная таблица движений с субконто имеет следующие параметры: ■■ НачалоПериода, КонецПериода – эти параметры имеют тип Дата, МоментВремени или Граница. Период времени, за который будут отобраны проводки; Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии ■■ Условие – этот параметр содержит конструкцию языка запросов. Конструкция позволяет установить условие на любое поле виртуальной таблицы; ■■ Порядок – этот параметр содержит конструкцию языка запросов. Конструкция позволяет задать упорядочивание проводок; ■■ Первые – этот параметр имеет тип Число. С его помощью задается ограничение максимального количества записей. Ниже приводятся два рисунка, демонстрирующие поля виртуальной таблицы «Движения с субконто» демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компактдиске. Рис. 12.57 показывает поля таблицы, доступные для группировки. Рис. 12.58 – поля таблицы, доступные для установки на них условия в параметре Условие.
Рис. 12.58. Поля, доступные для использования в параметре «Условие»
Таблица оборотов Дт Кт Рис. 12.57. Поля, доступные для группировки
Видно, что перечень полей, на которые можно устанавливать условия, существенно шире. Если для включения в отчет нам доступны только физически существующие поля, полученные виртуальной таблицей из реальных таблиц первичных движений, то для выполнения отборов доступны также и виртуальные поля, такие как Счет (без указания стороны проводки), Субконто, ВидСубконто, КорСчет, Кор. Пример запроса, использующий таблицу движений с субконто, приводится в разделе «Свойства счета-родителя и подчиненных ему счетов» на стр. 621.
Том 1
Таблица оборотов Дт Кт предназначена для получения оборотов между корреспондирующими счетами. Таблица присутствует только у регистра с поддержкой корреспонденции и позволяет узнать оборот в дебет счета с кредита счета (субконто, измерения). Если рассматривать таблицу с точки зрения ее возможного использования при разработке отчетов, то, вероятнее всего, это будут отчеты «Шахматный баланс (шахматка)» и «Сводные проводки». Основное отличие таблицы оборотов Дт Кт от таблицы оборотов состоит в том, что таблица оборотов Дт Кт позволяет анализировать обороты между счетами, где заранее известно, какой счет дебетуется, а какой кредитуется. В то время как таблица оборотов, кроме того что позволяет анализировать обороты по счету (без указания второго), позволяет анализировать обороты между счетом и корсчетом. При этом одним обращением к таблице можно получить как дебетовые, так и кредитовые корреспонденции. Рассмотрим поля этой виртуальной таблицы (табл. 12.37).
663
Глава 12. Бухгалтерский учет Таблица 12.37. Поля виртуальной таблицы оборотов Дт Кт Поле
Тип
Комментарий
Период Регистратор НомерСтроки
Дата ДокументСсылка. Число
СчетДт
ПланыСчетовСсылка.
Поля существуют в таблице, только если значение параметра Периодичность задано и отличается от Период Дебетуемый счет Кредитуемый счет Балансовое измерение регистра бухгалтерии Небалансовое измерение регистра бухгалтерии создает два поля в таблице Количество полей зависит от настройки плана счетов
СчетКт
Определяется типом измерения регистра бухгалтерии
Дт Кт СубконтоДт
Определяется типом субконто
СубконтоКт Оборот
Число
ОборотДт
Число
ОборотКт
Оборот балансового ресурса регистра бухгалтерии Обороты небалансового ресурса регистра бухгалтерии
Виртуальная таблица оборотов Дт Кт использует следующие параметры: ■■ НачалоПериода, КонецПериода – эти параметры имеют тип Дата, Момент времени или Граница. Период времени, за который будут отобраны обороты; ■■ Периодичность – этот параметр содержит конструкцию языка запросов. Позволяет задать дополнительную группировку данных по стандартным периодам. Возможные значения: Период, Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Час, Минута, Секунда, Регистратор, Запись. Если периодичность не задана или задана как Период, то дополнительная группировка не выполняется; ■■ УсловиеСчетаДт – этот параметр содержит конструкцию языка запросов. Отбор по дебетуемому счету, как правило, содержит следующие условия: СчетДт = (В ИЕРАРХИИ, В) &СчетДт; ■■ СубконтоДт – этот параметр имеет тип ПланВидовХарактеристикСсылка. или содержит массив значений типа ПланВидовХарактеристикСсылка.. В этот параметр таблицы можно передать ссылку на вид субконто для получения отбора по этому виду для дебетовых оборотов или массив видов для установки отбора и упорядочивания видов субконто в результате запроса; ■■ УсловиеСчетаКт – этот параметр содержит конструкцию языка запросов. Отбор по дебетуемому счету, как правило, содержит следующие условия: СчетКт = (В ИЕРАРХИИ, В) &СчетКт; ■■ СубконтоКт – этот параметр имеет тип ПланВидовХарактеристикСсылка. или содержит массив значений типа ПланВидовХарактеристикСсылка.. В этот параметр таблицы можно передать ссылку
664
на вид субконто для получения отбора по этому виду для кредитовых оборотов или массив видов для установки отбора и упорядочивания видов субконто в результате запроса; ■■ Условие – этот параметр содержит конструкцию языка запросов. Конструкция позволяет установить условие на субконто и измерения. Примером отчета, который может быть построен с использованием таблицы оборотов Дт Кт, может послужить отчет «Сводные проводки», показывающий сводные обороты между дебетуемыми и кредитуемыми счетами. Простейший запрос, который позволяет получить этот отчет, приводится в листинге 12.34. Листинг 12.34. Пример отчета «Сводные проводки»
ВЫБРАТЬ ОборотыДтКт.СчетДт, ОборотыДтКт.СчетКт, ОборотыДтКт.СуммаОборот ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОборотыДтКт КАК ОборотыДтКт
При выполнении этого запроса будет получен следующий результат (табл. 12.38). Таблица 12.38. Результат выполнения запроса СчетДт
СчетКт
СуммаОборот
Товары Касса Товары Новый счет Материалы Сотрудники Контрагенты Покупатели Активы Товары Касса Покупатели Касса Капитал
Товары Покупатели Поставщики Капитал Поставщики Поставщики Касса Касса Обязательства Сотрудники Капитал Капитал Контрагенты Касса
100 490 200 285 1000 2 13 80 100 50 6453 15 18 6810
Разницу между таблицей оборотов и таблицей оборотов Дт Кт может показать следующий пример. Решим задачу: необходимо получить оборот между счетами, свидетельствующий об объеме выручки, полученной в кассу от покупателей. Другими словами, нам необходимо получить обороты за период в дебет счета Касса с кредита счета Покупатели в разрезе контрагентов (субконто Контрагенты привязано к счету Покупатели плана Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии счетов). Во всех приведенных ниже запросах используются следующие параметры (табл. 12.39). Таблица 12.39. Параметры запросов Параметр запроса
Тип
Значение
НачПериода
Дата
КонПериода
Дата
СчетКассы
ПланыСчетовСсылка.
СчетПокупателей
ПланыСчетовСсылка.
Начало интервала отбора итогов Конец интервала отбора итогов Счет Касса Счет Покупатели
Решим эту задачу, используя таблицу оборотов Дт Кт (листинг 12.35). Листинг 12.35. Пример запроса, использующего таблицу оборотов Дт Кт
ВЫБРАТЬ ОборотыДтКт.СубконтоКт1 КАК Покупатель, ОборотыДтКт.СуммаОборот КАК Выручка ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОборотыДтКт(&НачПериода, &КонПериода, , СчетДт = &СчетКассы, , СчетКт = &СчетПокупателей, , ) КАК ОборотыДтКт ИТОГИ СУММА(Выручка) ПО ОБЩИЕ
В результате выполнения этого запроса будут получены следующие данные (табл. 12.40). Таблица 12.40. Результат выполнения запроса Покупатель
Выручка
СтройТоргВсе МонтажДоставка Дисконт центр Итог
200 150 100 450
Эта же таблица отчета может быть получена с помощью таблицы оборотов следующим способом (листинг 12.36). Листинг 12.36. Пример запроса, использующего таблицу оборотов
ВЫБРАТЬ Обороты.КорСубконто1 КАК Покупатель, Обороты.СуммаОборотДт КАК Выручка ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты(&НачПериода, &КонПериода, , Счет = &СчетКассы, , ,КорСчет = &СчетПокупателей, ) КАК Обороты ИТОГИ СУММА(Выручка) ПО ОБЩИЕ
Том 1
В приведенном примере выполняется запрос с отбором по счетам Касса (основной счет) и Покупатели (корреспондирующий счет). Нужно сразу отметить, что можно сделать и наоборот: основным счетом запроса сделать счет Покупатели, а корреспондирующим – счет Касса. При этом данные группируются по первому субконто корреспондирующего счета. Отчетом анализируется дебетовый оборот (дебетовый относительно основного счета запроса, т. е. относительно счета Касса, оборот в дебет счета Касса). Теперь усложним задачу. Необходимо узнать не только, сколько было получено денег от покупателей в кассу за выбранный период, но и сумму возвращенных покупателям средств и разницу между выручкой и возвратами. Для получения прямой и обратной корреспонденции в одном запросе с использованием в качестве источника данных таблицы остатков и оборотов придется обратиться к источнику дважды: для получения оборота в дебет счета Касса с кредита Покупатели и в дебет Покупатели с кредита счета Касса. С помощью таблицы оборотов эта же задача может быть решена с однократным обращением к таблице (листинг 12.37). Листинг 12.37. Пример запроса, использующего таблицу оборотов
ВЫБРАТЬ Обороты.КорСубконто1 КАК Покупатель, Обороты.СуммаОборотДт КАК Выручка, Обороты.СуммаОборотКт КАК Возвраты, Обороты.СуммаОборотДт - Обороты.СуммаОборотКт КАК Результат ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты(&НачПериода, &КонПериода, , Счет = &СчетКассы, , , КорСчет = &СчетПокупателей, ) КАК Обороты ИТОГИ СУММА(Выручка), СУММА(Возвраты), СУММА(Результат) ПО ОБЩИЕ
Результат выполнения запроса приведен в табл. 12.41. Таблица 12.41. Результат выполнения запроса Покупатель
Выручка
Возвраты
Результат
СтройТоргВсе МонтажДоставка Дисконт центр Итог
200 150 100 450
80 80
200 150 20 370
665
Глава 12. Бухгалтерский учет
Общие приемы работы с виртуальными таблицами
Параметр
Все рассмотренные виртуальные таблицы имеют ряд общих параметров, полей и просто подходов, которые не имеет смысла описывать для каждой таблицы.
ВидСубконтоДт/Кт
Таблица Таблица Таблица Таблица Таблица оборотов оборотов остатков остатков движений Дт Кт и оборотов с субконто
Для начала сгруппируем параметры, которые используются в виртуальных таблицах (табл. 12.42).
Дт/Кт
Таблица 12.42. Параметры виртуальных таблиц регистра бухгалтерии
РазвернутыйОстатокДт/Кт
Параметр
Да Да Да
Да Да Да
Остаток ОстатокДт/Кт Оборот
Да Да Да Да
Да Да
Да** Да** Да** Да Да
Таблица оборотов
Таблица оборотов Дт Кт
Таблица Таблица остатков остатков и оборотов
Таблица движений с субконто
Период, НачалоПериода, КонецПериода
Да
Да
Да
Да
Да
Условие
Да Да
Да Да
Да Да
Да Да
Да
Субконто, КорСубконто, СубконтоДт, СубконтоКт
Да
Да
Да
Да
* Поля присутствуют в таблице при установленном значении параметра Периодичность; поле НомерСтроки доступно, если периодичность равна Запись; поле Регистратор доступно, если периодичность равна Запись или Регистратор. ** В таблице присутствуют поля для получения остатков на начало и конец периода, заданного в параметрах таблицы.
Периодичность
Да
Да
Да Да
Теперь перейдем к рассмотрению отдельных полей и параметров таблиц.
УсловиеСчета, УсловиеКорСчета, УсловиеСчетаДт, УсловиеСчетаКт
МетодДополнения
Поля, используемые в виртуальных таблицах регистра бухгалтерии, представлены в табл. 12.43. Таблица 12.43. Поля виртуальных таблиц регистра бухгалтерии Параметр
Таблица Таблица Таблица Таблица Таблица оборотов оборотов остатков остатков движений Дт Кт и оборотов с субконто
Счет
Да Да
КорСчет Счет Дт/Кт Кор
Да Да
КорСубконто
Да Да
СубконтоДт/Кт Период Регистратор НомерСтроки МоментВремени Активность
666
Да
Да
Да
Да
Да
Да
Дт/Кт Субконто
Да Да
Да
Да* Да* Да*
Да Да* Да* Да*
КорОборот КорОборотДт/Кт
Параметр «Субконто»: отбор и упорядочивание по виду субконто В этом разделе пойдет речь о параметрах виртуальных таблиц (остатков, оборотов, оборотов Дт Кт, остатков и оборотов) типа ПланыВидовХарактеристикСсылка.. В разных таблицах параметр называется по-разному (табл. 12.44). Таблица 12.44. Параметры различных таблиц
Да Да Да
Да* Да* Да*
ОборотДт/Кт
Да Да Да Да Да Да Да
Таблица
Имя параметра
Оборотов Оборотов Дт Кт Остатков Остатков и оборотов
Субконто, КорСубконто СубконтоДт, СубконтоКт Субконто Субконто
Все перечисленные параметры могут принимать значения ПланыВидовХарактеристикСсылка. или содержать массив, состоящий из значений указанного типа данных. Назначение этих параметров для всех таблиц схоже. Рассмотрим возможные варианты использования этих параметров на примере таблицы остатков. Начнем с того, что это не субконто в том смысле слова, который мы обычно вкладываем в него. В этом параметре можно передать Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии не значение субконто, а значение вида субконто или массив видов субконто. Следует заметить, что для отбора по значению субконто используется другой параметр виртуальных таблиц. Для всех таблиц он называется Условие. В нем же можно устанавливать отбор по измерению регистра. Какое же назначение у параметра Субконто? Их как минимум два: ■■ отбор итогов по виду субконто; ■■ упорядочивание субконто в результате запроса (в особенности, если запрос выполняется по нескольким счетам). Рассмотрим подробнее каждый из перечисленных вариантов. Задача отбора по виду субконто может быть сформулирована следующим образом: необходимо получить отчет по остаткам товарно-материальных запасов. При этом в одной строке отчета нужно показать сумму стоимостных остатков одного вида номенклатуры со всех счетов учета материальных ценностей. Такая постановка вопроса, разумеется, возможна только при условии, что на всех счетах учета материальных ценностей в качестве аналитики используется один и тот же вид субконто. Применительно к демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске, можно уточнить задачу. В конфигурации два счета учета материальных ценностей: Товары и Материалы. Предположим, что на обоих счетах первым субконто привязан вид субконто Номенклатура типа СправочникСсылка.Номенклатура. Для получения отчета, приведенного ниже, потребуется написать следующий код (листинг 12.38). Листинг 12.38. Пример получения остатков регистра бухгалтерии
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Субконто1 КАК Товар, | Остатки.СуммаОстаток КАК Остаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Дата, , &ВидСубконто,) КАК Остатки |ИТОГИ | СУММА(Остаток) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("ВидСубконто", ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("Дата", Дата);
В параметр ВидСубконто запроса передается ссылка на вид характеристик Номенклатура. Результатом подобного запроса может быть таблица, представленная в табл. 12.45.
Таблица 12.45. Результат выполнения запроса Товар
Итог Комплект Паркер Школьная Цветной
Остаток
1250 100 1050 75 25
В колонке Остаток будет отображаться сумма остатков со счетов Товары и Материалы, т. к. только на этих счетах нашей конфигурации используется субконто Номенклатура. При желании в запрос можно добавить и отбор по списку счетов. При необходимости разделить отчет по счетам (Товары и Материалы) запрос может быть видоизменен (листинг 12.39). Листинг 12.39. Пример получения остатков регистра бухгалтерии
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Субконто1 КАК Товар, | Остатки.Счет, | Остатки.СуммаОстаток КАК Остаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Дата, , &ВидСубконто,) КАК Остатки |ИТОГИ | СУММА(Остаток) |ПО | ОБЩИЕ, | Товар"; Запрос.УстановитьПараметр("ВидСубконто", ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); Запрос.УстановитьПараметр("Дата", Дата);
В запрос было добавлено еще одно группировочное поле Счет, а по субконто был подведен итог. Результатом запроса будет таблица, позволяющая увидеть итоговый остаток по виду номенклатуры не только в целом по всем счетам, но и по каждому в отдельности (табл. 12.46). Таблица 12.46. Результат выполнения запроса Товар
Счет
Итог Комплект Товары Паркер Товары Материалы Школьная Товары Цветной Товары
Том 1
Остаток
1250 100 100 1050 50 1000 75 75 25 25
667
Глава 12. Бухгалтерский учет При необходимости отчету можно придать «шахматный» вид, переведя вторую группировку (счета) в колонки отчета. Если мы еще усложним задачу, то нам может понадобиться второе назначение параметра Субконто – упорядочивание по виду субконто. Аналитика счетов Товары и Материалы настроена следующим образом (табл. 12.47).
материалов на 1000, а, во-вторых, что этот самый Филиал (субконто Склады) является первым субконто счета, который мы и анализируем нашим запросом. Если добавить в виртуальную таблицу регистра источник запроса, параметр Субконто и передать туда ссылку на вид субконто Номенклатура, ситуация будет исправлена (листинг 12.41).
Таблица 12.47. Аналитика счетов «Товары» и «Материалы»
Листинг 12.41. Пример получения остатков регистра бухгалтерии
Код
Счет
Субконто1
Субконто2
1.3 1.4
Товары Номенклатура Склады Материалы Склады Номенклатура
Задача остается той же: получить в одной строке отчета остаток с двух счетов, причем строками отчета должны быть номенклатурные позиции. Если при подобной настройке плана счетов мы выполним запрос без указания параметра Субконто, но с отбором по списку счетов в параметре таблицы УсловиеСчета (листинг 12.40), то результат выполнения этого запроса будет таким, как показано в табл. 12.48. Листинг 12.40. Пример получения остатков регистра бухгалтерии
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Субконто1 КАК Товар, | Остатки.СуммаОстаток КАК Остаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Дата, | Счет В (&СчетТоваров, &СчетМатериалов), ,) | КАК Остатки |ИТОГИ | СУММА(Остаток) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("СчетТоваров", ПланыСчетов.ОсновнойПланСчетов.Товары); Запрос.УстановитьПараметр("СчетМатериалов", ПланыСчетов.ОсновнойПланСчетов.Материалы); Таблица 12.48. Результат выполнения запроса Товар
Остаток
Итог Комплект Паркер Школьная Цветной Филиал
1250 100 50 75 25 1000
Обратите внимание на последнюю строку отчета «Филиал = 1000». Она говорит нам, во-первых, о том, что на складе Филиал есть остаток
668
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Субконто1 КАК Товар, | Остатки.СуммаОстаток КАК Остаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Дата, | Счет В (&СчетТоваров, &СчетМатериалов), | &ВидыСубконто,) КАК Остатки |ИТОГИ | СУММА(Остаток) |ПО | ОБЩИЕ"; Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("СчетТоваров", ПланыСчетов.ОсновнойПланСчетов.Товары); Запрос.УстановитьПараметр("СчетМатериалов", ПланыСчетов.ОсновнойПланСчетов.Материалы); Запрос.УстановитьПараметр("ВидыСубконто", ПланыВидовХарактеристик.ВидыСубконто.Номенклатура);
Продолжим усложнять задачу. Предположим, нужно включить в отчет две группировки по субконто: сначала пользователь хочет увидеть итоги по номенклатуре, а потом детализацию по складам, на каком сколько числится. Решение будет напоминать ранее сделанное решение для группировки по счетам, проблема только в настройке плана счетов: субконто Номенклатура прикреплено первым на счет товаров и вторым на счет материалов. А обращаемся мы к ним в запросе именно по номеру (Субконто1, Субконто2). Чтобы добиться в результате запроса нужного порядка следования субконто на счетах (без изменения настройки плана счетов), необходимо воспользоваться все тем же параметром Субконто (листинг 12.42). Листинг 12.42. Пример получения остатков регистра бухгалтерии
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОсновнойРегистрБухгалтерииОстатки.Субконто1 КАК Товар, | ОсновнойРегистрБухгалтерииОстатки.Субконто2 КАК Склад, | ОсновнойРегистрБухгалтерииОстатки.СуммаОстаток КАК СуммаОстаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Дата, Счет В (&СчетТоваров, | &СчетМатериалов), &ВидыСубконто, ) КАК ОсновнойРегистрБухгалтерииОстатки |ИТОГИ
Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии | |ПО | | |
СУММА(СуммаОстаток) ОБЩИЕ, Товар, Склад";
Запрос.УстановитьПараметр("Дата", Дата); Запрос.УстановитьПараметр("СчетТоваров", ПланыСчетов.ОсновнойПланСчетов.Товары); Запрос.УстановитьПараметр("СчетМатериалов", ПланыСчетов.ОсновнойПланСчетов.Материалы); мВидыСубконто = Новый Массив; мВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Номенклатура); мВидыСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконто.Склады); Запрос.УстановитьПараметр("ВидыСубконто", мВидыСубконто);
Результатом выполнения этого запроса будет следующая таблица (табл. 12.49). Таблица 12.49. Результат выполнения запроса Товар
Склад
Итог Комплект Офис Паркер Офис Филиал Школьная Офис Цветной Офис Филиал
СуммаОстаток
1250 100 100 1050 -50 1100 75 75 25 10 15
Таким образом, нам удалось «расставить субконто по местам»: первым субконто в нашем запросе является Номенклатура, вторым – Склады. Причем если мы хотим изменить последовательность группировок в запросе (сначала группировать по складам, потом внутри склада – по номенклатурным позициям), нам достаточно изменить порядок следования элементов массива, который передается в параметр виртуальной таблицы Субконто.
Параметры «Период», «НачалоПериода» и «КонецПериода» Все виртуальные таблицы регистра позволяют устанавливать отбор итогов или на момент времени, или за период. Для установки такого отбора итогов можно использовать значения типа Дата, МоментВремени или Граница. Использование в запросе параметра типа МоментВремени в большинстве случаев ограничивается обработками проведения документов, когда Том 1
важно получить итоги с точностью «до ссылки». Этот объект, предназначенный для получения и хранения момента времени для объекта в базе данных, можно считать самым точным указанием для отбора итогов. Рассмотрим использование этих объектов в параметре Период виртуальной таблицы остатков. Исходная ситуация будет описана нами в виде журнала проводок. Было сделано несколько проводок разными датами по счету Касса. Мы рассматриваем период за июнь 2010 года. Входящий остаток составил 15 рублей, и было сделано четыре проводки за первое и второе июня по 10 рублей каждая. Исходящий остаток – 55 рублей (табл. 12.50). Таблица 12.50. Проводки Период
Остаток 31.05.2010 01.06.2010 12:00:00 01.06.2010 23:59:59 Остаток 01.06.2010 02.06.2010 0:00:00 02.06.2010 12:00:00 Остаток 02.06.2010
Счет дебета
Счет кредита
Сумма
Касса Касса
Покупатели Покупатели
10,00 10,00
Касса Касса
Покупатели Покупатели
10,00 10,00
Текущий остаток
15,00 25,00 35,00 35,00 45,00 55,00 55,00
Для анализа остатка мы воспользуемся следующим несложным запросом (листинг 12.43). Листинг 12.43. Пример получения остатков регистра бухгалтерии
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.СуммаОстаток |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Момент, Счет = &Счет, | , КАК Остатки"; Запрос.УстановитьПараметр("Момент", Момент); Запрос.УстановитьПараметр("Счет", ПланыСчетов.ОсновнойПланСчетов.Касса); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат 0; КонецЕсли; Остатки = Результат.Выбрать(); Остатки.Следующий(); Возврат Остатки.СуммаОстаток;
Запрос будет получать остаток по счету Касса на тот момент времени, который будет передан ему в качестве параметра. А передавать мы туда будем разные значения. Наша задача – получить остаток на счете Касса, который там сформировался к концу 1 июня (или, другими словами, к началу дня 2 июня).
669
Глава 12. Бухгалтерский учет Вариант первый (листинг 12.44).
Листинг 12.47. Четвертый вариант установки параметра запроса
Момент = Дата(2010, 6, 1);
Дата = Дата(2010, 6, 1); КонДня = КонецДня(Дата); Момент = Новый Граница(КонДня, ВидГраницы.Включая);
Полученный результат представлен в табл. 12.51.
Полученный результат представлен в табл. 12.54.
Листинг 12.44. Первый вариант установки параметра запроса
Таблица 12.51. Полученный результат и комментарий Момент равен
Остаток равен
Комментарий
01.06.10 0:00:00
15,00
Не было учтено время, получили остаток на начало дня
Вариант второй (листинг 12.45). Листинг 12.45. Второй вариант установки параметра запроса
Таблица 12.54. Полученный результат и комментарий Момент равен
Остаток равен
Комментарий
Граница
35,00
Правильно!
Подведем итоги (табл. 12.55). Таблица 12.55. Сводная таблица полученных результатов
Дата = Дата(2010, 6, 1); Момент = КонецДня(Дата);
№
Полученный результат представлен в табл. 12.52.
2 3 4
Метод
Момент
Остаток
Комментарий
01.06.10 0:00:00
15,00
Конец текущего дня
01.06.10 23:59:59
25,00
Начало следующего дня Граница (включая)
02.06.10 0:00:00 Граница
35,00 35,00
Не было учтено время, получили остаток на начало дня Получили остаток на конец дня, но в остатки не попала последняя проводка, сделанная в 23:59:59 Правильно! Правильно!
1
Таблица 12.52. Полученный результат и комментарий Момент равен
Остаток равен
Комментарий
01.06.10 23:59:59
25,00
Получили остаток на конец дня, но в остатки не попала последняя проводка, сделанная в 23:59:59
ВНИМАНИЕ!
В бухгалтерском учете проводка в 23:59:59 не редкость. Для счета Касса такая проводка маловероятна, но все счета, по которым выполняются регламентные операции, попадают в группу риска, ведь, например, закрытие месяца наверняка будет выполнено именно последним документом в этой дате.
Вариант третий (листинг 12.46). Листинг 12.46. Третий вариант установки параметра запроса
Дата = Дата(2010, 6, 1); ОдинДень = 60 * 60 * 24; Момент = НачалоДня(Дата + ОдинДень);
Полученный результат представлен в табл. 12.53. Таблица 12.53. Полученный результат и комментарий Момент равен
Остаток равен
Комментарий
02.01.06 0:00:00
35,00
Правильно!
Итак, правильные результаты были получены в третьем и четвертом вариантах. Для получения правильного остатка на конец периода, включающего все операции, необходимо или получать остатки на начало следующего периода, или использовать объект Граница с параметром ВидГраницы.Включая. Теперь рассмотрим этот же пример для таблицы оборотов (табл. 12.56). Таблица 12.56. Проводки Период
Счет дебета
Счет кредита
Сумма
01.06.2010 12:00:00 01.06.2010 23:59:59 Оборот за 01.06.2010 02.06.2010 0:00:00 02.06.2010 12:00:00 Оборот за 02.06.2010
Касса Касса
Покупатели Покупатели
Касса Касса
Покупатели Покупатели
10,00 10,00 20,00 10,00 10,00 20,00
Ниже приведен (листинг 12.48).
запрос,
который
будет
анализировать
обороты
Вариант четвертый (листинг 12.47).
670
Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии Листинг 12.48. Пример получения оборотов регистра бухгалтерии
Периодичность «оборотных» таблиц
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Обороты.СуммаОборот |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Обороты(&НачПериода, &КонПериода, | , Счет = &Счет, , , , ) КАК Обороты";
Таблица оборотов, таблица оборотов и остатков и таблица оборотов Дт Кт содержат параметр Периодичность. Этот параметр позволяет задать дополнительную группировку данных таблицей – по стандартным периодам. Параметр может принимать одно из значений (табл. 12.57). Таблица 12.57. Значения, которые может принимать параметр «Периодичность»
Запрос.УстановитьПараметр("НачПериода", НачПериода); Запрос.УстановитьПараметр("КонПериода", КонПериода); Запрос.УстановитьПараметр("Счет", ПланыСчетов.ОсновнойПланСчетов.Касса);
Период
Комментарий
Период или пусто
Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат 0; КонецЕсли;
Полугодие
Обороты = Результат.Выбрать(); Обороты.Следующий(); Оборот = Обороты.СуммаОборот;
Неделя
Дополнительная группировка данных не выполняется Все проводки за год Все проводки за полгода Все проводки за квартал Все проводки за календарный месяц Все проводки за декаду Все проводки за неделю Все проводки за день Все проводки за час Все проводки за минуту Все проводки за секунду Все проводки одного документа (регистратора) группируются Движение регистра
Запрос получает обороты по счету Касса за период с НачПериода по КонПериода. С оборотами все проще. Нам достаточно использовать функции НачалоДня() и КонецДня(), чтобы получить все обороты за указанный интервал, включая указанные дни (листинг 12.49). Листинг 12.49. Пример установки начала и конца периода при получении оборотов
Дата = Дата(2010, 6, 1); НачПериода = НачалоДня(Дата); КонПериода = КонецДня(Дата);
Результатом работы функции будет значение 20, соответствующее обороту за первое июня 2010 года. Таблица остатков и оборотов рассчитывает исходящий остаток на основании входящего и оборотов (более подробно о работе виртуальных таблиц с данными информационной базы рассказано в разделе «Построение виртуальных таблиц регистра бухгалтерии» на стр. 684), поэтому особенного внимания к себе не требует. Для получения корректных остатков и оборотов за 1 июня 2010 года достаточно передать в качестве параметров даты начала и конца дня. Параметры виртуальной таблицы не являются обязательными. Если момент или период отбора итогов не будет указан, результат запроса вернет текущие итоги. Более подробно об этом рассказано в разделе «Механизм текущих итогов» на стр. 684. Пока же упомянем лишь, что в таблицах итогов регистра бухгалтерии хранятся не только рассчитанные итоги по месяцам, но и текущие итоги с учетом последнего проведенного документа. Том 1
Год Квартал Месяц Декада День Час Минута Секунда Регистратор Запись
Значение по умолчанию, если параметр не заполнен, – Период. При установке в параметре Периодичность виртуальной таблицы значения, отличного от Период, в таблице появляются новые поля, по которым можно сгруппировать данные. Покажем это на примере таблицы остатков и оборотов и таблицы оборотов Дт Кт регистра бухгалтерии демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске. Колонки таблицы – значения параметра Периодичность. В таблице перечислены поля, добавляемые к тем, которые существуют по умолчанию (когда значение параметра Периодичность равно Период), табл. 12.58. Таблица 12.58. Поля, добавляемые в виртуальную таблицу остатков Дт Кт Период
Секунда и более
Регистратор
Запись
Период
Период Регистратор
Период Регистратор НомерСтроки
Как мы видим, по мере того как мы задаем большую детализацию в параметре таблицы, появляются новые поля таблицы. В случае, если периодичность равна Секунда или больше (Секунда – Год), появляется возможность группировать данные по периодам. Поле Период будет содержать дату начала периода. Например, если выбрана периодичность Год,
671
Глава 12. Бухгалтерский учет то все обороты за 2010 год будут сгруппированы в период 01.01.2010 00:00:00; если выбрана периодичность Месяц, то в таблице появятся первые числа всех месяцев, за которые были обороты.
Если периодичность сделать равной Запись (отчет Сводные проводки с периодичностью – Запись), каждая строка отчета будет отображать свою проводку, ее дату и время (рис. 12.60).
Если периодичность равна Регистратор, то кроме периода появляется возможность получить доступ к документу, сделавшему движения в регистре. Если периодичность равна Запись, мы получаем доступ к еще одному полю таблицы – НомерСтроки, номеру записи в наборе. Ниже приведен текст запроса, с помощью которого система компоновки данных извлекает данные из таблицы оборотов Дт Кт для отчета Сводные проводки с периодичностью – Месяц (листинг 12.50). Листинг 12.50. Пример отчета «Сводные проводки периодичностью Месяц»
ВЫБРАТЬ ОборотыДтКт.СчетДт, ОборотыДтКт.СчетКт, ОборотыДтКт.СуммаОборот, ОборотыДтКт.Период ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОборотыДтКт(, , Месяц, , , , , ) КАК ОборотыДтКт
Перед формированием отчета задается отчетный период (данные берутся на конец дня конца периода) и отбор по корреспондирующим счетам дебета и кредита. При периодичности запроса Месяц поле Период будет содержать дату начала каждого месяца. Как мы видим на рисунке внизу, часть проводок по корреспондирующим счетам Касса и Покупатели сделаны в мае 2010 года на сумму 450, а часть – в июне 2010 года на сумму 40 (рис. 12.59).
Рис. 12.59. Результат отчета при периодичности «Месяц»
672
Рис. 12.60. Результат отчета при периодичности «Запись»
В результате более детального отчета выяснится, например, что 40 рублей первого отчета состояли из четырех проводок по 10 рублей каждая, сделанных первого и второго июня 2010 года. Таким же образом устроена таблица оборотов. А вот таблица остатков и оборотов имеет свою особенность. Как видно из приведенных выше отчетов, в запрос попадают только те периоды, которые содержали обороты, соответствующие отборам, установленным в других параметрах таблицы. В нашем случае были фильтры на счет дебета и счет кредита, но в отчет попали только те периоды, где обороты между выбранными счетами были. Иначе говоря, в первый отчет не попал апрель 2010 года, потому что в нем не было никаких проводок, а во второй отчет не попало 3 июня по той же причине. Таблица остатков и оборотов позволяет в одной группировке запроса получить и остатки (входящие и исходящие), и обороты. Поэтому в таблице присутствует еще один параметр, позволяющий указывать, будут ли включены в результат отчета периоды, которые имели обороты или еще и границы интервала, если на эти даты были остатки. Параметр МетодДополнения может принимать два значения: ДвиженияИГраницыПериода (по умолчанию) и Движения. Рассмотрим отличия на примере запроса, приведенного ниже (листинг 12.51).
Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии Листинг 12.51. Пример получения остатков и оборотов регистра бухгалтерии
ВЫБРАТЬ ОсновнойРегистрБухгалтерииОстаткиИОбороты.Период, ОсновнойРегистрБухгалтерииОстаткиИОбороты.СуммаНачальныйОстаток КАК НачальныйОстаток, ОсновнойРегистрБухгалтерииОстаткиИОбороты.СуммаОборотДт КАК ОборотДт, ОсновнойРегистрБухгалтерииОстаткиИОбороты.СуммаОборотКт КАК ОборотКт, ОсновнойРегистрБухгалтерииОстаткиИОбороты.СуммаКонечныйОстаток КАК КонечныйОстаток ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, Счет В ИЕРАРХИИ (&Счет), , ) КАК ОсновнойРегистрБухгалтерииОстаткиИОбороты
Отчет Остатки и обороты (движения и границы) формируется с помощью системы компоновки данных. Перед формированием отчета задается отчетный период (данные берутся на конец дня конца периода) и отбор по счету (в нашем примере – по счету Товары). Параметр Периодичность в запросе установлен в значение День, а параметр МетодДополнения – в значение ДвиженияИГраницыПериода. Исходные данные: существуют проводки по счету Товары, сделанные до 1 июня 2010 года, 23 и 25 июня 2010 года. Запрос выполняется по счету Товары за интервал с 01.06.2010 по 30.06.2010 года с периодичностью День. Результат выполнения запроса показан на рис. 12.61.
Рис. 12.62. Результат выполнения запроса
ВНИМАНИЕ!
Наличие в таблице остатков и оборотов наиболее часто встречающихся показателей (остатки на начало и конец интервала и обороты) и возможность формирования ее с периодичностью до проводки включительно не должны приводить к ее использованию для решения любых задач. Таблица остатков и оборотов является виртуальной, т. е. одна не хранится в базе данных и формируется системой при обращении к ней. Формирование таблицы может включать в себя выполнение до трех запросов. По каждому периоду (мы рассматриваем сейчас использование таблицы с заполненным параметром Периодичность) будут рассчитаны и обороты, и входящие остатки, и исходящие остатки. Если поставленная задача не требует получения всех этих показателей по каждой группировке (строке) отчета (например, отчет «Карточка счета»), то использование таблицы можно считать неоптимальным. Поэтому стоит обдумать возможность использования для решения другой таблицы (например, таблицы движений с субконто) для получения отбора проводок и таблицы остатков для получения остатков на начало периода.
Развернутые остатки Рис. 12.61. Результат выполнения запроса
Если параметр МетодДополнения принимает значение ДвиженияИГраницыПериода или если он не задан, то в отчет включается дата начала интервала отбора итогов (01.06.2010, так как на эту дату был входящий остаток) и дата конца интервала (30.06.2010, по той же причине), см. рис. 12.61. Если бы параметр МетодДополнения принимал значения Движения, в отчет попали только те даты, за которые были обороты по счету Товары (рис. 12.62). Том 1
Мы знаем, что все счета бухгалтерского учета делятся на активные, пассивные и активно-пассивные (в стандартах учета, принятых в РФ). Активные счета предназначены для группировки операций о движении средств (имущества, активов) предприятия. Остатки по активным счетам всегда дебетовые и показывают, каким имуществом обладает предприятие. Пассивные счета предназначены для группировки операций об изменении источников средств (пассивов) организации. Остатки по пассивным счетам всегда кредитовые и демонстрируют, откуда было получено имущество предприятия. Самые простые примеры активных счетов – счета учета денежных средств (касса, банк) и материальных запасов (товары,
673
Глава 12. Бухгалтерский учет материалы). Пример пассивных счетов – капитал собственника (т. е. задолженность перед хозяином предприятия) и расчеты с поставщиками. Таким образом, если на счете учитываются операции расчетов с тем, кто должен нам (например, с покупателями за поставленный им товар), то такой счет является активным (долг нам является нашим имуществом), и остаток по счету должен быть всегда дебетовым (дебиторская задолженность). Если на счете учитываются операции расчетов с тем, кому должны мы (например, с поставщиками за поставленный нам товар), то такой счет является пассивным (мы должны), и остаток будет всегда кредитовым (кредиторская задолженность). Сложившаяся в РФ теория и практика учета предусматривают и третий вид счетов – активно-пассивные. Это счета расчетов, на которых группируются операции с прочими контрагентами, как внутренними (по отношению к предприятию), так и внешними. Такой прочий контрагент, с которым могут совершаться самые разные операции, может оказаться как дебитором, так и кредитором. Пример такого счета в хозрасчетной бухгалтерии коммерческой организации РФ – расчеты с прочими дебиторами и кредиторами (счет 76). Рассмотрим несложный пример учета расчетов с прочими контрагентами. В методических целях будем использовать для учета расчетов счет «Прочие контрагенты» (имя счета – Контрагенты). В методических целях мы сократим количество возможных операций по этому счету до двух: мы будем отдавать им деньги и получать от них деньги. В реальной практике учета есть вероятность, что среди прочих дебиторов и кредиторов окажутся контрагенты, которым мы продаем товар, от которых мы получаем внеоборотные активы, и многие другие. Но нам сейчас интересен учет остатков, и то, какие обороты сформировали эти остатки, нам не принципиально. Итак, предположим, что у нас есть один Прочий контрагент, которому мы выдали 10 рублей (табл. 12.59). Таблица 12.59. Первая проводка №
Счет дт
Аналитика
Счет Кт
Контрагенты
Иванов
Касса
Аналитика
Сумма
10
Кроме этого, есть еще один контрагент, который решил дать нам 10 рублей (табл. 12.60). Таблица 12.60. Вторая проводка №
Счет Дт
Касса
Аналитика
Счет Кт
Аналитика
Контрагенты Петров
Сумма
10
Если на счете Контрагенты не ведется аналитический учет, то, анализируя остаток по счету Контрагенты, можно прийти к выводу: никто никому
674
ничего не должен (рис. 12.63), хотя контрагенты между собой о взаимозачете не договаривались.
Рис. 12.63. Анализ счета «Контрагенты»
Поэтому на счете Контрагенты будем вести учет в разрезе списка контрагентов. Тогда на каждого контрагента будет открыт свой маленький аналитический счет (рис. 12.64).
Рис. 12.64. Обороты по аналитическим счетам
Теперь, когда мы открыли на счете Контрагенты аналитический учет по контрагентам, с одной стороны, можем вести учет расчетов и анализировать задолженности по каждому контрагенту, что очень удобно. С другой стороны, мы получаем возможность видеть развернутый остаток по счету Контрагенты. Теперь у счета Контрагенты есть два типа остатков: свернутый (синтетический) остаток, который в нашем примере равен нулю, и развернутый (аналитический), который в нашем примере равен 10 руб. по дебету и 10 руб. по кредиту. Если свернутый (синтетический или просто остаток) остаток у счета всегда один, зависит от типа счета (активный, пассивный или активнопассивный) и рассчитывается системой (и в теории бухгалтерского учета) по правилам, которые мы рассматривали в разделе «Таблица остатков» на стр. 656, то развернутый остаток может быть и дебетовый, и кредитовый одновременно. В приведенном выше простом примере развернутый остаток счета соответствует оборотам счета, т. к. отсутствует входящий остаток. На самом деле они могут отличаться и наверняка отличаются. Рассмотрим более сложную ситуацию. Добавим для счета Контрагенты входящие остатки. Иванов был нашим кредитором, и мы были ему должны 8 рублей. В текущем отчетом периоде мы заплатили ему 10 рублей. Переплатили 2 рубля, и теперь он наш дебитор (он нам должен 2 рубля), рис. 12.65. Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии и другие варианты, например, развернутые остатки счета-группы с разворотом по субсчетам.
Рис. 12.65. Остатки и обороты на аналитических счетах
Петров, наоборот, был дебитором (был нам должен 3 рубля), в текущем отчетном периоде он сделал платеж на 10 рублей. Переплатил нам 7 рублей. Теперь мы ему должны 7 рублей. Мы видим, что при подсчете остатков по синтетическому счету Контрагенты мы учитываем входящее (свернутое) сальдо (5 рублей) и обороты по счету в целом (рис. 12.66).
Наиболее часто развернутые остатки требуется получать именно по активно-пассивным счетам, счетам расчетов и, чаще всего, при составлении баланса. По стандартам учета расчеты при включении в баланс не должны «сворачиваться»: в активе баланса нужно показать полную сумму дебиторской задолженности, а в пассиве – кредиторской. Возвращаясь к нашему примеру, правильно показать в активе баланса 2 рубля, а в пассиве – 7 рублей. Неправильно показать в пассиве 5 рублей. В системе «1С:Предприятие» для подсчета развернутых остатков используются специальные поля виртуальных таблиц. В таблице остатков это поля: ■■ РазвернутыйОстатокДт, ■■ РазвернутыйОстатокКт. В таблице остатков и оборотов такими полями являются следующие поля:
Рис. 12.66. Синтетический счет «Контрагенты»
При расчете развернутого сальдо по счету в разрезе аналитики (рис. 12.67) мы делаем следующее: ■■ выполняем расчет по каждому объему аналитики; ■■ по каждому объекту аналитики получаем входящее (развернутое) сальдо; ■■ по каждому объекту аналитики подсчитываем обороты; ■■ по каждому объекту аналитики рассчитываем исходящее сальдо; ■■ суммируем отдельно по всем объектам аналитики остатки дебетовые и отдельно кредитовые; ■■ получаем развернутый дебетовый остаток и развернутый кредитовый остаток по счету.
■■ ■■ ■■ ■■
НачальныйРазвернутыйОстатокДт, КонечныйРазвернутыйОстатокДт, НачальныйРазвернутыйОстатокКт, КонечныйРазвернутыйОстатокКт.
Реализуем в конфигурации описанный выше пример учета на счете Контрагенты и напишем запрос для анализа развернутого остатка по счету. При решении задачи получения развернутых остатков всегда нужно исходить из формулы: Остаток по развернутый по .
Поля развернутых остатков, присутствующие в виртуальных таблицах в детальной выборке запроса, полностью повторяют содержимое полей остатков (свернутых). Развернутые остатки имеют смысл только при наличии в запросе итогов. Построим несколько элементарных запросов к таблице остатков. Во все запросы будем передавать только один параметр Счет, который равен ссылке на счет Контрагенты. Первый запрос получит все остатки с отбором по счету (листинг 12.52). Листинг 12.52. Пример получения остатков регистра бухгалтерии
Рис. 12.67. Аналитический счет «Контрагенты»
Развернутый остаток не имеет смысла без критерия, по которому он будет «разворачиваться». В практике учета чаще всего получают развернутые остатки счета с разворотом по аналитике этого счета. Хотя возможны Том 1
ВЫБРАТЬ Остатки.Счет, Остатки.СуммаОстатокДт КАК СвернутыйДт, Остатки.СуммаОстатокКт КАК СвернутыйКт, Остатки.СуммаРазвернутыйОстатокДт КАК РазвернутыйДт, Остатки.СуммаРазвернутыйОстатокКт КАК РазвернутыйКт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(, Счет = &Счет, , ) КАК Остатки
675
Глава 12. Бухгалтерский учет Результат этого запроса – одна строка. Свернутые и развернутые остатки равны. Причина: мы не указали, по какому полю разворачивать (табл. 12.61). Таблица 12.61. Результат выполнения запроса Счет
СвернутыйДт
СвернутыйКт
РазвернутыйДт
РазвернутыйКт
Контрагенты
5
5
ПО
СУММА(СвернутыйКт), СУММА(РазвернутыйДт), СУММА(РазвернутыйКт) Счет
Результат выполнения этого запроса представлен в табл. 12.63. Таблица 12.63. Результат выполнения запроса
Изменим запрос, включим в поля выборки новое поле Субконто1, т. е. контрагента (листинг 12.53). Листинг 12.53. Пример получения остатков регистра бухгалтерии
Счет
Контрагент
СвернутыйДт
СвернутыйКт
РазвернутыйДт
РазвернутыйКт
Контрагенты
Иванов Петров
2
5 7
2 2
7 7
ВЫБРАТЬ Остатки.Счет, Остатки.Субконто1 КАК Контрагент, Остатки.СуммаОстатокДт КАК СвернутыйДт, Остатки.СуммаОстатокКт КАК СвернутыйКт, Остатки.СуммаРазвернутыйОстатокДт КАК РазвернутыйДт, Остатки.СуммаРазвернутыйОстатокКт КАК РазвернутыйКт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(, Счет = &Счет, , ) КАК Остатки
Мы получили свернутые и развернутые остатки по счету. При подведении итогов поля ОстатокДт и ОстатокКт сворачиваются по правилам, которые определяет вид счета (активный, пассивный, активно-пассивный), а поля РазвернутыйОстатокДт и РазвернутыйОстатокКт суммируются раздельно: отдельно подводится итог по элементам выборки, имеющим дебетовый остаток, отдельно по элементам, имеющим кредитовый остаток.
Результатом запроса будет таблица из двух строк: счет повторяется, но остатки мы получили по каждому контрагенту. Свернутые остатки и развернутые по-прежнему равны (табл. 12.62).
Можно ли было в нашем случае не включать в запрос поле Счет? Да, можно. Мы могли бы ограничиться включением в детальную выборку поля Субконто1 и подвести общие итоги.
Таблица 12.62. Результат выполнения запроса Счет
Контрагент СвернутыйДт СвернутыйКт
РазвернутыйДт
РазвернутыйКт
Контрагенты Контрагенты
Иванов Петров
2
7
2
7
Однако в этом запросе мы уже видим, что если подвести итоги по колонкам, мы получим тот самый развернутый остаток по счету, который нас и интересует. Давайте это сделаем. Подводим итоги по счету, суммируя все числовые поля (листинг 12.54). Листинг 12.54. Пример получения остатков регистра бухгалтерии
ВЫБРАТЬ Остатки.Счет КАК Счет, Остатки.Субконто1 КАК Контрагент, Остатки.СуммаОстатокДт КАК СвернутыйДт, Остатки.СуммаОстатокКт КАК СвернутыйКт, Остатки.СуммаРазвернутыйОстатокДт КАК РазвернутыйДт, Остатки.СуммаРазвернутыйОстатокКт КАК РазвернутыйКт ИЗ РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(, Счет = &Счет, , ) КАК Остатки ИТОГИ СУММА(СвернутыйДт),
676
Таким образом, итоги разворачиваются по всем полям детальной выборки (в нашем примере по двум – Счет и Субконто1) и рассчитываются по итоговому полю.
Методы менеджера регистра бухгалтерии Основным способом чтения данных в системе является запрос, и это оправданно. Однако для извлечения данных может применяться и объектная техника. Менеджер регистра бухгалтерии имеет три метода, позволяющих получать остатки и обороты. Необходимо сразу же оговориться, что при обращении к этим методам система все равно выполнит запрос. Разница между использованием запроса к виртуальным таблицам регистра бухгалтерии и использованием методов объекта лишь в синтаксисе. У менеджера регистра бухгалтерии существует три метода извлечения остатков и оборотов: ■■ ■■ ■■
Остатки(), Обороты(), ОборотыДтКт().
Каждый из них по своему назначению и функциональности похож на одноименную виртуальную таблицу. Профессиональная разработка в системе «1С:Предприятие 8»
Чтение данных регистра бухгалтерии Результат, возвращаемый этими методами, – таблица значений, содержащая затребованные при выполнении метода поля выборки. Такой же результат может быть получен с помощью запроса и последующей выгрузки результата запроса в таблицу значений (листинг 12.55). Листинг 12.55. Выполнение запроса и выгрузка результата запроса в таблицу значений
Таблица = Запрос.Выполнить().Выгрузить();
Рассмотрим работу метода Остатки(). Задача – получить остаток одного товара на выбранную пользователем дату. Пользователь выбирает в диалоге формы следующие параметры: ■■ Дата, ■■ Организация, ■■ Товар. Решим сначала задачу с помощью запроса (листинг 12.56). Листинг 12.56. Получение остатков с помощью запроса
Момент = Новый Граница(КонецДня(Дата), ВидГраницы.Включая); СчетТоваров = ПланыСчетов.ОсновнойПланСчетов.Товары; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.КоличествоОстатокДт |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Момент, Счет = &Счет, , | Субконто1 = &Субконто1 | И | Организация = &Организация) | КАК Остатки"; Запрос.УстановитьПараметр("Момент", Момент); Запрос.УстановитьПараметр("Счет", СчетТоваров); Запрос.УстановитьПараметр("Субконто1", Товар); Запрос.УстановитьПараметр("Организация", Организация); Результат = Запрос.Выполнить(); Остатки = Результат.Выбрать(); Остатки.Следующий(); ОстатокТовара = Остатки.КоличествоОстатокДт;
Эта же задача с помощью метода Остатки() менеджера регистра бухгалтерии может быть решена следующим образом (листинг 12.57). Листинг 12.57. Получение остатков с помощью метода «Остатки()»
Сравним параметры виртуальной таблицы остатков регистра бухгалтерии и параметры метода Остатки(), табл. 12.64. Таблица 12.64. Сравнение параметров таблицы остатков и метода «Остатки()» Метод Остатки()
Запрос к виртуальной таблице остатков
№
Параметр
№
1 2 3
МоментВремени
4 5
Измерения
Период 1 Субконто 3 УсловиеСчета 2 Условие 4 Выбранные поля-измерения запроса Выбранные поля-ресурсы запроса
ВидыСубконто Отбор
Ресурсы
Параметр
Первый параметр метода – МоментВремени – по своему назначению и использованию полностью идентичен первому параметру Период виртуальной таблицы остатков. Второй параметр – ВидыСубконто – позволяет установить отбор по виду субконто или упорядочить поля Субконто запроса, в точности как параметр Субконто виртуальной таблицы. Более подробно о назначении параметра можно посмотреть в разделе «Параметр «Субконто»: отбор и упорядочивание по виду субконто» на стр. 666. Третий параметр метода – Отбор – имеет тип Структура. Каждый элемент структуры описывает одно условие отбора. В этом элементе ключ соответствует полю, по которому можно выполнить отбор в виртуальной таблице (Счет, Субконто, ). А значение элемента – это значение, по которому нужно отобрать. Этот параметр объединяет в себе второй (УсловиеСчета) и четвертый (Условие) параметры виртуальной таблицы. Четвертый (Измерения) и пятый (Ресурсы) параметры метода позволяют указать в виде строки одно или несколько (через запятую) полей таблицы, которые будут включены в детальную выборку запроса. Как измерения могут быть указаны поля Счет, Субконто, . В качестве ресурсов указываются имена ресурсов регистра бухгалтерии. Ниже приводится пример использования параметров метода для получения таблицы остатков товаров (листинг 12.58). Листинг 12.58. Пример получения остатков регистра бухгалтерии
Момент = Новый Граница(КонецДня(Дата), ВидГраницы.Включая); СчетТоваров = ПланыСчетов.ОсновнойПланСчетов.Товары; Регистр = РегистрыБухгалтерии.ОсновнойРегистрБухгалтерии; Отбор = Новый Структура("Счет, Субконто1, Организация", СчетТоваров, Товар, Организация);
Момент = Новый Граница(КонецДня(Дата), ВидГраницы.Включая); СчетТоваров = ПланыСчетов.ОсновнойПланСчетов.Товары; Регистр = РегистрыБухгалтерии.ОсновнойРегистрБухгалтерии; Отбор = Новый Структура("Счет, Организация", СчетТоваров, Организация); ТаблицаРезультат = Регистр.Остатки(Момент, , Отбор, "Субконто1, Субконто2", "Количество, Сумма");
ТаблицаРезультат = Регистр.Остатки(Момент, ,Отбор, "" , "Количество"); ОстатокТовара = ТаблицаРезультат.Итог("КоличествоОстатокДт");
Результат исполнения кода приведен в табл. 12.65.
Том 1
Остатки()
677
Глава 12. Бухгалтерский учет
Физические таблицы регистра бухгалтерии
Таблица 12.65. Результат выполнения запроса Субконто1
Субконто2 Количество ОстатокДт
Количество ОстатокКт
Сумма ОстатокДт
Сумма ОстатокКт
Комплект Паркер Паркер Школьная Цветной Цветной
Офис Офис Филиал Офис Офис Филиал
100 -50 100 75 10 15
1 -5 10 10 3
Все физические таблицы регистра бухгалтерии можно разделить на две группы: таблицы первичных движений и таблицы итогов (рис. 12.68).
Такой же результат может быть получен с помощью запроса (листинг 12.59). Листинг 12.59. Пример получения остатков регистра бухгалтерии
Момент = Новый Граница(КонецДня(Дата), ВидГраницы.Включая); СчетТоваров = ПланыСчетов.ОсновнойПланСчетов.Товары; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Субконто1, | Остатки.Субконто2, | Остатки.КоличествоОстатокДт, | Остатки.КоличествоОстатокКт, | Остатки.СуммаОстатокДт, | Остатки.СуммаОстатокКт |ИЗ | РегистрБухгалтерии.ОсновнойРегистрБухгалтерии.Остатки(&Момент, Счет = &Счет, , | Организация = &Организация | ) КАК Остатки"; Запрос.УстановитьПараметр("Момент", Момент); Запрос.УстановитьПараметр("Счет", СчетТоваров); Запрос.УстановитьПараметр("Организация", Организация); Результат = Запрос.Выполнить(); ТаблицаРезультат = Результат.Выгрузить();
Вопросы производительности регистра бухгалтерии Этот раздел посвящен внутреннему устройству объекта Регистр бухгалтерии и предназначен для более глубокого понимания работы системы и более оптимального написания запросов к виртуальным таблицам регистра. Авторы не рекомендуют использовать знание физической организации таблиц для непосредственного доступа к таблицам. Все примеры и вопросы, рассмотренные в разделе, подразумевают использование системы «1С:Предприятие» в клиент-серверном варианте работы, при котором информационная база хранится в формате таблиц SQL Server.
678
Рис. 12.68. Физические таблицы регистра бухгалтерии
Таблицы первичных движений доступны для выполнения запроса и поэтому знакомы нам – это основная таблица и таблица значений субконто. Эти две таблицы хранят полную информацию о проводке. Таблицы итогов скрыты от прикладного разработчика и не могут выступать как источники запроса. И таблицы первичных движений, и таблицы итогов служат источниками данных для виртуальных таблиц регистра, которые по своей сути являются вложенными запросами. Таблицы первичных движений рассмотрены в разделе «Реальные таблицы» на стр. 655, поэтому перейдем сразу к описанию таблиц итогов.
Остатки и обороты по счетам Физическая таблица остатков и оборотов по счетам имеет следующую структуру (табл. 12.66). Таблица 12.66. Структура таблицы остатков и оборотов по счетам Период Счет
Остаток
ОборотДт
ОборотКт
Профессиональная разработка в системе «1С:Предприятие 8»
Вопросы производительности регистра бухгалтерии Рассмотрим подробнее поля этой таблицы (табл. 12.67). Таблица 12.67. Поля таблицы остатков и оборотов по счетам
Период
Комментарий
Период
Итоги хранятся помесячно, поле содержит дату (первое число месяца) Ссылка на счет плана счетов Количество полей зависит от измерений, которые созданы в регистре бухгалтерии Для каждого ресурса регистра бухгалтерии создаются три поля таблицы итогов: Остаток, ОборотДт, ОборотКт Хранит абсолютный остаток (дебет-кредит) на начало месяца, за который рассчитаны итоги (т. е. на конец прошлого месяца). При построении виртуальных таблиц служит основой для расчета полей ОстатокДт, ОстатокКт, РазвернутыйОстатокДт, РазвернутыйОстатокКт и зависит от вида счета (активный, пассивный, активно-пассивный) Дебетовый оборот счета за рассчитанный месяц Кредитовый оборот счета за рассчитанный месяц Общий оборот счета за рассчитанный месяц Разделитель итогов (для обеспечения параллельности проведения документов)
Остаток
ОборотДт ОборотКт Оборот Разделитель
Таблица хранит итоги по всем счетам. И при любом движении в регистре бухгалтерии эта таблица обновляется.
Наличие этой таблицы – одно из оснований, позволяющих утверждать, что регистры накопления более производительны по сравнению с регистрами бухгалтерии. По своей сути регистр бухгалтерии – это «регистр регистров», где каждый счет можно сравнить с регистром накопления. Однако таблица остатков и оборотов по счетам одна на все счета, и изменяется при записи любого документа, делающего движение по любым счетам.
Таблицы остатков и оборотов по счетам и субконто Физические таблицы остатков и оборотов по счетам и субконто появляются, когда хотя бы на один счет плана счетов был добавлен хотя бы один вид субконто. Количество таблиц соответствует максимальному количеству субконто, используемых на счетах. Структура таблиц напоминает структуру физической таблицы остатков и оборотов по счетам. В случае, если на счетах задействовано только два вида субконто, будет создано две таблицы (табл. 12.68 и табл. 12.69). Таблица 12.68. Структура первой таблицы остатков и оборотов по счетам и субконто при использовании двух видов субконто Счет
Субконто1
Том 1
Ск2
Остаток
ОборотДт
ОборотКт
Если мы увеличим максимальное количество субконто и добавим хотя бы на один счет третье субконто, в базу данных будет добавлена еще одна таблица (табл. 12.70). Таблица 12.70. Структура третьей таблицы остатков и оборотов по счетам и субконто при использовании трех видов субконто Период
Счет
Ск1
Ск2
Ск3
Остаток
ОборотДт
ОборотКт
При записи движения в регистр изменяется только одна из этих таблиц (для регистра без поддержки корреспонденций). Для регистра с поддержкой корреспонденций может потребоваться изменение двух таблиц (для счета дебета и счета кредита проводки, если на них различное количество субконто). Запись производится лишь в ту таблицу, количество субконто которой соответствует количеству субконто счета проводки. Например, пусть записывается проводка, представленная в табл. 12.71.
ВНИМАНИЕ!
Период
Счет
Ск1
Поле Счет
Таблица 12.69. Структура второй таблицы остатков и оборотов по счетам и субконто при использовании двух видов субконто
Остаток
ОборотДт
Таблица 12.71. Пример проводки №
Счет Дт
1
Поставщики
Субконто 1
Счет Кт
Субконто 2
Иванов
Субконто 1
Сумма
Субконто 2
Касса
10
В этом случае будет внесено изменение в одну из таблиц остатков и оборотов по счетам и субконто. В ту из них, где остатки и обороты учитываются в разрезе одного субконто (и по счету Поставщики, и по счету Касса), будет сделана запись в таблицу, которая хранит итоги в разрезе Субконто1. Теперь рассмотрим другую проводку (табл. 12.72). Таблица 12.72. Пример проводки №
Счет Дт
Субконто 1
Счет Кт
Субконто 2
2
Товары
Авторучка Склад № 1
Субконто 1
Сумма
Субконто 2
Поставщики
Иванов
10
ОборотКт
679
Глава 12. Бухгалтерский учет В этом случае будут изменены две таблицы: по счету Поставщики будет сделана запись в таблицу, которая хранит итоги в разрезе Субконто1; по счету Товары будет сделана запись в таблицу, которая хранит итоги в разрезе Субконто 1 и Субконто 2. Кроме того, для двух проводок для каждого счета будут сделаны записи в физическую таблицу остатков и оборотов по счетам, рассмотренную нами в разделе «Остатки и обороты по счетам» на стр. 678.
Строка в таблице итогов имеет период – 01.07.2010 и хранит остатки на начало июля 2010 года и обороты за июль. Расчет итогов можно выполнить программно, используя метод регистра бухгалтерии УстановитьПериодРассчитанныхИтогов(), листинг 12.60. Листинг 12.60. Пример использования метода «УстановитьПериодРассчитанныхИтогов()»
РегистрыБухгалтерии.ОсновнойРегистрБухгалтерии.УстановитьПериодРассчитанныхИтогов(Дата);
Обороты между счетами Для регистра с поддержкой корреспонденций создается физическая таблица для хранения оборотов в разрезе корреспондирующих счетов (таблица оборотов между счетами), табл. 12.73.
В качестве параметра в метод передается дата месяца, за который необходимо выполнить расчет итогов. ВНИМАНИЕ!
Расчет итогов не является обязательным, но представляется нам очень желательным. Рассчитанные итоги влияют на скорость получения остатков и оборотов по счетам: при построении виртуальных таблиц система всегда, когда есть возможность, обращается к таблицам итогов. Если затребованных данных в таблицах итогов нет, система обращается к таблицам первичных движений.
Таблица 12.73. Структура таблицы оборотов между счетами Период
СчетДт
СчетКт
Оборот
Таблица хранит обороты между счетами без детализации по субконто. Поэтому для извлечения любых оборотов между субконто используются физические таблицы первичных движений.
Управление итогами Управление итогами регистра бухгалтерии осуществляется интерактивно с помощью системной команды Управление итогами. Для этого нужно вызвать стандартную функцию Управление итогами (Все функции Стандартные) и переключить ее в режим Полные возможности (рис. 12.69).
Рис. 12.69. Диалог управления итогами
Период рассчитанных итогов – месяц. На рисунке видно, что последний рассчитанный месяц итогов регистров бухгалтерии – июль 2010 года.
680
Рассмотрим структуру физической таблицы остатков и оборотов по счетам, соответствующей приведенному выше диалогу расчета итогов (итоги рассчитаны по 31.07.2010 года), табл. 12.74. Таблица 12.74. Структура таблицы остатков и оборотов по счетам Период
Счет
01.02.2010 00:00:00
01.03.2006 00:00:00
01.04.2006 00:00:00
01.05.2006 00:00:00
01.06.2006 00:00:00
01.07.2006 00:00:00
01.11.3999 00:00:00
Остаток на начало Дебетовый февраля (на конец оборот за января 2010 года) февраль 2010 года Остаток на начало Дебетовый марта (конец оборот за март февраля) 2010 2010 года года Остаток на начало Дебетовый апреля (конец оборот за марта) 2010 года апрель 2010 года Остаток на начало Дебетовый мая (конец апреля) оборот за май 2010 года 2010 года Остаток на начало Дебетовый июня (конец мая) оборот за июнь 2010 года 2010 года Остаток на начало Дебетовый июля (конец июня) оборот за июль 2010 года 2010 года Актуальный 0 остаток с учетом всех движений регистра
Кредитовый оборот за февраль 2010 года Кредитовый оборот за март 2010 года Кредитовый оборот за апрель 2010 года Кредитовый оборот за май 2010 года Кредитовый оборот за июнь 2010 года Кредитовый оборот за июль 2010 года 0
Профессиональная разработка в системе «1С:Предприятие 8»
Вопросы производительности регистра бухгалтерии Таким образом, каждая строка таблицы итогов регистра бухгалтерии как указание месяца итогов хранит дату начала месяца. Хранится счет и измерения, и для каждого ресурса регистра бухгалтерии хранится абсолютный остаток (дебетовый остаток минус кредитовый остаток) на начало рассчитанного месяца (т. е. на конец прошлого месяца) и обороты за месяц. Дополнительно создается строка, маркированная периодом 01.11.3999, предназначенная для хранения текущих итогов регистра с учетом всех его записей. подробнее
Получение данных из таблиц итогов рассмотрено в разделе «Виртуальные таблицы» на стр. 655.
Режим разделения итогов Использование режима разделения итогов обеспечивает более высокую параллельность работы при записи в регистр, что позволяет ускорить запись в регистр и избежать блокировок в тех случаях, когда разные пользователи записывают данные с одинаковым набором значений полей (Период + Счет + Измерение). При использовании режима разделения итогов система при одновременной записи движений несколькими сеансами не будет обновлять одни и те же записи итогов, а будет записывать изменения итогов в отдельные записи. При получении итогов эти данные складываются. Таким образом обеспечивается и поддержание в актуальном состоянии итогов (например, для быстрого получения отчетов), и параллельность записи движений. Как уже говорилось, при записи движений в регистр записи в таблице итогов автоматически пересчитываются. Считываемые записи таблицы итогов в момент пересчета блокируются. Таким образом, документы, содержащие движения по одинаковым комбинациям значений полей (Период + Счет + Измерение), не могут быть проведены параллельно. Механизм разделения итогов вводит в состав хранимой таблицы итогов специальное поле (Разделитель), позволяющее распараллелить обновление записей итогов. Новые записи (с новым разделителем) с уже существующими комбинациями значений полей (Период + Счет + Измерение) создаются системой только в том случае, если параллельно выполняются две и более транзакции. Таким образом, увеличение количества записей итогов зависит от количества одновременно выполняемых транзакций. При получении итогов регистра бухгалтерии или при пересчете итогов записи сворачиваются по комбинациям измерений. Чтобы управлять работой данного механизма, предусмотрены две возможности. В конфигурации для регистров введено свойство Разрешить разделение итогов. Для новых регистров бухгалтерии, создаваемых в конфигурации, Том 1
это свойство стандартно установлено. Установка этого свойства позволяет включить или отключить возможность разделения итогов для конкретного регистра. Отключение свойства полностью исключает влияние данного механизма на работу регистра, так как само поле, используемое для разделения итогов, не включается в структуру регистра. Отключение данной возможности полезно, например, для регистров, которые не используются при параллельной работе пользователей (например, для регистров, всегда заполняемых специальными регламентными обработками). Признак использования разделения итогов для регистров (для которых разделение итогов разрешено в конфигурации) может быть получен и установлен программно методами менеджера регистра бухгалтерии ПолучитьРежимРазделенияИтогов() и УстановитьРежимРазделенияИтогов(), а также в стандартной функции управления итогами (Все функции Стандартные Управление итогами Полные возможности Разделение итогов Включить разделение итогов/Выключить разделение итогов). Такая возможность позволяет включать или выключать режим
разделения итогов в зависимости от условий работы пользователей в конкретной организации. Например, при интенсивном параллельном вводе информации этот режим может быть полезен. Но если с системой работает небольшое количество пользователей, то выигрыш от его применения будет небольшой, а некоторое замедление при получении отчетов и лишние записи в таблицах итогов фактически будут лишними (неоправданными). подробнее
В целом механизм разделения итогов для регистров бухгалтерии аналогичен такому же механизму для регистров накопления остатков. Подробно он описан в разделе «Режим разделения итогов» на стр. 681.
Индексы таблиц итогов регистра бухгалтерии Для ускорения поиска нужных записей в физических таблицах создаются индексы. Система создает индексы автоматически в соответствии со свойствами объектов. Нас интересует количество и состав полей в индексах, их зависимость от свойств объектов и их влияние на производительность системы. Так как производительность подсистемы бухгалтерского учета во многом определяется эффективностью хранения и получения данных из таблиц итогов регистра бухгалтерии, мы уделим им особое внимание. В индекс таблиц итогов регистра бухгалтерии входят следующие поля: Период + Счет + Измерение1 + [Измерение2…] + ЗначениеСубконто1 + [ЗначениеСубконто2…]
Индексы, создаваемые платформой для физических таблиц итогов регистра бухгалтерии, влияют на производительность системы с двух сторон: влияние на скорость записи движений при проведении документа и влияние на скорость получения данных при обращении к итогам (табл. 12.75).
681
Глава 12. Бухгалтерский учет Таблица 12.75. Влияние индексов на производительность Критерий
Влияние на производительность
Количество индексов
Обновление индексов при записи движений. Чем Да больше индексов создано для таблиц регистра, тем дольше они будут обновляться в момент записи движений в таблицы регистра, что существенно увеличит время проведения документа Чем больше полей попало в индекс, тем точнее Да будет выполнен захват строк (диапазона строк) таблицы итогов, который нужно обновить при записи движений в регистр Поля, не включенные в индекс, увеличат диапазон строк таблиц итогов на количество всех возможных комбинаций этих полей. Поиск нужных строк в этой выборке будет осуществляться перебором
Количество полей в индексе
Запись
Чтение Ограничение
Не более 128 индексов для таблицы
Несложно представить, к чему приведет увеличение максимального количества субконто до трех или включение еще одного примитивного типа данных (например, Булево) в состав составного типа данных значения субконто. СОВЕТ
Не более 16 полей в индексе Да
Рассмотрим подробнее перечисленные критерии.
Тип значения субконто и его влияние на количество индексов Количество индексов существенно зависит от типов полей, которые были использованы при создании измерений и/или субконто регистра. Рассмотрим несложный пример: в плане счетов установлено максимальное количество субконто, равное «2». Используются субконто примитивного типа данных (Дата и Строка).
Категорически не рекомендуется включать в составной тип данных плана видов характеристик, используемого в качестве видов субконто, примитивные типы данных.
Количество полей в индексе SQL Server имеет ограничение на количество полей в индексе, равное 16. Поиск по полям, участвующим в индексе, осуществляется системой быстро. Если есть поля, которые должны были бы участвовать в индексе (измерения, значения субконто), но не были включены в него по причине ограничения длины, система сможет быстро получить выборку, включающую в себя поля, участвующие в индексе, и все сочетания полей, не вошедших в индекс. Полученная выборка будет обрабатываться построчно с целью поиска нужной строки итогов. Рассмотрим это на примере физической таблицы остатков и оборотов по счетам и субконто регистра бухгалтерии демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске (рис. 12.71).
При использовании примитивных типов данных для каждого включенного примитивного типа в составной тип данных значения субконто создается свое поле в информационной базе (рис. 12.70).
Рис. 12.70. Поля записи
Индекс будет создан на каждое сочетание полей (табл. 12.76). Таблица 12.76. Создаваемые индексы Номер индекса
Поля в индексе
1 2 3 4
… + Субконто1 (Дата) + Субконто2 (Дата) … + Субконто1 (Дата) + Субконто2 (Строка) … + Субконто1 (Строка) + Субконто2 (Дата) … + Субконто1 (Строка) + Субконто2 (Строка)
682
Рис. 12.71. Свойства, влияющие на количество полей в индексе
Индекс будет включать следующие поля (табл. 12.77). Профессиональная разработка в системе «1С:Предприятие 8»
Вопросы производительности регистра бухгалтерии до четырех. При таком максимальном количестве субконто мы как раз «укладываемся» в 16 полей индекса.
Таблица 12.77. Поля, входящие в индекс № Поле
Комментарий
1 2 3
Период Счет Организация
4
Валюта
5 6 7 8 9 10
Субконто1 Субконто1 Субконто1 Субконто2 Субконто2 Субконто2
Тип Таблица Запись Тип Таблица Запись
Прокомментируем
Дата начала месяца периода итогов (Дата) Счет плана счетов (ПланСчетовСсылка.) Измерение регистра бухгалтерии Организация (СправочникСсылка.) Измерение регистра бухгалтерии Валюта (СправочникСсылка.) Фактический тип значения поля составного типа Тип ссылки Значение ссылки Фактический тип значения поля составного типа Тип ссылки Значение ссылки
таблицу:
хранения
Рассмотрим особенности функционирования демонстрационной конфигурации «Бухгалтерский учет» в случае увеличения максимального количества субконто на счете до пяти (табл. 12.78). Таблица 12.78. Поля, входящие в индекс
значений типа Дата, система создает одно поле в таблице базы данных, и, следовательно, каждое из них занимает одно поле в индексе.
№ поля
Для описания субконто используется составной тип данных. В демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске, и в типовой конфигурации для описания составного типа данных, определяющего тип значения характеристик ВидыСубконто, применяются только ссылочные типы данных. Для хранения одного значения составного типа данных (содержащего только ссылки) системой используются три поля базы данных: фактический тип значения, имя таблицы и идентификатор записи в этой таблице. Если включить в составной тип данных примитивные, то кроме опасностей, описанных в разделе «Тип значения субконто и его влияние на количество индексов» на стр. 682, возникает еще одна: для хранения каждого примитивного типа данных (Число, Дата, Строка, Булево) в таблицу базы данных будет добавлено еще одно поле. Другими словами, если добавить в составной тип данных все четыре примитивных типа, то для хранения одного значения субконто будет использоваться семь полей (из них три для ссылки). И как следствие при той же максимальной длине индекса (16 полей) в него попадут только период, счет, измерение и первое субконто.
4
Валюта
5, 6, 7 8, 9, 10 11, 12, 13 14, 15, 16
Субконто1 Субконто2 Субконто3 Субконто4 Субконто5
ПланСчетовСсылка.,
для
Увеличение количества субконто в нашей конфигурации более чем до четырех приведет к тому, что последнее субконто не будет участвовать в индексе. Конфигурация с такой настройкой регистра бухгалтерии и аналитического учета может и будет функционировать, но теряется производительность как при записи движений в регистр, так и при формировании отчетов.
СправочникСсылка.
1 2 3
Поле Период Счет Организация
Комментарий
Обязательное поле Счет плана счетов (ПланСчетовСсылка.) Измерение регистра бухгалтерии Организация (СправочникСсылка.) Измерение регистра бухгалтерии Валюта (СправочникСсылка.) Три поля для хранения составного типа данных (только ссылки) Три поля для хранения составного типа данных (только ссылки) Три поля для хранения составного типа данных (только ссылки) Три поля для хранения составного типа данных (только ссылки) Три поля для хранения составного типа данных (только ссылки)
Мы видим, что последнее субконто не включается в индекс таблицы. К чему это приведет? Давайте сравним работу таблицы итогов для демонстрационной конфигурации «Бухгалтерский учет», которая находится на прилагаемом компакт-диске, с максимальным количеством субконто, равным четырем и пяти. Итак, работа таблиц итогов, если все поля помещаются в индекс, представлена на рис. 12.72.
подробнее
Приложение «Хранение данных», раздел «Хранение значений полей составного типа».
Продолжая рассматривать физическую таблицу остатков и оборотов по счетам и субконто регистра бухгалтерии демонстрационной конфигурации «Бухгалтерский учет», мы можем сделать вывод, что все десять полей помещаются в индексе. Мы можем увеличить максимальное количество субконто на счете, не рискуя потерять производительность, Том 1
Рис. 12.72. Получение итогов при четырех субконто
683
Глава 12. Бухгалтерский учет Когда система осуществляет поиск в таблице итогов, она обращается к индексу и получает точное указание на строку, которая хранит затребованные остатки и обороты. При увеличении количества субконто до пяти последний вид субконто не попадает в индекс, и работа системы изменяется (рис. 12.73).
СОВЕТ
Если анализ поставленной задачи учета выявляет необходимость создания регистра, количество полей таблиц итогов которого больше, чем может включить в себя индекс, имеет смысл переосмыслить выбор объекта системы «1С:Предприятие» для решения этой задачи. Можно предположить, что ее решение с помощью регистров накопления будет рациональнее. Подходы к отнесению учетной задачи к бухгалтерскому или оперативному учету приводятся в разделе «Принятие решений при организации аналитического учета» на стр. 632. Если же постановка задачи исключает возможность решить ее с помощью объекта Регистр накопления, следует располагать субконто с малой селективностью (обладающие малым количеством значений и редко используемые для отбора в отчетах) последними на счетах. Это сократит диапазон полученных по индексу строк и время на поиск в нем нужной строки.
Построение виртуальных таблиц регистра бухгалтерии Как уже не раз говорились, виртуальные таблицы регистра представляют собой запросы, которые собирают данные из физических таблиц регистра бухгалтерии. Рассмотрим правила построения виртуальных таблиц. Рис. 12.73. Получение итогов при пяти субконто
На приведенной выше схеме видно, что в индексе участвуют только первые четыре субконто. Как результат система при поиске итогов по затребованному набору полей получает не одну строку, а диапазон строк, содержащий строки со всеми хранимыми вариантами (в нашем примере ВидN – Вид3). Далее поиск строки с нужным видом осуществляется перебором. Получение диапазона строк вместо одной строки итогов, во-первых, увеличит время формирования отчетов, в которых требуется получить отбор по последнему (не включенному в индекс) виду субконто, а во-вторых, увеличит время записи и объем блокируемых транзакцией строк таблицы во время записи движений в регистр. Во время записи движений в регистр блокируются строки таблицы итогов для внесения в них изменений. Если индекс охватывает все поля регистра, блокируется одна изменяемая и соседние (блокировка соседних строк связана с особенностями работы SQL) строки. Пока выполняется транзакция, другие пользователи не могут выполнять запись движений с таким же набором полей (Период + Счет + Измерение + Субконто). Если вместо одной строки итогов был получен диапазон строк, блокируется весь диапазон (плюс соседние строки). Вероятность того, что пользователи «столкнутся» при проведении документов, увеличивается.
684
Механизм текущих итогов При описании физических таблиц итогов регистра мы упоминали, что итоги хранятся помесячно. Подобная организация физических таблиц позволяет быстро получать остатки на первое число месяца и обороты за календарный месяц. Хранение итогов помесячно обосновано особенностью ведения учета: как правило, стандартными бухгалтерскими интервалами для составления отчетности являются месяц, квартал и месяц и квартал нарастающим итогом с начала года. Бухгалтерский учет «историчен» – как правило, обрабатываются документы, свидетельствующие об уже свершившихся фактах хозяйственной деятельности, после ввода всех документов за стандартный бухгалтерский интервал формируется отчетность. Однако существуют и задачи учета в реальном времени. Тогда необходимо получать данные по еще не закрытому отчетному периоду, «на сейчас», т. е. с учетом последней записанной в информационную базу проводки. Для быстрого получения актуальных на текущий момент времени данных и предназначен механизм текущих итогов. Рассмотрим несложный пример работы механизма для одного счета. В методических целях будем считать, что: ■■ ведется только синтетический учет (нет учета по субконто); ■■ только в валюте учета; Профессиональная разработка в системе «1С:Предприятие 8»
Вопросы производительности регистра бухгалтерии ■■ без измерений; ■■ нет входящих остатков. Итак, были (табл. 12.79).
сделаны
Можно представить также этот журнал проводок в виде оборотной ведомости по счету «Касса» в разрезе календарных месяцев (табл. 12.81).
следующие
проводки
в
таблице
записей
Таблица 12.79. Записи таблицы записей регистра бухгалтерии Период
Счет Дт
Счет Кт
Сумма
01.01.2010 12.01.2010 18.01.2010 05.02.2010 13.02.2010 20.02.2010 01.03.2010 08.03.2010 16.03.2010 01.04.2010 10.04.2010 20.04.2010
Касса Касса Сотрудники Касса Поставщики Касса Касса Сотрудники Касса Касса Касса Сотрудники
Капитал Покупатели Касса Покупатели Касса Сотрудники Покупатели Касса Покупатели Сотрудники Покупатели Касса
10 5 3 8 6 1 7 9 4 2 1 2
Период
Остаток на начало
Оборот Дт Оборот Кт Остаток на конец
Январь 2010 Февраль 2010 Март 2010 Апрель 2010
0 12 15 17
15 9 11 3
3 6 9 2
12 15 17 18
Итоги рассчитаны за январь и февраль. Ячейки, выделенные серым цветом, в физической таблице итогов не хранятся. Это остатки на конец месяца и еще не рассчитанные месяцы: пользователи уже начали вводить операции за апрель, однако и март, и апрель еще не рассчитаны. Чтобы не использовать физические таблицы первичных движений каждый раз, когда требуется узнать последние (текущие) итоги по счету с учетом всех движений (включая проводки за март и апрель), в физических таблицах итогов создается еще одна строка для хранения текущих итогов.
Можно представить также этот журнал проводок в виде оборотной ведомости по счету касса в разрезе дней (табл. 12.80). Это пригодится нам в дальнейшем. Таблица 12.80. Представление журнала проводок в виде оборотной ведомости по счету Период
Счет Дт
Счет Кт
Сумма Остаток на начало
Оборот Дт
Оборот Кт
Остаток на конец
01.01.2010 12.01.2010 18.01.2010 05.02.2010 13.02.2010 20.02.2010 01.03.2010 08.03.2010 16.03.2010 01.04.2010 10.04.2010 20.04.2010
Касса Касса Сотрудники Касса Поставщики Касса Касса Сотрудники Касса Касса Касса Сотрудники
Капитал Покупатели Касса Покупатели Касса Сотрудники Покупатели Касса Покупатели Сотрудники Покупатели Касса
10 5 3 8 6 1 7 9 4 2 1 2
10 5 0 8 0 1 7 0 4 2 1 0
0 0 3 0 6 0 0 9 0 0 0 2
10 15 12 20 14 15 22 13 17 19 20 18
0 10 15 12 20 14 15 22 13 17 19 20
О расчете итогов рассказывается в разделе «Управление итогами» на стр. 680. Результатом расчета итогов стали физическая таблица остатков и оборотов по счетам и физическая таблица оборотов между счетами за эти же два месяца, но в нашем примере мы не будем ее учитывать. Том 1
Таблица 12.81. Представление журнала проводок в виде оборотной ведомости по счету в разрезе месяцев
Поэтому на самом деле физическая таблица остатков и оборотов по счетам хранит не два (январь и февраль), а три «месяца» (январь, февраль, текущие итоги) и выглядит следующим образом (табл. 12.82). Таблица 12.82. Таблица остатков и оборотов по счетам Период
Счет
Остаток
Оборот Дт
Оборот Кт
01.01.2010 01.02.2010 01.11.3999
Касса Касса Касса
0 12 18
15 9 0
3 6 0
На 01.11.3999 года хранятся текущие итоги. Эти итоги учитывают все активные движения регистра. Дату 01.11.3999 можно увидеть, например, сформировав запрос к виртуальной таблице остатков и оборотов без указания интервала дат с периодичностью Месяц или более детально. Используя шкалу времени, можно представить хранение итогов в виде схемы, приведенной на рис. 12.74. Пример формирования запроса без указания интервала дат был приведен не случайно. Именно в случае, если обращение к виртуальной таблице остатков производится без указания интервала дат, система обращается непосредственно к строкам, где хранятся текущие итоги. Текущие итоги используются и при обращении к итогам на произвольную дату месяца, который не был рассчитан (на схеме – март и апрель). В нижней части схемы изображены различные варианты получения остатков и оборотов. Актуальному остатку соответствует элемент схемы «Остаток 5». Остальные элементы (варианты) будут рассмотрены ниже.
685
Глава 12. Бухгалтерский учет Вариант 1. При обращении к виртуальной таблице остатков указан момент времени, соответствующий началу календарного месяца, и этот месяц рассчитан. На приведенной схеме (рис. 12.74, вариант Остаток 1) это может быть начало января 2010 года (01.01.2010 0:00:00 или граница от конца дня 31.12.2009, включая последнюю секунду) или начало февраля 2010 года. В этом варианте система обращается к физической таблице итогов и получает готовый остаток. Такой запрос будет выполнен максимально быстро. Вариант 2. Требуется получить остаток на произвольный момент времени месяца. Важные замечания: этот месяц рассчитан, и этот месяц не последний рассчитанный, т. е. существует следующий рассчитанный месяц, и, таким образом, есть остаток на конец того месяца, за произвольную дату которого нужно получить остаток. В нашем случае (рис. 12.74, вариант Остаток 2) это может быть любая дата января (на рис. 12.74 – 15 января). Итоги рассчитаны за февраль, т. е. в физических таблицах итогов есть строка на 01.02.2010 с остатком на начало февраля (конец января). Система получит остаток на начало следующего месяца (начало февраля) из физической таблицы итогов и вычтет из него «проводки» с 15.01.2010 (включительно) по 31.01.2010 (включительно). Остаток на 15.01.2010 = Итоги остаток (01.02.2010)
– Проводки (15.01.2010 - 31.01.2010)
В нашем примере это будет: остаток на 15.01.2010 = 12 руб. - (-3 руб.) = 15 руб. Рис. 12.74. Схема хранения итогов
В нашем примере, чтобы получить актуальный остаток по счету Касса, необходимо выполнить запрос к виртуальной таблице остатков без указания первого параметра таблицы Момент. Или воспользоваться методом менеджера регистра бухгалтерии Остатки(), передав в качестве первого параметра метода значение Неопределено.
Таблица остатков Источниками данных виртуальной таблицы остатков в базе данных являются физическая таблица остатков и оборотов по счетам, физическая таблица остатков и оборотов по счетам и субконто и, в ситуациях, когда физические таблицы итогов использовать невозможно, физическая таблица движений. Рассмотрим все возможные варианты работы виртуальной таблицы остатков. В первую очередь рассмотрим варианты выбора системой источника данных: физические таблицы итогов или физические таблицы первичных движений. Критерием выбора в данном случае является момент времени, на который затребован остаток.
686
Вариант 3. Требуется получить остаток на произвольный момент последнего рассчитанного месяца. В физических таблицах итогов нет следующей строки со следующим рассчитанным месяцем, где бы хранились остатки на конец выбранного нами месяца. На рис. 12.74, вариант Остаток 3, это 15 февраля (итоги рассчитаны по февраль включительно). Система получит итоги на начало февраля из физических таблиц итогов, далее из той же строки физической таблицы итогов получит дебетовый и кредитовый оборот и, таким образом, сможет быстро получить остаток на конец февраля (начало марта). Получив этот остаток, она вычтет из него «проводки» с 15.02.2010 (включительно) по 28.02.2010 (включительно). Остаток на 15.02.2010 = Итоги остаток (01.02.2010)
+ Итоги дебетовый оборот (01.02.2010 - 28.02.2010)
- Итоги кредитовый оборот (01.02.2010 - 28.02.2010)
- Проводки (15.02.2010 - 28.02.2010)
В нашем примере это будет: 12 руб. + 9 руб. - 6 руб. - 1 руб. = 14 руб. Вариант 4. Требуется получить остаток на произвольный момент времени любого не рассчитанного месяца. В нашем примере (рис. 12.74, вариант Профессиональная разработка в системе «1С:Предприятие 8»
Вопросы производительности регистра бухгалтерии Остаток 4) это могут быть и 15 марта, и 15 апреля. В этом случае система
воспользуется готовыми текущими итогами и отнимет от них проводки за интервал дат с 15 марта (15 апреля) до последней записи. Остаток на 15.03.2010 = Итоги остаток (актуальный)
- Проводки (15.03.2010 - последняя проводка).
В нашем примере это будет: 18 руб. - (7 руб. - 2 руб.) = 13 руб. Вариант 5. Требуется получить актуальный остаток. Момент времени при обращении к виртуальной таблице не указывается, система получает актуальный остаток из физических таблиц итогов (рис. 12.74, вариант Остаток 5). Актуальный остаток = Итоги остаток (актуальный).
В нашем примере это будет: 18 руб.
Рис. 12.75. Алгоритм использования физических таблиц при построении виртуальной таблицы оборотов
Если первым критерием, влияющим на выбор источника запроса для виртуальной таблицы (физическая таблица итогов или физическая таблица проводок), можно считать момент времени, то вторым – были ли затребованы в отборах или списке выбранных полей субконто. Если аналитика встречалась, в качестве физической таблицы итогов (их может быть несколько, если запрос выполняется по нескольким счетам) будет использоваться физическая таблица остатков и оборотов по счетам и субконто. Если требуются только синтетические остатки – физическая таблица остатков и оборотов по счетам.
Вариант 2. Требуется получить оборот с 20.12.2009 по 20.02.2010 (рис. 12.74, вариант Оборот 2).
Таблица оборотов
В нашем примере это будет: оборот Дт = 15 руб. + 0 + 9 руб. = 24 руб.
В основе построения виртуальной таблицы оборотов лежит тот же принцип: если данные можно взять из физических таблиц итогов, используются они. То, что из физических таблиц итогов взять нельзя, получается из физических таблиц первичных движений.
Вариант 3. Так же поступит система и в случае, если требуется получить оборот за период, в котором есть не рассчитанные интервалы (рис. 12.74, вариант Оборот 3). Рассчитанные, полностью включенные в период запроса календарные месяцы будут взяты из таблиц итогов, а оставшиеся «куски» дат будут собраны системой по таблицам проводок.
Но у виртуальной таблицы оборотов есть и свои особенности. Если при обращении к виртуальной таблице параметр Периодичность установлен меньше месяца или используются поля, содержащие в своем название Кор, виртуальная таблица строится только на основании физических таблиц первичных движений. Во всех остальных случаях обороты за календарные месяцы виртуальная таблица получает из физических таблиц итогов (рис. 12.75). Рассмотрим возможные варианты. Вариант 1. Затребован оборот за рассчитанный календарный месяц с 01.01.2010 по 31.01.2010 (рис. 12.74, вариант Оборот 1).
Система получит готовые обороты за январь, как в предыдущем случае, а интервалы дат с 20.12.2009 по 01.01.2010 и с 01.02.2010 по 20.02.2010 рассчитает по данным физической таблицы записей. Оборот за произвольный период (20.12.2009 - 20.02.2010 включительно) = Оборот Дт = Итоги оборот Дт (январь) + Проводки (20.12.2009 - 31.12.2009)
+ Проводки (01.02.2010 - 20.02.2010).
Отдельно следует упомянуть про расчет полей с постфиксом Оборот. Поля виртуальной таблицы оборотов ОборотДт и ОборотКт рассчитываются таблицей «в один приход» – такие поля есть в физических таблицах итогов, и достаточно одного «прохода» по физической таблице записей. Поля виртуальной таблицы Оборот рассчитываются «в два прохода» – сначала рассчитывается дебетовый оборот, потом из него вычитается кредитовый оборот (рис. 12.76).
Система обратится к строке физической таблицы итогов, маркированной периодом «01.01.2010», и получит дебетовый или кредитовый оборот. Оборот за календарный месяц Январь = Итоги оборот Дт / Кт (01.01.2010 - 31.12.2010).
В нашем примере это будет: оборот Дт = 15 руб., оборот Кт = 3 руб. Том 1
Рис. 12.76. Алгоритм расчета полей оборотов
687
Глава 12. Бухгалтерский учет
Таблица остатков и оборотов Формирование виртуальной таблицы остатков и оборотов можно представить в виде следующий схемы (рис. 12.77).
Рис. 12.78. Алгоритм построения таблицы оборотов Дт Кт
При условии, что периодичность не меньше месяца (как и в виртуальной таблице оборотов) и в запросе не упоминается аналитика (физическая таблица оборотов между счетами не хранит информацию в разрезе субконто), используется физическая таблица итогов, в противном случае запрос выполняется к физическим таблицам первичных движений. Рис. 12.77. Алгоритм формирования таблицы остатков и оборотов
Виртуальную таблицу остатков и оборотов система получает в несколько проходов. Остатки на начало периода рассчитываются по той же схеме, по которой рассчитывается виртуальная таблица остатков. Обороты за период рассчитываются как виртуальная таблица оборотов с условием, что в ней не используются фильтры и группировки по Кор полям. Далее система самостоятельно (не используя ресурсы SQL-сервера) подсчитывает остатки на конец периода.
Физическая таблица оборотов между счетами хранит ресурс Оборот, поэтому получение этого ресурса не требует двух проходов (как в виртуальной таблице оборотов).
Таблица движений с субконто Виртуальная таблица движений с субконто формируется системой с использованием только физических таблиц первичных движений, чем и обусловлена возможность получения этой виртуальной таблицей неактивных записей (рис. 12.79).
Если используется параметр Периодичность, то результаты запросов по остаткам на начало и оборотам помещаются во временную таблицу на сервер, к которой и выполняется запрос для получения виртуальной таблицы остатков и оборотов.
Таблица оборотов Дт Кт Построение виртуальной таблицы оборотов Дт Кт выполняется системой по алгоритму, напоминающему виртуальную таблицу оборотов. Отличия есть, и они являются следствием физической таблицы итогов (физическая таблица оборотов между счетами), которая может использоваться при построении виртуальной таблицы (рис. 12.78).
688
Рис. 12.79. Алгоритм формирования виртуальной таблицы движений с субконто
Профессиональная разработка в системе «1С:Предприятие 8»
Вопросы производительности регистра бухгалтерии
Использование текущих итогов Чтобы поддерживать текущие итоги в актуальном состоянии, при записи набора активных записей в таблице движений всегда рассчитываются и перезаписываются текущие итоги в таблице итогов, если у регистра установлен признак использования итогов.
в запросе для фильтра или группировки), на втором – два вида субконто (один из них тот же), а на третьем – три, источниками данных запроса будут три физические таблицы остатков и оборотов по счетам и субконто регистра бухгалтерии (рис. 12.80).
Однако пересчет текущих итогов при параллельной записи движений несколькими пользователями может быть неэффективным. Например, если период рассчитанных итогов регулярно устанавливается обработкой и есть уверенность в хранении посчитанных итогов на начало каждого месяца, может быть выгоднее «досчитывать» остатки от хранимых итогов. В таком случае можно не устанавливать использование текущих итогов для регистра бухгалтерии – УстановитьИспользованиеТекущихИтогов(Ложь). Если использование текущих итогов выключено, то расчет актуальных остатков будет производиться следующим образом: сначала будут получены остатки на самые поздние хранимые итоги, а потом по движениям за оставшийся период будут получены актуальные остатки. Данный подход позволяет увеличить параллельность при записи наборов записей данного регистра, так как не требуется обновления текущих итогов. Получить признак использования текущих итогов из встроенного языка можно методом менеджера регистра бухгалтерии ПолучитьИспользованиеТекущихИтогов(). Включить или выключить использование текущих итогов можно методом УстановитьИспользованиеТекущихИтогов(Истина/ Ложь), а также в стандартной функции управления итогами (Все функции Стандартные Управление итогами Полные возможности Текущие итоги Включить использование текущих итогов/Выключить использование текущих итогов).
Зависимость производительности от настроек субконто счета Производительность системы при формировании виртуальных таблиц зависит от многих факторов. Часть из них мы перечислили, описывая индексирование таблиц, часть – при описании конкретных виртуальных таблиц. Остались те, которые влияют на работу всех таблиц и которые, мы считаем, необходимо учитывать при проектировании плана счетов и написании запросов. Во всех виртуальных таблицах отбор по полю Счет (СчетДт, СчетКт, КорСчет) вынесен в отдельное поле. Сделано это не случайно. При формировании таблицы система анализирует настройку видов субконто для каждого счета и выбирает соответствующую физическую таблицу итогов для получения остатков и оборотов.
Рис. 12.80. Пример использования физических таблиц
Еще один вопрос, связанный с аналитикой и производительностью при работе виртуальных таблиц, – это порядок, в котором «прикреплены» субконто к счету. Наиболее быстро система сможет получить итоги по тем субконто, которые прикреплены к счету первыми. Можно порекомендовать располагать субконто на счете с учетом следующего правила: ■■ те из них, по которым наиболее часто нужно выполнять отбор, имеет смысл располагать «ближе к счету»; ■■ те, которые реже участвуют в отборе и чаще предназначены для группировки, имеет смысл поместить «в конец» (рис. 12.81). Также на производительность влияет и то, в каком порядке привязаны на разные счета одни и те же виды субконто, если запрос выполняется сразу по нескольким счетам. Возможность упорядочить виды субконто в запросе, используя параметр виртуальной таблицы Субконто, описана в разделе «Параметр «Субконто»: отбор и упорядочивание по виду субконто» на стр. 666.
Например, если запрос выполняется сразу по трем счетам и на первом из них подключен один вид субконто (значение которого используется Том 1
689
Глава 12. Бухгалтерский учет Если один и тот же субконто прикреплен к разным счетам в различном порядке (на одном счете он первый, на другом – второй), виртуальная таблица для сбора данных по этому субконто выполнит два подзапроса (рис. 12.82).
Рис. 12.81. Пример зависимости скорости выполнения запроса от расположения субконто
690
Рис. 12.82. Схема формирования виртуальной таблицы
Профессиональная разработка в системе «1С:Предприятие 8»