С. А. Митичкин.

Разработка в системе "1С:Предприятие 8.0".

ООО «1С-Паблишинг»

2003 г

Митичкин Станислав Александрович.

Эта книга посвящена разработке и модификации прикладных решений (конфигураций) на технологической платформе системы программ «1C Предприятие 8.0». В книге дается обзор основных возможностей системы, описываются методики применения различных механизмов платформы, разбираются приемы использования встроенного языка и механизма запросов. Для специалистов, имеющих опыт разработки в «1C Предприятии 7.7», в книге приводятся важные отличия от предыдущей версии. Данная книга дополняет, но не заменяет документацию к программному продукту, входящую в комплект поставки. Книга будет полезна для быстрого освоения системы «1C Предприятие 8.0».

Право тиражирования и распространения книги принадлежит фирме «1С-Паблишинг». Полное или частичное копирование материалов книги без письменного разрешения фирмы «1С-Паблишинг» запрещается.

ООО «1C Паблишинг», 2003 год

Структура книги

В главе 1 «Обзор системы» приводится общая информация об архитектуре 1С:Предприятия 8.0 и разработке прикладных решений (конфигураций).

Глава 2 «Встроенный язык» описывает назначение и конструкции встроенного языка, используемого для определения поведения объектов конфигурации и реализации различных алгоритмов.

Глава 3 «Основные объекты конфигурации» содержит сведения об основных объектах, используемых практически в любом прикладном решении.

В главе 4 «Интерфейс пользователя» рассматриваются составные части пользовательского интерфейса, командный интерфейс конфигурации (меню и панели инструментов), экранные формы и элементы управления.

Глава 5 «Коллекции значений» содержит сведения об универсальных коллекциях значений — массивах, таблицах значений и др.

Глава 6 «Запросы» рассказывает про механизм запросов, используемый для выборки информации из базы данных.

Глава 7 «Отчеты» содержит сведения о принципах формирования отчетов и других печатных форм.

В главе 8 «Регистры сведений» рассказывается про новый для «1С:Предприятия» объект — регистр сведений, предназначенный для хранения информации, развернутой по комбинации измерений.

Глава 9 «Регистры накопления» описывает регистры, используемые для хранения данных, развернутых по комбинации измерений и поддающихся суммированию

Глава 10 «Бухгалтерский учет» содержит краткие сведения о механизмах, используемых для ведения бухгалтерского учета, а так же управленческого учета и планирования.

Глава 11 «Сложные периодические расчеты» освещает механизмы для реализации расчетов на платформе 1С:Предприятие 8.0, включая регистры расчета и планы видов расчета. Обычно эти механизмы используются для автоматизации расчета заработной платы.

В главе 12 «Взаимодействие с другими системами» дается краткий обзор средств 1С:Предприятия 8.0, предназначенных для связи с внешними приложениями и построения интегрированных решений.

Введение

Эта книга предназначена, в первую очередь, для специалистов, разрабатывающих или модифицирующих прикладные решения

системы программ «1С:Предприятие 8.0». Книга также будет полезна для людей, профессионально занимающихся внедрением и сопровождением прикладных решений, для администраторов и специалистов по информационным технологиям.

Система программ «1С:Предприятие 8.0» предназначена для автоматизации деятельности предприятий, организаций и частных

лиц. В основе системы лежит гибкая технологическая платформа, возможности которой позволяют создавать и модифицировать самые разнообразные бизнес-приложения.

Система «1С:Предприятие 8.0» предоставляет широкие возможности для решения задач планирования и оперативного управления, ведения бухгалтерского и управленческого учета, расчета заработной платы, а также комплексной автоматизации организационной и хозяйственной деятельности производственных предприятий, торговых и финансовых организаций, бюджетных учреждений и предприятий сферы услуг.

Выпуск новой версии 8.0 платформы «1С:Предприятия» отражает современные тенденции развития рынка массовых систем автоматизации управления и учета — расширение спектра решаемых задач, увеличение среднего масштаба решений, новые технические условия, в которых функционируют системы автоматизации. Новая версия «1С:Предприятия» вобрала в себя все лучшее из прежней версии и предоставила принципиально новые возможности для пользователей и разработчиков.

Настоящая книга предназначена для быстрого освоения возможностей технологической платформы «1С:Предприятия 8.0», содержит множество примеров и наглядных иллюстраций. Структура данной книги, с одной стороны, позволяет прочитать ее от начала до конца, а с другой стороны, к главам книги можно обращаться выборочно, по мере необходимости.

Данная книга не является документацией по программному продукту. Для ведения разработки в системе «1С:Предприятие 8.0» необходимо наличие книг, входящих в комплект поставки, к которым относятся:

  • • «Конфигурирование и администрирование»,

  • • «Описание встроенного языка» (в 3-х частях),

  • • «Руководство по установке и запуску».

Предполагается, что наличие такой обучающей книги позволит ускорить освоение новой технологии, поэтому подготовка книги велась совместно с подготовкой программного продукта к выпуску. На момент издания книги была выпущена версия 8.0.3 платформы «1С:Предприятия».

Если по мере прочтения книги вы обнаружите некоторые упущения, просьба отнестись к этому с пониманием и сообщить о них в фирму «1C» по электронной почте ( lc@lc.ru ). Автор будет благодарен за ваши замечания и предложения по развитию книги.


Структура книги

Глава 1.

Обзор системы

Система программ 1С:Предприятие 8.0 включает в себя платформу и прикладные решения, разработанные на ее основе. Система «1С:Предприятие 8.0» предназначена для автоматизации деятельности организаций и частных лиц. Сама платформа 1C:Предприятие 8.0 не является программным продуктом для конечных пользователей, которые обычно работают с одним или несколькими прикладными решениями (конфигурациями), разработанными на данной платформе*. Такой подход позволяет автоматизировать различные виды деятельности, используя единую технологическую платформу 1С:Предприятие 8.0.

Схематично это можно показать следующим образом:

Конечные пользователи

Система программ "1C Предприятие 8.0"

Прикладные решения (конфигурации)

Платформа "1C Предприятия 8.0"

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

Первым выпущенным прикладным решением для новой версии технологической платформы является «Управление торговлей» (разработчик — фирма «1C», дата выпуска - 31 07 2003)

Разработка и модификация прикладного решения производится в специальном режиме «Конфигуратор». В данном режиме разработчик определяет общую архитектуру прикладного решения и структуру данных, создает макеты отчетов и экранные формы, пишет программные модули на встроенном языке программирования. Конечный пользователь работает в обычном режиме «Предприятие», вводит данные в базу данных, формирует отчеты и т.д.

На этапе разработки или модификации конфигурации разработчик анализирует предметную область и требования пользователей, создает или изменяет объекты конфигурации, настраивает связи между ними путем установки их свойств, проектирует экранные формы и макеты отчетов, реализует алгоритмы работы системы на встроенном языке. В результате получается прикладное решение, призванное автоматизировать работу конечных пользователей, обеспечить им информационную поддержку при принятии управленческих решений.

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


Демонстрационный пример

В качестве наглядного примера ниже приводится структура простой конфигурации, предназначенной для автоматизации торговой деятельности организации. Конфигурация будет состоять из следующих объектов:

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

  1. Номенклатура. Содержит список товаров.

  2. Контрагенты. Содержит список клиентов и поставщиков, а также всех внешних организаций.

  3. Склады. Содержит список складов (мест хранения) организации.

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

  1. ПриходнаяНакладная. Осуществляет оприходование товарана склад, добавляет запись о приходе товара в регистр накопления Остатки.

  2. РасходнаяНакладная. Регистрирует реализацию товара,уменьшает количество в регистре Остатки и добавляет запись в регистр Продажи.

В регистрах накопления хранится информация об остатках или оборотах, связанных с объектами предметной области. Нам понадобятся следующие регистры накопления:

  1. Остатки. Хранит записи о движении товаров на складе, предоставляет информацию об остатке товаров на каждом складе.

  2. Продажи. Хранит записи о продажах, предоставляет информацию об объеме продаж каждого товара в разрезе контрагентов.

Отчеты предназначены для отображения на экране и печати итоговых и детальных данных. Отчеты не хранят никаких данных в информационной базе, они лишь извлекают информацию из других объектов, обрабатывают ее и выводят результаты в выходную форму. В нашей простой конфигурации мы создадим всего два отчета:

  1. Остатки. Показывает остатки товаров на выбранном складе. Данные будут браться из регистра накопления Остатки.

  2. АнализПродаж. Показывает объем продаж заданной группы товаров. Для получения данных будет использован регистр накопления Продажи.

Общую структуру этого прикладного решения можно изобразить следующим образом (стрелки обозначают потоки данных):

Поясним основные взаимосвязи между объектами:

  • Данные из справочников обычно используются в других объектах конфигурации, так как именно в справочниках содержится информация о ключевых объектах предметной области.

  • Документы регистрируют происходящие события, имеющие смысл с точки зрения экономики, и изменяют состояние регистров.

  • Отчеты используют данные из регистров и других объектов конфигурации для показа нужной пользователям информации.

Задача разработчика — создать или модифицировать необходимые объекты конфигурации, связать их друг с другом, настроив их свойства, задать поведение объектов, используя средства встроенного языка. Все эти объекты создаются с помощью визуальных средств, как показано ниже.

Для начала работы после установки 1С Предприятия 8.0 создайте новую информационную базу, затем запустите 1С:Предприятие 8.0 в режиме «Конфигуратор» и откройте дерево конфигурации. Все эти операции описаны в книге «1С:Предприятие 8.0. Руководство по установке и запуску»-, входящей в документацию к программному продукту.

1. Создание справочников и регистров

После создания информационной базы и запуска Конфигуратора можно начать разработку конфигурации. На данном этапе мы создадим справочники и регистры накопления. Любой справочник в системе 1СПредприятие 8.0 имеет встроенные реквизиты Код и Наименование. В нашем примере справочник Номенклатура будет иметь еще один реквизит Цена.

Ниже показано окно редактирования свойств справочника Номенклатура:

На закладке Иерархия (или в палитре свойств) поставьте флажок Иерархический. Это означает, что товары в справочнике будут объединяться в группы, например, «Мониторы», «Бытовая техника». При необходимости вывод по группам может быть легко отключен.

В справочнике Контрагенты, вдобавок к стандартным реквизитам Код и Наименование, мы заведем реквизиты ИНН и Адрес.

У справочника Склады реквизитов создавать не нужно, нам будет достаточно встроенных реквизитов Код и Наименование.

Теперь создадим регистр Остатки, который будет хранить остатки товаров на каждом складе. Для решения этой задачи он должен иметь два измерения: Товар и Склад, и один ресурс Количество.

Обратите внимание на то, что при указании типа данных для измерения Товар выбирается справочник Номенклатура. Так в простейшем случае настраиваются связи между объектами.

Ниже показано окно для редактирования структуры регистра Остатки и его свойства:

Регистр Продажи создается таким же способом В нем будут два измерения Контрагент и Товар, и один ресурс Сумма. Регистр будет хранить объем продаж за период в разрезе контрагентов и товаров, т е это будет регистр оборотов.

2. Создание документов

Сначала создадим документ ПриходнаяНакладная, который будет регистрировать приход товара и делать движения по регистру Остатки.

У любого документа в системе 1C Предприятие 8 0 есть встроенные реквизиты Дата и Номер Мы создадим дополнительные реквизиты Поставщик и Склад, а также табличную часть Товары с реквизитами Товар и Количество.

Экранную форму документа, в принципе, можно не создавать, она будет сгенерирована автоматически, когда в ней возникнет необходимость. Но иногда такие формы не вполне удобны для ввода и просмотра данных, тогда следует создать экранную форму самостоятельно

Ниже показано окно для редактирования экранной формы документа:

В окне редактирования документа на закладке «Движения» отметьте регистры, по которым он может делать движения Для приходной накладной нужно отметить регистр Остатки, а для расходной накладной — регистры Остатки и Продажи.

Далее создадим алгоритм проведения приходной накладной, при котором в регистре Остатки будет увеличиваться количество товаров Воспользуемся для этого конструктором движений.

В правой части отображаются реквизиты документа и его табличных частей, в нижней части измерения и ресурсы регистра По нажатии кнопки «Заполнить выражения» соответствие между ними будет установлено автоматически. После нажатия на кнопку «ОК» конструктор движений сгенерирует текст программы на встроенном языке

Документ РасходнаяНакладная создается аналогичным образом, за исключением того, что он делает движения типа «расход» по регистру Остатки и добавляет записи в регистр оборотов Продажи.

Алгоритм проведения документа формируется автоматически конструктором, который мы уже использовали выше, но на этот раз покажем, как выглядит программа на встроенном языке:

Заметьте, что все конструкции записаны на русском языке, но их также можно записывать и на английском.

3. Создание отчетов

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

Отчет Остатки показывает текущие остатки товаров на каждом складе. Этот отчет может быть легко создан конструктором выходных форм.

На первой закладке необходимо выбрать поля из регистра накопления Остатки. На последней закладке можно указать имя выходной формы, имя кнопки и другие параметры. После нажатия кнопки «ОK», будет сгенерирована экранная форма и программа на встроенном языке.

Теперь создадим отчет АнализПродаж, который будет брать данные из регистра Продажи и показывать их в виде сводной таблицы. Это очень хороший способ представления многомерных данных, причем пользователь сможет самостоятельно изменить структуру сводной таблицы: включить и выключить измерения и ресурсы, изменить их порядок.

Создадим экранную форму отчета, разместим в ней элемент управления ПолеТабличногоДокумента, в который вставим сводную таблицу:

IMG

Далее перейдем на закладку «Модуль», сформируем текст запроса с использованием конструктора и напишем несколько строк программы на встроенном языке:

IMG

В результате данные из регистра будут выбраны с помощью запроса и помещены в сводную таблицу.

4. Создание интерфейса

Осталось сделать самую малость — создать главное меню программы. Создадим интерфейс Основной, для чего воспользуемся конструктором меню.

Здесь же можно создать и главную панель инструментов. Для этого необходимо нарисовать или где-нибудь взять уже готовый набор пиктограмм для кнопок.

В свойствах конфигурации необходимо установить этот интерфейс в качестве основного, тогда он будет использоваться по умолчанию при запуске конфигурации.

Итак, практически вся конфигурация была создана визуальными средствами. Алгоритмы проведения документов на встроенном языке были сформированы конструкторами. Единственное, что пришлось запрограммировать самостоятельно, это всего несколько строчек на встроенном языке в отчете АнализПродаж, причем запрос тоже был составлен с помощью конструктора.

5. Проверка работоспособности

Ниже приведены основные экранные формы получившегося прикладного решения.

Сначала введем данные в справочники: заведем несколько товаров, контрагентов и складов. Например, ниже показана форма справочника Номенклатура":

IMG

Затем заполним и проведем несколько приходных и расходных накладных. Мы помним, что при проведении они делают движения по регистрам.

Для примера приведем форму расходной накладной:

IMG

На основе информации из регистров можно сформировать отчеты. Ниже показан сформированный отчет Остатки:

IMG

Обратите внимание на отчет АнализПродаж. С помощью окна «Поля сводной таблицы» можно включить и выключить показ измерений и ресурсов. Можно легко изменить структуру отчета, перетащив мышкой измерения отчета:

IMG

Таким образом, время создания данной конфигурации не превышает часа, а полезность получившегося решения очевидна. Буквально за несколько минут была создана простая автоматизированная система, пригодная для учета движений товаров и анализа продаж. Обратите внимание, что пришлось запрограммировать всего несколько строчек отчета АнализПродаж, да и то запрос был составлен в конструкторе запросов, а технология контекстной подсказки ускорила время написания программы до нескольких секунд.


Обьекты конфигурации

Объекты конфигурации

Для успешной разработки и модификации прикладных решений специалист должен иметь представление обо всех доступных ему объектах и механизмах. Система "1С:Предприятие 8.0" предоставляет в распоряжение разработчику следующие объекты конфигурации:

Константы

В константах хранятся редко изменяемые значения, например, название организации, ИНН, ФИО руководителя и т.д.

Справочники

В справочниках содержится условно-постоянная списковая информация, например, список товаров, список сотрудников. Такие сведения обычно характеризуются кодом и наименованием.

Документы

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

Журналы документов

Журналы — это средство группировки связанных по смыслу документов, например, журнал Склад объединяет приходные и расходные накладные. Аналогично могут быть созданы журналы Банк, Кадры и т.д.

Нумераторы

Нумераторы предназначены для единой (сквозной) нумерации документов нескольких видов. Например, нумератор Кадровый используется для присвоения номеров всем кадровым приказам.

Последовательности

Предназначены для обеспечения правильной последовательности проведения документов с учетом возможных исправлений «задним числом», например, последовательность ПартионныйУчет.

Планы видов характеристик

Предназначены для хранения дополнительных видов характеристик объектов, например, дополнительных свойств товаров (вес, цвет, размер). Новые виды характеристик можно вводить в режиме «Предприятие». Через этот объект также реализован механизм аналитического учета по субконто в бухгалтерском учете.

Регистры сведений

Предназначены для хранения любой информации об объектах в разрезе заданных измерений, например, регистр сведений ЦеныТоваров. Если требуется хранить историю изменения информации, то регистр сведений делается периодическим, например, регистр КурсыВалют.

Регистры накопления

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

Планы счетов

Содержат список счетов бухгалтерского или управленческого учета, например, планы счетов Стандартный, Управленческий, ПланСААР.

Регистры бухгалтерии

Хранят записи (проводки) основанные на определенном плане счетов, например, регистр бухгалтерии Управленческий.

Планы видов расчета

Содержат виды расчета, объединенные по сходным признакам, к которым относятся одинаковые базовые виды расчета, одинаковые правила перерасчета, общие правила вытеснения по времени. В качестве примера можно привести планы видов расчета ОсновныеНачисления, Налоги.

Регистры расчета

Предназначены для хранения учетных записей сложных периодических расчетов, например, регистр расчета

Удержания. Каждый регистр расчета основан на каком-либо плане видов расчета.

Перечисления

Перечисление — это набор значений, заданный еще на этапе разработки прикладного решения, он не редактируется в режиме «Предприятие». Главное, что стоит понять, сама конфигурация рассчитана на определенные перечисления, например, на перечисление ТипКлиента со значениями Обычный и ОченьВажнаяПерсона. Для VIP-клиентов в программе может быть предусмотрена скидка.

Отчеты

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

Обработки

Производят некоторую обработку информации, содержащейся в базе данных, например, обработка РасчетНачислений, ЗакрытиеПериода. Ниже дано краткое описание остальных объектов конфигурации, располагающихся в ветви «Общие» дерева конфигурации:

Подсистемы

Предназначены для группировки других объектов конфигурации, например, подсистемы Кадры, Торговля, Марке-

тинг. Каждый объект может входить сразу в несколько подсистем. Подсистемы могут быть подчиненными друг другу.

Общие модули

Содержат процедуры и функции, используемые в других программных модулях, например, общий модуль РегламентныеПроцедуры.

Интерфейсы

Представляют собой совокупность панелей интерфейса: меню и панели инструментов, например, интерфейсы Бухгалтер, Руководитель.

Роли

Предназначены для определения прав пользователей, работающих с информационной базой, например, роли Кадровик, Администратор. Каждый пользователь может иметь несколько ролей.

Критерии отбора

Нужны для отбора данных по определенному признаку. Например, по критерию отбора Контрагент можно выбрать все документы, относящиеся к заданному контрагенту.

Общие формы

Общие экранные формы не принадлежат конкретному объекту, а относятся к конфигурации в целом. Они могут использоваться в разных местах программы, например, форма ВводАдреса.

Общие макеты

Общие макеты (шаблоны печатных форм) также не принадлежат конкретному объекту конфигурации, например, макет РеестрДокументов. Они используются в других программных модулях.

Общие картинки

Картинки, используемые на кнопках, формах и других интерфейсных объектах. Картинки можно рисовать с помощью редактора картинок.

Стили

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

Языки

Языки интерфейса конфигурации, например, Русский, Английский, Украинский. В 1С:Предприятии 8.0 можно разрабатывать многоязычные конфигурации, рассчитанные на работу пользователей, говорящих на разных языках. Поведение объектов конфигурации определяется с помощью установленных свойств и программы на встроенном языке. Например, на встроенном языке задаются действия документа при его проведении, алгоритм формирования печатной формы отчета, процедура определения цены продажи со скидкой и т.д.

Разработчик пишет текст программы в строго определенных точках конфигурации — программных модулях, например, в модуле формы документа ПриходнаяНакладная или в модуле отчета ОстаткиТоваров. Различные типы программных модулей будут рассмотрены в главе «Встроенный язык», а сейчас мы познакомимся с основными инструментами разработки системы 1С Предприятия 8.0.


Инструменты разработки

Разработка прикладного решения производится в специальном режиме «Конфигуратор». Именно в нем определяется структура прикладного решения, настраиваются взаимосвязи между объектами путем установки их свойств, проектируются макеты отчетов и экранные формы, пишутся программные модули на встроенном языке. В режиме «Предприятие» пользователь не может поменять структуру конфигурации, он занимается вводом данных и их обработкой, например, рассчитывает зарплату, учитывает товары, формирует отчеты и т.д.

Ниже будут последовательно описаны основные инструменты разработки, доступные в Конфигураторе.

Дерево конфигурации

Дерево конфигурации представляет собой иерархический список всех объектов конфигурации. Раскрыв любую ветвь дерева, можно получить список объектов данного вида, например, список справочников. Если затем раскрыть любой справочник, то увидим его структуру и подчиненные объекты — формы, макеты и т.д.

Ниже на рисунке показано дерево конфигурации и рядом раскрытая ветвь справочника Номенклатура:

Дерево конфигурации позволяет создавать и удалять объекты конфигурации, менять их порядок, копировать и переносить объекты, фильтровать объекты по подсистемам.

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

Палитра свойств

Важный инструмент разработчика — это палитра свойств текущего объекта. Состав свойств динамически меняется в зависимости от того, на каком объекте установлен курсор. Свойства есть у всей конфигурации в целом, у каждого объекта конфигурации или его части, а также экранной формы, элементов управления и т.д. В свойствах настраиваются основные характеристики объекта, его внешний вид и некоторые аспекты поведения. Например, ниже показаны основные свойства справочника Номенклатура:

Конструкторы

Для ускорения разработки система 1С:Предприятие 8.0 включает несколько конструкторов, которые в диалоговом режиме уточняют у разработчика условия задачи и автоматически создают объекты конфигурации, формы, макеты, генерируют текст программы на встроенном языке.

В "1C:Предприятии 8.0" существуют следующие конструкторы:

Конструктор запросов

Создает текст запроса на специализированном языке запросов, который отличается от встроенного языка по назначению и синтаксису. Запросы предназначены для выборки данных из информационной базы и ее обработки.

Конструктор печати

Формирует процедуру и макет для печати информации об объектах, например, списка элементов справочника и сведений об одном элементе.

Конструктор выходной формы

Позволяет сформировать более сложную выборку данных и макет для ее печати. Фактически является конструктором запросов с дополнительной закладкой «Выходная форма»

Конструктор форм

Вызывается для новых экранных форм, автоматически размещает элементы управления и настраивает их связи с данными объекта.

Конструктор ввода на основании

Предназначен для автоматического формирования алгоритма ввода одного объекта на основании другого, например, ввода расходной накладной на основании заказа покупателя. При вводе на основании часть реквизитов и табличных частей нового объекта можно заполнить, взяв их из объекта-основания, например, это могут быть реквизит Контрагент и табличная часть Товары.

Конструктор движений документа

Формирует текст программы для документов, изменяющих состояние регистров.

Конструктор меню

Автоматически создает главное пользовательское меню конфигурации на основе списка всех объектов конфигурации.

Конструктор для элементов управления

Размещает элементы управления в форме и настраивает их основные свойства.

Конструкторы объектов конфигурации

Строго говоря, окна редактирования объектов конфигурации (справочников, документов...) тоже выполнены в виде конструкторов. Свойства объекта распределены по закладкам так, чтобы подсказать разработчику правильный порядок создания объекта.

Использование конструкторов облегчает выполнение типичных действий и упрощает освоение системы начинающими разработчиками Но нельзя полагаться только на конструкторы! Нужно понимать, какие именно действия делает каждый конструктор, чтобы при необходимости произвести их вручную.

Редактор экранных форм

Для разработки экранных форм в 1С:Предприятии 8.0 существует мощный редактор форм, имеющий богатый набор элементов управления и сервисных функций, включая выравнивание элементов, редактирование привязок, палитру свойств элементов управления и др. Ниже показана форма документа в режиме Конфигуратора:

В форме могут размещаться различные элементы управления, например, кнопка, надпись, поле ввода, табличное поле, командная

панель, флажок и др. Полный список элементов управления приведен в главе «Интерфейс пользователя».

Редактор интерфейсов

Система "1C Предприятие 8.0" имеет средства для создания главного меню и панелей инструментов конфигурации. Для каждого пункта меню (или кнопки панели инструментов) определяются свойства и выполняемое действие. Действие может быть как стандартное, например, «открыть форму списка справочника Контрагенты», так и вызов процедуры. В процедуре же на встроенном языке можно запрограммировать практически любое возможное действие. Ниже показано редактирование подменю «Справочники» главного меню.

Табличный редактор

Для редактирования макетов печатных форм предназначен табличный редактор, имеющий мощные средства форматирования ячеек, областей и всего табличного документа в целом. Ниже показан макет документа РасходнаяНакладная:

Макет может иметь именованные вертикальные и горизонтальные области. Кроме того, имя можно присвоить любой прямоугольной области.

В ячейках табличного документа содержится текст и параметры. Вместо параметров при формировании итоговой печатной формы будут подставлены конкретные значения, что определяется алгоритмом формирования отчета (программой на встроенном языке).

В табличном документе могут располагаться сводные таблицы, диаграммы, а также элементы управления. Сводная таблица позволяет отобразить многомерные данные в виде кросс-отчетов, изменить порядок измерений без повторного выполнения запроса, включить и выключить отображение измерений и ресурсов. Таким образом, сводная таблица — очень полезный инструмент для анализа информации.

Например, ниже приведена сводная таблица для анализа объема продаж по группам контрагентов и номенклатуры:

IMG

Источником данных для сводной таблицы является результат запроса или специальный объект — построитель отчета. Это новый объект "1С:Предприятия 8.0", предназначенный для ускоренной разработки сложных многомерных отчетов. Он имеет средства визуальной настройки выводимых полей, условий отбора и сортировки.

Все это позволяет в кратчайшие сроки конструировать довольно сложные отчеты. От разработчика требуются только минимальные усилия — составить текст запроса, который, кстати, может быть сформирован с помощью конструктора запроса.

Встроенный язык

Программные модули на встроенном языке системы "1CПредприятия 8.0" определяют многие действия объектов конфигурации. Сами объекты конфигурации создаются визуальными средствами, а встроенный язык используется для реализации различных алгоритмов расчета, формирования печатных форм и выполнения других действий.

Например, при разработке документа его структура, экранная форма и макет печатной формы создаются в конструкторах или визуальных редакторах, а на встроенном языке пишется алгоритм расчета скидки клиента, рассчитывается итоговая сумма документа, заполняется печатная форма документа, делаются движения по регистрам.

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

Выборка = Справочники.Сотрудники.Выбрать ();

    Пока Выборка.Следующий() Цикл

        Если Выборка.Оклад > 10000 Тогда

        Сообщить(Выборка.Наименование + " имеет оклад " + Выборка.Оклад);

        КонецЕсли;

    КонецЦикла;

Редактор программных модулей

Для написания программных модулей разработчик обычно использует встроенный текстовый редактор. Этот редактор может быть использован и для написания любых других текстов, например, запросов.

В режиме редактирования программного модуля текстовый редактор поддерживает цветовое выделение синтаксических конструкций и комментариев, а также технологию контекстной подсказки:

С помощью контекстной подсказки можно быстро узнать список свойств и методов объекта. Необходимо учитывать, что область применения контекстной подсказки ограничена: она работает не для всех объектов и не во всех случаях. В перспективе эта технология будет развиваться.

Редактор программных модулей поддерживает группировку(свертку) синтаксических конструкций языка, таких как процедуры и функции, условия, циклы, описания процедур и функций в виде комментариев.

Другой механизм — шаблоны — позволяет ускорить ввод часто используемых конструкций, например, Если...КонецЕсли, Цикл...КонецЦикла и т.д.

Синтакс-помощник

При программировании часто возникает потребность вспомнить имя свойства или метода, а также параметры методов и возвращаемые значения функций. Эта информация содержится в Синтакс-помощнике, который можно вызвать по Ctrl-Fl или через контекстное меню.

Закладка «Индекс» позволяет искать по ключевому слову среди всех разделов Синтакс-помощника При переходе на конкретный раздел по гиперссылке или при поиске, чтобы найти ее в дереве, воспользуйтесь кнопкой " ". Конструкции из Синтакс-помощника можно перетаскивать мышью прямо в текст модуля.

Отладчик

Часто обнаруживается, что программа работает не так, как было задумано разработчиком, или не так, как ожидали пользователи. Такая ситуация характеризуется как ошибка. Чтобы ее исправить, необходимо сначала ее локализовать, т е определить то место в программе, которое является причиной ошибки. Для решения этой задачи удобно использовать Отладчик.

Отладчик позволяет расставить точки останова (breakpoint) по тексту программы, узнать значение любой переменной или свойства объекта, просто наведя на него курсор мыши, вычислить выражение, а также включить выражение в табло для постоянного отслеживания его значения. Отладчик умеет показывать список всех свойств объекта с указанием их значения и типа, что очень удобно для анализа.

Ниже показаны свойства объекта Движение в процессе отладки:

IMG

Замер производительности

С помощью специального режима замера производительности можно измерить время выполнения фрагмента программы, чтобы обнаружить «узкие места» в программе, т.е. выявить те действия, на которые тратится наибольшее количество времени. Такие места следует написать более тщательно, оптимизировав их или даже изменив структуру конфигурации.

Механизм запросов

Система "1С:Предприятие 8.0" поддерживает мощный механизм запросов, предназначенный для выборки информации из базы данных и ее обработки.

Язык запросов претерпел значительные изменения по сравнению с версией 7.7 и стал больше походить на стандартный SQL. В частности, в нем поддерживаются соединение таблиц, объединение результатов нескольких запросов, вложенные запросы.

Например, следующий простой запрос выбирает товары из справочника Номенклатура с ценой больше определенного предела:

ВЫБРАТЬ Наименование, ЗакупочнаяЦена

ИЗ Справочник.Номенклатура

ГДЕ ЗакупочнаяЦена > 1300

Более того, язык запросов 1С:Предприятия 8.0 содержит средства, не имеющие аналогов в стандартном SQL, например, разыменование ссылочных полей (обращение к свойствам объектов через точку), подсчет итогов и др.

Обратите внимание, что механизм запросов в 1C:Предприятии 8.0 применяется только для выборки данных, с его помощью нельзя изменить данные. Для изменения данных средствами встроенного языка необходимо получить специальный объект, позволяющий модифицировать данные в базе данных (например, Документ-Объект).

Сравнение и объединение конфигураций

В 1С:Предприятии 8.0, как и в версии 7.7, существует возможность детально сравнить две конфигурации и объединить их. При этом можно отметить объекты, подлежащие объединению, и настроить правила объединения.

Настройка правил объединения производится в следующем окне.

Объединение полезно также в том случае, когда одну конфигурацию изменяли несколько человек и им требуется объединить результаты своей работы Заметим, что для периодического сравнения и объединения результатов работы нескольких разработчиков можно создать хранилище конфигурации, которое описано ниже.

Средства групповой разработки

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

Чтобы внести изменения в какой нибудь объект конфигурации, каждый разработчик должен сначала захватить данный объект или группу связанных объектов. При этом они становятся недоступны для изменения другим разработчикам. После внесения изменений разработчик возвращает объекты в хранилище и снимает свои блокировки (отменяет захват).


Инструменты разработки

Поставка и поддержка конфигурации

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

Разработчики конфигураций при выпуске новых редакций или версий подготавливают файлы поставки. Различают полную поставку и поставку обновлений. Полная поставка представляет собой файл конфигурации с расширением «cf», сформированный специальным образом, а обновления распространяются в файлах с расширением "cfu".

До формирования файла поставки и обновлений можно настроить правила поставки для каждого объекта конфигурации, что производится в следующем окне

Используя файл поставки или обновления, пользователь может легко обновить свою конфигурацию. Чтобы его собственные изменения не были потеряны, производится детальное сравнение и объединение конфигураций пользователя и поставщика.


Справочная система

Система 1С:Предприятие 8.0 имеет средства для создания справочной системы по конфигурации в HTML-формате. Пользователь не видит строгой границы между системной справкой 1С:Предприятия 8.0 и справкой по конфигурации.

Когда пользователь запускает только что купленную программу, то справочная система должна рассказать ему о том, каковы возможности программы и как правильно начать с ней работать. В любой момент времени пользователь должен иметь возможность получить справку о конкретном объекте программы. Наличие удобной и исчерпывающей справочной системы важно как для тиражных конфигураций, претендующих на коммерческий успех, так и для индивидуальных конфигураций, разработанных для конкретных организаций.


Администрирование

Второй «профессией» Конфигуратора является администрирование, которое включает в себя ведение списка пользователей, настройку прав доступа, резервное копирование информационной базы, мониторинг системных событий и выполнение других действий для поддержания работоспособности системы.

Конфигуратор предоставляет удобные инструменты для администратора информационной базы, к которым относятся следующие:

Список пользователей

Чтобы пользователь имел возможность войти в систему, его необходимо зарегистрировать в списке пользователей, назначить ему интерфейс и доступные роли (см. ниже). Администратор всегда может узнать, кто подключен к информационной базе в данный момент.

Журнал регистрации

Предназначен для регистрации системных событий и действий пользователей. По умолчанию он отключен, так как его ведение требует некоторых дополнительных затрат при работе системы. Чтобы включить его, необходимо выбрать пункт меню «Администрирование -> Настройка журнала регистрации» и указать уровень важности событий, которые будут регистрироваться в журнале.

Тестирование и исправление информационной базы

Проверку необходимо проводить при возникновении подозрений на наличие ошибок в данных, после критических ситуаций, например, отключения электричества, а также периодически для профилактики возникновения неполадок.

Выгрузка и загрузка информационной базы

Эти команды позволяют выгрузить информационную базу в файл и загрузить ее из файла. Архивную копию базы рекомендуется делать каждый день, но в каждом конкретном случае, периодичность архивирования определяется интенсивностью ввода и изменения данных. При использовании файлового варианта работы 1С:Предприятия 8.0 резервную копию можно сделать, просто скопировав файл информационной базы. В клиент-серверном варианте можно воспользоваться встроенными средствами MS SQL Server. Механизм выгрузки и загрузки позволяет переносить информационную базу между файловым и клиент-серверным вариантом.

Настройка прав доступа (роли)

Система 1С:Предприятие 8.0 поддерживает механизм ролей пользователей, являющийся важным элементом в системе контроля доступа. Роль — это совокупность прав доступа к объектам информационной базы. У одного пользователя может быть несколько ролей.

Заметим, что роль является объектом конфигурации и редактируется только в Конфигураторе. При разработке прикладного решения обычно создается несколько ролей, каждая со своим набором прав доступа. Но при внедрении конфигурации в конкретной организации администратор информационной базы может создать новые роли или изменить существующие, отредактировать пользовательские интерфейсы, экранные формы и вообще изменять конфигурацию в соответствии с возникающими потребностями.

Необходимо учитывать, что изменение конфигурации может привести к более трудоемкой процедуре ее обновления, поскольку придется объединять свою конфигурацию с конфигурацией поставщика, чтобы не потерялись внесенные изменения.

Редактирование прав доступа к объекту производится в окне редактирования объекта на закладке «Права» или из окна самой роли:

В 1С:Предприятии 8.0 различают интерактивные действия и действия над объектом базы данных. Например, документ может быть помечен на удаление стандартной кнопкой на командной панели (интерактивное действие), а может использоваться метод УстановитьПометкуУдаления (действие над объектом базы данных средствами встроенного языка).

Администратор или разработчик может настроить права на оба этих действия. Если он запретит интерактивное действие, то запрет не будет распространяться на программное выполнение действий, то есть, например, эти же действия сможет выполнить специальная обработка, которую запускает пользователь. Если запретить второе действие, то никакими путями пользователь не сможет пометить документ на удаление.


Файловый и клиент-серверный варианты работы

Система 1С:Предприятие 8.0 имеет два варианта работы:

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

IMG

• клиент-серверный вариант, когда данные хранятся в базе данных на сервере под управлением Microsoft SQL Server 2000 или выше. Новая версия 1С:Предприятия поддерживает современную трехуровневую архитектуру, при которой клиентская часть не работает напрямую с базой на сервере баз данных, а обращается к серверу 1С:Предприятия 8.0, он же при необходимости обращается к серверу баз данных. Общая схема работы клиент-серверного варианта показана ниже:

IMG

Трехуровневая архитектура «клиент-сервер» позволяет существенно расширить границы масштабируемости прикладных решений. Наличие сервера 1С:Предприятия 8.0 позволяет сосредоточить на нем выполнение наиболее объемных операций обработки данных. Например, при выполнении даже весьма сложных запросов, клиентская часть программы, работающая у пользователя, будет получать только необходимую ей выборку, а вся промежуточная обработка будет выполняться на сервере.

Физически сервер 1C:Предприятия 8.0 и MS SQL Server могут быть установлены как на одном компьютере, так и на разных, что позволяет администратору распределять нагрузку между серверами.

Другим важным аспектом использования трехуровневой архитектуры является удобство администрирования и упорядочивание доступа пользователей к информационной базе.


Взаимодействие с другими приложениями

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

  • Обмен данными через файлы. Это могут быть текстовые и DBF-файлы, а также XML-документы. Табличный документ 1C:Предприятия 8.0 может быть сохранен в формате Microsoft Excel™.

  • Взаимодействие через механизм Automation, при котором 1С:Предприятие 8.0 может выступать как клиент и как сервер, т.е. как управляющее и управляемое приложение.

  • Взаимодействие через СОМ-соединение для обеспечения быстрого и надежного доступа к 1С:Предприятию 8.0 из других программ, поддерживающих данную технологию.

  • Поддержка интернет-технологий: работа с электронной почтой (e-mail), работа с файлами по протоколам HTTP, HTTPS, FTP.

  • Возможность размещения в экранных формах элементов управления ActiveX, написанных на других языках.

  • Технология внешних компонент, позволяющая подключать dll-библиотеки, написанные на других языках специально для 1С:Предприятия.

Эти средства позволяют строить сложные интегрированные решения с участием 1С:Предприятия 8.0.


Важные отличия от версии 7.7

Общие отличия:

  • Встроенный язык версии 8.0 не совместим с языком версии 7.7. При конвертации информационной базы, тексты программных модулей не конвертируются (переносятся в виде комментариев).

  • Платформа теперь не делится на базовые объекты и поставляемые отдельно компоненты (бухгалтерия, оперативный учет, расчет). Все объекты конфигурации включены в стандартную поставку.

  • Разработан механизм поставки и поддержки конфигураций.

  • Разработан новый эргономичный дизайн пользовательского интерфейса, ориентированный на облегчение освоения программ неподготовленными пользователями и обеспечение высокой скорости работы для опытных пользователей, что особенно актуально при массовом вводе информации.

  • В информационной базе всегда хранится две конфигурации: конфигурация базы данных, которая соответствует текущей базе данных (т.е. структуре таблиц), и текущая конфигурация, которую можно редактировать и сохранять без прерывания работы пользователей. Но при обновлении конфигурации базы данных требуется монопольный захват информационной базы.

Разработка:

  • Разработана новая унифицированная объектная модель системы. Добавлены, изменены или удалены некоторые объекты конфигурации, но обеспечивается преемственность с версией 7.7 по части основных понятий.

  • Скорость освоения платформы должна возрасти за счет унифицированной объектной модели системы, так же как и скорость разработки конфигураций. Последнее достигается, например, благодаря новым программным объектам и механизмам.

  • У справочников, документов и других объектов конфигурации поддерживается несколько табличных частей.

  • Расширен набор элементов управления, их свойств и событий. Теперь в форме могут располагаться ActiveX-компоненты.

  • Переработан механизм запросов, ориентированный на обработку экономической информации. Запросы рекомендуется использовать как основное средство извлечения данных.

  • Отладчик включен в Конфигуратор. Он умеет показывать спциальный список свойств объектов с указанием их значений и типов. Есть возможность просмотреть коллекции, например, массивы и таблицы значений.

  • Функциональность внешней компоненты v7plus.dll включена в платформу в виде объектов Почта, СистемнаяИнформация, ИнтернетСоединение, РТРСоединение и т.д. Есть встроенные средства для работы с XML-документами.

Масштабируемость:

  • Ожидается значительное увеличение масштабируемости npикладных решений при правильном использовании механизма платформы, особенно для клиент-серверного варианта работы.

  • В клиент-серверном варианте реализуется трехуровневая архитектура, когда между клиентом и сервером баз данных располагается сервер 1С:Предприятия 8.0. Допускается работа программы на встроенном языке на сервере 1С:Предприятия 8.0.

  • В файловом варианте работы 1C: Предприятия 8.0 информационная база хранится в одном файле, который включает в себя конфигурацию, данные и административную информацию. Конфигурация (база данных) может быть выгружена в сг-файл(аналог md-файла версии 7.7).

  • Введен механизм СОМ-соединения для взаимодействия с другими приложениями, поддерживающими данную технологию.

  • Добавлены средства групповой разработки — хранилище конфигураций с поддержкой истории изменений.


Встроеный язык

Глава 2.

Встроенный язык

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

Конечный пользователь самостоятельно или с помощью профессиональных разработчиков может настроить прикладное решение под свои нужды или разработать свою собственную конфигурацию «с нуля». Средства встроенного языка 1С:Предприятия 8.0 позволяют управлять практически всеми аспектами поведения системы, работать с прикладными объектами, например, справочниками и документами, формировать печатные формы отчетов и выполнять другие самые разнообразные действия.

Важно понимать, что встроенный язык системы 1 (^Предприятие 8.0 не предназначен для написания отдельных выполняемых приложений, а является неотъемлемой частью платформы. Прикладное решение использует механизмы 1С:Предприятия 8.0 и работает только под управлением платформы, оно не может быть использовано самостоятельно, как отдельное приложение.


Программные модули

Программный модуль представляет собой текст на встроенном языке 1С:Предприятия 8.0, расположенный в определенном месте конфигурации.

В соответствии с этим различают следующие виды программных модулей:

Общие модули

Общие модули принадлежат всей конфигурации в целом, но в отличие от модуля приложения (см. ниже) их может быть несколько, например, модули РасчетНалогов, ОбработкаДокументов. Общие модули не могут содержать объявлений переменных, и в них нет раздела основной программы, таким образом, они состоят только из процедур и функций.

Модуль приложения

Это модуль, который относится ко всей конфигурации в целом и может быть только один. Модуль приложения является аналогом глобального модуля в версии 7.7. Он отвечает за пользовательскую сессию (сеанс) работы с 1С:Предприятием 8.0.

Модуль внешнего соединения

Если конфигурация запускается не в режиме клиентской сессии, а через СОМ-соединение, то вместо модуля приложения используется модуль внешнего соединения, который в конфигурации может быть только один.

Модули прикладных объектов

У некоторых прикладных объектов конфигурации могут быть собственные модули, например, модуль документа РасходнаяНакладная, модуль справочника Номенклатура. Не следует их путать с модулями форм этих объектов.

Модули форм

У каждой формы есть модуль, в котором определяется поведение формы и действия, выполняемые из нее, например, открытие других форм.

На следующем рисунке показано расположение всех этих модулей:

IMG

Разделы программного модуля

Любой программный модуль, за исключением общих модулей, состоит из следующих разделов:

  • раздел объявления переменных,

  • раздел процедур и функций,

  • раздел основной программы.

Внимание! У общих модулей есть только раздел процедур и функций.

В разделе объявления переменных определяются локальные переменные модуля и экспортируемые переменные, которые объявляются с ключевым словом Экспорт, например:

//экспортируемые переменные
Перем НачДата Экспорт;
Перем КонДата Экспорт;
Перем мПериодСтрокой; //локальная переменная модуля
//далее идут процедуры и функции
//а затем раздел основной программы

Раздел процедур и функций содержит тела процедур и функций, написанных разработчиком вручную или сформированных конструктором. Некоторые процедуры и функции могут быть объявлены с ключевым словом Экспорт, тогда они дополняют контекст объекта и становятся видимыми вне объекта. Например, ниже приведен модуль документа:

Перем НачДата Экспорт;
Перем КонДата Экспорт;
Перем мПериодСтрокой;
Процедура Печать(ТабДок=Неопределено) Экспорт
//эта процедура будет доступна как метод объекта ДокументОбъект
КонецПроцедуры
Функция ПолучитьГруппировку(РезультатЗапроса, ИмяГруппировки)
//это локальная процедура модуля
КонецФункции

Процедуры и функции рекомендуется отделять комментарием с разделителем. В виде комментариев рекомендуется указывать назначение процедуры или функции, параметры и возвращаемое значение для функций.

В самом конце модуля, после всех процедур или функций, следует раздел основной программы, состоящий из выполняемых операторов. Эти операторы будут исполнены при инициализации модуля, например, для модуля справочника — при создании объекта типа СправочникОбъект, для модуля формы — при создании объекта Форма. Обычно в этом блоке операторов производится инициализация переменных модуля и заполнение полей начальными значениями.


Контекст

Контекст — очень важное понятие при программировании на любом языке. В 1С:Предприятии 8.0 контекст обозначает окружение модуля, т.е. какие ему будут доступны переменные, объекты, свойства, методы и события.

Можно выделить следующие виды контекстов, существующих в 1С:Предприятии 8.0:

Глобальный контекст, доступный во всех остальных контекстах, состоит из следующих частей:

  • свойства, методы и события глобального контекста (например, свойство РабочаяДата),

  • системные перечисления и системные наборы значений (например, КодВозвратаДиалога и Символы).

В контексте модуля приложения (или модуля внешнего соединения) доступны экспортируемые переменные, процедуры и функции общих модулей.

В контексте общего модуля доступны экспортируемые процедуры и функции других общих модулей. В этом контексте недоступны экспортируемые переменные, процедуры и функции модуля приложения.

В контексте модуля прикладного объекта есть доступ к реквизитам и табличным частям объекта, а также его методам и событиям. Например, в модуле документа РасходнаяНакладная доступны реквизиты документа и его табличные части, можно вызывать методы документа и обрабатывать события.

В контексте модуля формы доступны реквизиты формы, а также ее свойства, методы и события. Если у формы назначен основной реквизит, то в модуле формы становятся доступны свойства и методы прикладного объекта, используемого в качестве основного реквизита.

Необходимо помнить правила видимости экспортируемых переменных, процедур и функций различных модулей:

  • В общем модуле недоступны экспортируемые переменные, процедуры и функции модуля приложения (модуля внешнего соединения).

  • В модуле приложения (модуле внешнего соединения) доступны экспортируемые процедуры и функции общих модулей.

  • В общих модулях доступны экспортируемые процедуры и функции других общих модулей.

  • В модулях прикладных объектов и модулях форм доступны экспортируемые переменные, процедуры и функции модуля приложения (модуля внешнего соединения), а также экспортируемые процедуры и функции общих модулей.

  • Если у формы назначен основной реквизит, то контекст модуля формы содержит дополнительные свойства и методы, связанные с основным реквизитом. Например, в модуле формы элемента справочника Номенклатура доступны свойства и методы объекта «СправочникОбъект.Номенклатура».

Схематично взаимосвязь контекстов можно изобразить следующим образом (стрелки обозначают доступность одного контекста для другого):

IMG

Пунктирная стрелка от модулей объектов к модулям форм отражает ситуацию, когда у формы назначен основной реквизит, например, у формы элемента справочника основным реквизитом является объект типа СправочникОбъект. Тогда в модуле формы будут доступны экспортируемые переменные, процедуры и функции модуля объекта.

Контекст может быть дополнен новыми свойствами и методами. Это происходит, если вы объявляете переменную, процедуру или функцию. Если она объявлена с ключевым словом Экспорт, тогда она становится видна вне объекта, иначе она будет доступна только внутри этого модуля.

Ниже схематично изображено возможное взаимодействие модуля формы журнала и модуля документа (стрелка обозначает вызов процедуры):

IMG


Конструкции встроенного языка

Текст программного модуля записывается на встроенном языке с использованием конечного набора конструкций и ключевых слов.

Конструкции встроенного языка могут записываться на русском или английском языке, кроме нескольких слов, для которых нет подходящих русских эквивалентов, например, Null.

Операторы встроенного языка должны разделяться точкой с запятой («;»), но после ключевых слов КонецПроцедуры или КонецФункции точка с запятой не ставится, поскольку это не операторы, а операторные скобки.

Ниже описаны основные конструкции встроенного языка 1C:Предприятия 8.0.

Условия

Конструкция «Если ... Тогда»

Оператор Если предназначен для проверки логических выражений и полностью аналогичен подобным операторам в других языках программирования. Когда результат логического выражения равен Истина, то выполняется блок операторов после ключевого слова Тогда. Оператор Если может иметь ветви ИначеЕсли, а также ветвь Иначе.

Примеры:

//1-й пример
Если Состав.Количество()=0 Тогда
    Предупреждение("Не указано ни одной строки!");
КонецЕсли;

//2-й пример
Eсли Сотр.Категория = Перечисления Категории.Совместитель Тогда
    //обработаем как совместителя
Иначе
    //обычный сотрудник
КонецЕсли;

//3-й пример
Если выбор = 1 Тогда
    Сообщить("Выбран 1-й пункт");
ИначеЕсли выбор = 2 или выбор = 3 Тогда
    Сообщить("Выбран 2-й или 3-й пункт");
Иначе
    Сообщить("Обработка этого пункта не предусмотрена");
КонецЕсли;

Ключевые слова ИначеЕсли, Иначе и КонецЕсли желательно записывать с новой строки. Следующий пример показывает нежелательное форматирование оператора Если:

//так делать не рекомендуется!
Если Состав. Количество () = 0 Тогда ... Иначе ... КонецЕсли;

При таком форматировании нарушается блочная структура программы, не работают группировки конструкций встроенного языка в редакторе модулей, усложняется понимание программы.

Если результат выражения имеет тип «булево» и требуется сравнить его со значением Истина, то следующие конструкции полностью эквивалентны:

Если Выборка.Следующий() = Истина Тогда //так не рекомендуется
Если Выборка.Следующий() Тогда //это рекомендуемый вариант

Логический оператор НЕ позволяет инвертировать результат логического выражения и подобным же образом заменить сравнение со значением Ложь. Следующие конструкции делают одно и то же:

Если ВыбФирма.Пустая() = Ложь Тогда
Если НЕ ВыбФирма.Пустая() Тогда

Конструкция «?(..., ..., ...)»

Данная конструкция позволяет записать условный оператор в одну строку и вычислить его как выражение.

Пример:

   Коментарий = ? (Количество=0, "Пусто", Строка (Количество)+" ш т . ");

Обычно эта конструкция применяется в выражениях и работает как следующая функция:

Функция СокращенноеЕсли(РезультатУсловия,выражение1,выражение2)
    Если РезультатУсловия Тогда //Истина
        Возврат выражение!;
    Иначе //Ложь
        Возврат выражение2;
    КонецЕсли;
КонецФункции

Логические выражения

В операторе Если, конструкциях «?(...)», а также в цикле Пока применяются логические выражения, т.е. такие, результат которых имеет тип «булево» с двумя значениями: Истина и Ложь.

В логических выражениях могут применяться логические сомножители НЕ, И, ИЛИ (в порядке приоритета). Для задания правильного порядка вычисления рекомендуется расставлять скобки, например:

//следующую конструкцию:
Если НЕ Страна = ВыбСтрана ИЛИ Цена > 100 И Цена < 1000 Тогда
//лучше записать так:
Если (НЕ Страна = ВыбСтрана) ИЛИ (Цена > 100 И Цена < 1000) Тогда

В 1C: Предприятии 8.0 введено сокращенное вычисление логических выражений. Это означает, что если по части выражения можно определить конечный результат, тогда остаток логического выражения не вычисляется.

Например:

Если Цена > 10 И Цена < 20 Тогда

При вычислении результата составного логического выражения проверяется первое условие «Цена > 10». Допустим, цена равна 5, тогда первое условие не выполняется (дает значение Ложь) и следующую часть вычислять уже не нужно, поскольку в любом случае результат всего выражения будет Ложь.

Другой пример:

Если Цена = 10 ИЛИ Цена = ПолучитьЦенуСоСкидкой Тогда

Сначала проверяется первое условие «Цена = 10». Допустим, оно выполняется (дает значение Истина), тогда следующую часть условия можно не вычислять, поскольку результат всего выражения будет Истина, независимо от второго условия. Обратите внимание, что в этом случае функция ПолучитьЦенуСоСкидкой не будет вызвана! Если по проектной логике она должна вызываться в любом случае, тогда это следует сделать до условия, а результат запомнить в переменную, например:

ЦенаСоСкидкой = ПолучитьЦенуСоСкидкой();
Если Цена =10 ИЛИ Цена = ЦенаСоСкидкой Тогда

Итак, при сокращенном вычислении логических выражений применяются следующие правила:

  • Если один из сомножителей оператора И равен Ложь, то конечный результат выражения будет Ложь, независимо от значения других сомножителей.

  • Если один из сомножителей оператора ИЛИ равен Истина, то конечный результат выражения будет Истина, независимо от значения других сомножителей.


Циклы

Конструкция «Для ... По ... Цикл»

Цикл «Для...По» применяется для записи циклов с известным числом повторений. Например, следующий цикл 12 раз выведет номер месяца в окно служебных сообщений:

Для Месец = 1 По 12 Цикл
    Сообщить(Месец);
КонецЦикла;

Переменная Месец называется переменной цикла или счетчиком цикла. Не следует изменять значение переменной цикла внутри него. Это нарушает принципы структурного программирования и может привести к трудно обнаруживаемым ошибкам.

Конструкция «Для Каждого ... Из ... Цикл»

В 1С:Предприятии 8.0 была введена новая конструкция «Для Каждого», предназначенная для обхода элементов коллекции. В таких циклах в качестве переменной цикла выступает не число, а объект — элемент коллекции, например, объект СтрокаТаблицыЗначений в следующем примере:

ПустаяСсылка = Справочники.Номенклатура.ПустаяСсылка();
    Для Каждого СтрокаТЗ Из тзСостав Цикл
        //тело цикла
    Если СтрокаТЗ.Товар = ПустаяСсылка Тогда
        Продолжить; //возьмем следующую строку
    Иначе
        Если СтрокаТЗ.Товар = ВыбТовар Тогда
            Прервать; //досрочный выход из цикла
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Обратите внимание, что внутри цикла нет никакой переменной, содержащей порядковый номер или индекс элемента коллекции. Если это необходимо, то можно добавить переменную, которая будет увеличиваться внутри цикла, например:

Н = 0;
Для Каждого СтрокаТЗ Из тзСостав Цикл
    Н = Н + 1 ;
    //действия
КонецЦикла;

Для некоторых коллекций по элементу можно определить его индекс:

Для Каждого СтрокаТЗ Из тзСостав Цикл
    ИндексСтроки = тзСостав.Индекс(СтрокаТЗ);
КонецЦикла;

Если элемент не принадлежит данной коллекции, то метод Индекс возвращает -1 (минус единицу).

Конструкция «Пока ... Цикл»

Ключевое слово Пока предназначено для реализации циклов с неизвестным числом повторений. Цикл выполняется до тех пор, пока логическое выражение истинно. Если на очередном витке Цикла оно перестает выполняться (дает значение Ложь), то цикл прекращается. Ниже показан пример реализации цикла Пока:

Н = 0;
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.ПометкаУдаления Тогда
        Продолжить; //возьмем следующий элемент
    КонецЕсли;
    Н = Н + 1;
    Если Н > 10 Тогда
        Прервать; //досрочный выход из цикла
    КонецЕсли;
    Сообщить("Товар: " + Выборка.Наименование);
КонецЦикла;


Беусловные переходы

Безусловные переходы

Иногда необходимо принудительно передать управление в определенную точку программы. Это реализуется с помощью метки и оператора Перейти. Метка может быть у любого исполняемого оператора. Она начинается со знака тильды («~»), далее идет имя метки, а затем двоеточие («:»), например:

Н = 0;
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    Н = Н + 1;
    Если Н <= 10 Тогда
        //пропускаем первые 10 элементов справочника
        Перейти ~след;
    КонецЕсли;
    Сообщить(Выборка.Наименование);
    ~след:
    //возьмем следующий элемент
КонецЦикла;

С помощью оператора Перейти можно передавать управление в пределах процедуры/функции или в пределах раздела основной программы модуля. Заметьте, что этим способом нельзя выйти из процедуры или функции.

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


Обработка исключений

Конструкция «Попытка...Исключение»

Обработка исключений предназначена для перехвата ошибок (исключительных ситуаций), возникающих в процессе работы программы. Если возникла ошибка, и она не была перехвачена, то выдается системное сообщение об ошибке, и выполнение модуля прерывается.

Однако разработчик может перехватывать возникающие ошибки и обрабатывать их по своему усмотрению, например:

Попытка
    СредняяЦена = СуммаВсего / Количество;
Исключение
    //Возникла ошибка деления на ноль.
    //Будем считать, что количество равно 1.
    Количество = 1;
    СредняяЦена = СуммаВсего;
КонецПопытки;

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

В следующем примере производится попытка записать файл, и если возникнет ошибка, то она будет перехвачена обработчиком исключений:

Попытка
    ТекстФайл.Записать(ПутьКФайлу);
Исключение
    Сообщить("Не удалось записать файл!");
КонецПопытки;

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

Кроме того, есть команда ВызватьИсключение, которая может применяться только внутри блока обработки исключения. Хотя программист и обработал ошибку, но он может ее пропустить (передать обработчику вышестоящего уровня), например, если она неисправима:

Попытка
        СредняяЦена = СуммаВсего / Количество;
    Исключение
        Сообщить("Эх! Надо было проверить количество на ноль!");
        Сообщить(ОписаниеОшибки());
        ЗаписьЖурналаРегистрации(ОписаниеОшибки());
        //хотя мы и обработали ошибку, но программу все равно прервем
    ВызватьИсключение;
КонецПопытки;

Обработчики исключений могут быть вложенными друг в друга. Если ошибка не обработана во внутреннем блоке Исключение...КонецПопытки, тогда она обрабатывается внешним обработчиком, а если его нет, выдается системное сообщение об ошибке.


Процедуры и функции

Процедуры и функции являются блоками программы, которые можно вызвать по имени из другого места, например, из другой процедуры. Процедуры и функции могут иметь параметры, которые говорят о том, какие именно действия и с какими объектами она должна сделать. Функции отличаются от процедур только тем, что имеют возвращаемое значение.

Ниже показана процедура Печать, функция ЕстьПравоИсполъзования и процедура КнопкаПечатъНажатие, которая вызывается при нажатии на кнопку «Печать»:

Процедура Печать(ТабДок)
    Макет = ПолучитьМакет("Основной");
    ТабДок.Вывести(Макет.ПолучитьОбласть("Бланк"));
КонецПроцедуры
Функция ЕстьПравоИспольэования(ИмяОтчета)
    //возвращаемое значение функции
    Возврат ПравоДоступа("Использование", Отчеты[ИмяОтчета]);
КонецФункции
Процедура КнопкаПечатьНажатие(Элемент)
    Если НЕ ЕстьПравоИспользования(ИмяОтчета) Тогда
        Возврат; //досрочный выход из процедуры
    КонецЕсли
    ТабДок = Новый ТабличныйДокумент;
    Печать(ТабДок); //вызов процедуры Печать
    ТабДок.Показать();
КонецПроцедуры

Параметры у процедуры и функции могут быть необязательными. Тогда их можно будет опускать при вызове. Для необязательных параметров должно быть указано значение по умолчанию, например:

//следующая процедура принимает табличный документ,
//а если ничего не передано,
//то она его создает и показывает на экране
Процедура Печать(ТабДок = Неопределено) Экспорт
    Если ТабДок = Неопределено Тогда
        ТабДок = Новый ТабличныйДокумент;
        флПоказывать = Истина;
    Иначе
        флПоказывать = Ложь;
    КонецЕсли;
    Макет = ПолучитьМакет("Основной");
    ТабДок.Вывести(Макет.ПолучитьОбласть("Бланк"));
    Если флПоказывать Тогда
        ТабДок.Показать();
    КонецЕсли;
КонецПроцедуры

Замечание.

В 1С:Предприятии 8.0 порядок следования процедур и функций в модуле не важен. Это означает, что процедура может располагаться ниже места ее вызова, т.е. предварительное объявление процедур и функции не требуется (в версии 7.7 для этого использовалось ключевое слово Далее).

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

Параметры процедуры или функции по умолчанию передаются по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции приведет к изменению фактического параметра в том месте, где она вызывается. Чтобы гарантированно передать параметр по значению, нужно перед именем параметра вставить ключевое слово Знач.


Инструкции препроцессора

В 1С:Предприятии 8.0 были введены несколько предопределенных инструкций для препроцессора, которые говорят о том, где должен исполняться тот или иной фрагмент программы.

К инструкциям препроцессора относятся:

Инструкция | Описание
#Если Клиент Тогда #КонецЕсли | Выполнение фрагмента модуля на клиентской машине
#Если Сервер Тогда #КонецЕсли | Выполнение фрагмента модуля на сервере 1С:Предприятие8.0
#Если ВнешнееСоединение Тогда #КонецЕсли | Эта инструкция позволяет возможность использования процедур и функций в сесии СОМ-соединения

Место выполнения общего программного модуля также может регулироваться установкой его свойств. Подробнее об инструкциях препроцессора и свойствах общих модулей написано в документации.


Типы данных

Во встроенном языке 1С:Предприятия 8.0 поддерживаются следующие основные типы данных:

  • • число

  • • строка

  • • дата (включает в себя время)

  • • булево (имеет два значения: Истина и Ложь)

  • • значение Неопределено

  • • значение Null (для неуказанных значений в таблицах базы данных)

  • • Тип (значения специального типа «Тип» нужны для представления и сравнения типов данных, например, «Если ТипЗнч(ВыбДок) = Тип("ДокументСсылка.Чек") Тогда...»).

  • • другие типы, перечисленные в документации

Объявление переменных

В переменных хранится промежуточная информация, необходимая для работы программы. Переменные обычно создаются автоматически при первом присвоении им значения, но можно объявлять их явно с помощью ключевого слова Перем.

Тип переменной определяется по значению, которое она содержит. При помещении в переменную значения другого типа меняется и тип переменной, т.е. в языке поддерживается мягкая типизация.

Если переменную модуля объявить с ключевым словом Экспорт, то она будет видна вне модуля. Экспортируемые переменные модуля приложения называются глобальными переменными, потому что они доступны в любом месте программы (кроме общих модулей). Чем меньше в вашей программе будет глобальных переменных, тем лучше.

Примеры:

//явное объявление переменной модуля или процедуры или функции
Перем Итог;
//экспортируемая переменная модуля
Перем Количество Экспорт;
//неявное объявление переменных (при первом присвоении значения)
ном = 0;

Оператор Новый

Оператор Новый предназначен для создания объектов определенных типов, например, СписокЗначений, Структура и т.д. Заметьте, что данный оператор применяется только для тех типов, для которых допустимо создание новых значений. При объявлении переменных, ссылающихся на прикладные объекты, оператор. Новый не используется.

Ниже показываются различные варианты объявления переменных:

//создание нового объекта типа "Структура"
Отбор - Новый Структура;
//вызов конструктора с параметрами
Отбор = Новый Структура("Контрагент",ВыбКонтрагент);
//получение объекта типа СправочникМенеджер
Спр = Справочники.Контрагенты;

Приведение типов

При программировании часто требуется преобразовать значение одного типа в значение другого типа, например, число 10 преобразовать в строку «10».

Приведение типов может быть явное и неявное. Для явного приведения типов существуют следующие функции:

  • • Число(),

  • • Строка(),

  • • Дата(),

  • • Булево().

Неявное приведение типов производится системой автоматически при вычислении выражений. Например, в следующей конструкции значение числовой переменной НомерМесяца неявно преобразуется в строку и присоединяется к другой строке:

"НомерМесяц " + НомерМесяца;

Системные перечисления и наборы значений

В 1С:Предприятии 8.0 для улучшения понятности программ были введены системные перечисления и системные наборы значений.

Например, ниже используется системное перечисление ОриентацияСтраницы и его значение Портрет:

ТаЩок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;

Обратите внимание на изменение параметров и возвращаемого значения функции Вопрос. В версии 7.7 эта функция принимала и возвращала строковые значения, например, «Да» или «Нет», а теперь она принимает параметр типа РежимДиалогаВопрос и возвращает значение системного перечисления КодВозвратаДиалога:

Если Вопрос("Вы уверены?", РежимДиалогаВопрос ,ДаНет) =
    КодВозвратаДиалога.Да Тогда
КонецЕсли

Системные наборы значений аналогичным образом позволяют упрощать написание программы, но в отличие от системных перечислений, они не образуют типа. Например, некоторые часто используемые спецсимволы были собраны в системный набор значений Символы, в котором содержатся следующие значения:

  • • ПС — перевод строки (помещение курсора на следующую строку),

  • • ВК - возврат каретки (помещение курсора в начало строки),

  • • Таб — символ табуляции,

  • • ПФ — перевод формы (страницы),

  • • ВТаб — вертикальная табуляция,

  • • НПП — неразрывный пробел.


Редактор программных модулей

Редактирование программных модулей производится в специализированном текстовом редакторе системы 1С:Предприятие 8.0.

Редактор поддерживает цветовое выделение синтаксических конструкций, группировку блоков операторов, шаблоны текста и контекстную подсказку (аналог технологии IntelHSense).

Текстовый редактор может быть использован не только для редактирования текстов программных модулей, но также для написания любых других текстов, например, запросов.

Окно редактора

Окно текстового редактора при редактировании программных модулей выглядит следующим образом:

Цвет фона и текста настраивается в параметрах. Там же можно указать шрифт, автоматический отступ, ширину табуляции и другие параметры.

Синтаксический контроль

По кнопке Ctrl+F7 можно произвести проверку модуля на наличие синтаксических ошибок. Если даже таких ошибок не будет найдено, то это не гарантирует, что программа будет работать правильно, поскольку могут возникать ошибки времени выполнения, которые невозможно обнаружить на этапе синтаксического контроля.

Рекомендуется в параметрах включить автоматическую проверку модуля на синтаксические ошибки, которая будет всегда выполняться при его сохранении. Это позволит раньше обнаружить ошибку, и, следовательно, ее исправление обойдется дешевле.

В 1С:Предприятии 8.0, как и в версии 7.7, есть возможность проверить все программные модули конфигурации на наличие синтаксических ошибок. Для этого нужно выбрать команду в меню «Конфигурация -> Синтаксический контроль модулей».

Поиск и замена текста

Текстовый редактор поддерживает поиск строки по тексту, для

чего существуют следующие кнопки на панели инструментов:

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

С помощью меню «Правка -> Заменить», или по кнопке 2, которую можно сразу поместить на панель инструментов, производится замена одной строки текста на другую. Аналогично глобальному поиску, поддерживается глобальная замена строки по всей конфигурации или только по заданным объектам.

Группировки конструкций языка

Наверное, вы уже заметили, что слева от слова Процедура есть кнопки «развернуть» и «свернуть». Эти кнопки позволяют свернуть блок операторов (в данном случае процедуру) и работать с ним, как с единым целом, например, скопировать, перенести или удалить.

В параметрах можно указать, для каких синтаксических конструкций нужно включить группировку, а также, какие из них отображать свернутыми при открытии модуля:

Синтакс-помощник

При программировании часто возникает потребность вспомнить имя свойства или метода, а также параметры методов и возвращаемые значения функций. Эта информация содержится в Синтакс-помощнике, который можно вызвать по Ctrl-Fl или через контекстное меню.

Контекстная подсказка

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

Например, после написания строки «Документы.» появляется контекстное меню. Набираем первые буквы имени документа — «расх» — и курсор устанавливается на документ Расходная-Накладная:

Остается нажать Enter и имя документа будет подставлено в текст модуля. Затем можно опять ввести точку и появится уже список свойств и методов документа РасходнаяНакладная.

Необходимо учитывать, что область действия контекстной подсказки ограничена: она работает не во всех случаях и не для всех объектов.

Шаблоны

Для ускорения ввода часто используемых конструкций можно использовать шаблоны, например, для блока «Если...КонецЕсли;» или «Процедура.. .КонецПроцедуры».

Список всех шаблонов можно просмотреть в следующем окне:

Шаблоны можно разделить на группы. Двойной щелчок на шаб-

лоне открывает окно для его редактирования. После набора не

скольких символов, заданных в качестве строки замены, можно

нажать Ctrl-Q и активизируется соответствующий шаблон, т.е.

введенная строка будет заменена на текст шаблона.

Закладки по тексту

Текстовый редактор поддерживает механизм закладок по тексту, что позволяет «запомнить» определенную строку в тексте, а потом быстро к ней вернуться.

Механизм закладок по тексту реализуется с помощью следующих кнопок на панели инструментов:

  1. Установить / снять закладку (Alt-F2),

  2. Перейти к следующей закладке (F2),

  3. Перейти к предыдущей закладке (Shift-F2),

  4. Убрать все закладки в тексте.

Разделение и слияние окон

Текстовый редактор позволяет одновременно работать с разными частями модуля. Для этого предназначено горизонтальное и вертикальное разделение окна, которое включается и выключается из меню «Окна». Ниже показано окно, в котором содержится два фрагмента модуля документа:

Другой возможностью управления окнами является их соединение друг с другом. Если перетащить окно с нажатой клавишей Shift, то его можно соединить с другим окном, например, для редактирования модуля отчета и его формы в одном окне. Соединять окна можно горизонтально или вертикально, а также в виде закладок внизу.


Важные отличия от версии 7.7

  • • Разработана новая унифицированная объектная модель встроенного языка 1С:Предприятия 8.0. Переименованы, добавлены или удалены многие объекты, свойства, методы и события. Все это привело к несовместимости с языком версии 7.7, но позволило резко расширить возможности платформы, ускорить ее освоение, повысить понятность программных модулей.

  • • Введены новые литералы и типы данных, например, литералы Неопределено, Null, Истина и Ложь (тип данных «булево»).

  • • Тип «дата» включает в себя время. Для указания пустой даты используется литерал '0001010Г.

  • • Введено сокращенное вычисление логических выражений.

  • • С помощью оператора [...] (квадратные скобки) производится обращение к свойствам объектов по их имени. Таким же образом возможно обращение по индексу или другому параметру к элементам некоторых коллекций.

  • • Введены общие модули, в которых не может быть объявлений переменных модуля и нет блока основной программы. В них есть только раздел процедур и функций. Если процедуру или функцию общего модуля объявить с ключевым словом Экспорт, то она будет доступна в любом месте конфигурации, в том числе в модуле приложения и других общих модулях.

  • • У многих прикладных объектов (например, справочников, документов...) есть собственные модули объектов, которые не следует путать с модулями форм. Экспортируемые процедуры, функции и переменные модуля объекта дополняют контекст объекта при работе с ним извне средствами встроенного языка.

  • • Введен новый тип циклов «Для Каждого» (for each), используемый для обхода элементов коллекций.

  • • Введен оператор Новый, предназначенный для создания новых значений определенных типов. Для обращения к прикладным объектам этот оператор не используется, например, «Спр = Справочники.Контрагенты». Функции СоздатьОбъект больше не существует. »

    •

  • • Новое ключевое слово Выполнить позволяет исполнить программу на встроенному языке, заданную строкой. При этом в ней не может быть процедур и функций. Другое ключевое слово Вычислить позволяет определить значение выражения, заданное строкой.

  • • При вычислении разницы между датами возвращается число секунд между ними.

  • • Введены инструкции препроцессора, задающие место выполнения фрагмента программного модуля. В свойствах общего модуля также можно указать место его выполнения.

  • • Введены системные перечисления и системные наборы значений, дополняющие глобальный контекст.

  • • Теперь нельзя передать контекст, как было раньше, с помощью параметра Контекст. Всегда передается конкретный объект, например, Форма или СправочникОбъект.

  • • Больше нет ключевого слова Далее. Теперь предварительное объявление процедур и функций не требуется, т.е. внутри модуля они могут располагаться в любом порядке.

  • • Текстовый редактор программных модулей поддерживает группировку (свертку) синтаксических конструкций, а также описаний процедур и функций, записанных в виде комментариев.

  • • Введена технология контекстной подсказки, предназначенная для ускорения написания программы и уменьшения количества ошибок.

Изменения во встроенных функциях, свойствах и методах глобального контекста:

  • • Добавлены математические функции Sin, Cos, Tan, ASin, ACos, ATan, Exp, Log (натуральный логарифм), LoglO (десятичный логарифм), Pow (возведение в степень), Sqrt (квадратный корень).

  • • Для получения типа значения используется функция ТипЗнч(), которая возвращает объект специального типа «Тип». Для получения типа по его строковому представлению используется функция Тип().

  • Вместо команды ОткрытьФорму для просмотра значений или объектов (справочников, документов и т.д.) можно применять команду ОткрытьЗначение. Для открытия нужной формы объекта также применяются методы, аналогичные ПолучитьФорму() и метод Открыть() объекта Форма.

  • Доступ к внешним обработкам производится не через ОткрытьФорму, как было в версии 7.7, а через менеджер внешних обработок, который содержится в свойстве ВнешниеОбработки глобального контекста.

  • Расширены возможности форматирования, для чего существуют функции Формат, НСтр, ПредставлениеПериода.

  • Добавлены или изменены события ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы и ПриЗавершенииРаботыСистемы. Добавлены процедуры ПрекратитьРаботуСистемы и ЗаблокироватьРаботуПользователя.

  • Функции КаталогИБ и КаталогПользователя удалены, поскольку теперь эти каталоги существуют не всегда.

  • Изменена функция ПравоДоступа и введена новая функция РольДоступна.

  • Функция ЗаголовокСистемы заменена на функции УстановитьЗаголовокСистемы и ПолучитьЗаголовокСистемы.

  • Приемы работы с монопольным режимом изменились. Введена функция МонопольныйРежим и процедура УстановитьМонопольныйРежим.

  • Для работы с объектами, помеченными на удаление, существуют процедуры и функции НайтиПомеченныеНаУдаление, НайтиПоСсьлкам, УдалитьОбъекты.

  • Вместо функции ОбработкаОжидания введены функции ПодключитьОбработчикОжидания и ОтключитьОбработчикОжидания.

  • Для работы со справочной системой по конфигурации введены новые функции ОткрытьСправку, ОткрытьСодержаниеСправки, ОткрытьИндексСправки.

    •

  • Функция РабочаяДата() заменена на свойство глобального контекста РабочаяДата, которое доступно для записи в случае, если свойство ИспользованиеРабочейДаты имеет значение РежимРабочейДаты.Назначать.

  • Функции ПустоеЗначение больше не существует.

  • Функции ДатаЧисло, ДатаМесяц, ДатаГод заменены на День, Месяц, Год. Так как значения типа «дата» включают в себя время, то добавлены аналогичные функции для извлечения времени из даты: Час, Минута, Секунда.


Глава 3.

Основные объекты конфигурации

В данной главе будут рассмотрены основные объекты конфигурации, без которых не обходится практически ни одно прикладное решение на платформе 1С:Предприятие 8.0. К таким объектам можно отнести:

  • • константы,

  • • справочники,

  • • документы и журналы документов,

  • • перечисления,

  • • отчеты и обработки.

Регистры сведений и регистры накопления, механизмы бухгалтерского учета и сложных периодических расчетов будут рассмотрены в отдельных главах этой книги:

  • • регистры сведений описаны в главе 8;

  • • регистры накопления описаны в главе 9;

  • • планы счетов и регистры бухгалтерии кратко описаны в главе 10;

  • • планы видов расчета и регистры расчета освещаются в главе 11.

Многие объекты конфигурации были реализованы еще в прежней версии 7.7 и перешли в версию 8.0 со значительными изменениями и улучшениями.

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

Ниже последовательно разбираются приемы работы с основными объектами конфигурации, и начнем мы с самых простых — констант.


Константы

Константы нужны для хранения одного значения в базе данных. Обычно в константах хранится редко изменяемая информация, например, название организации, фамилия руководителя, основная валюта организации, параметры конфигурации в целом и т.д.

В Конфигураторе список констант выглядит следующим образом:

Для каждой константы нужно обязательно указать ее имя и тип данных. Кроме того, желательно указывать синоним, комментарий и перечень подсистем, в которые она входит. Все это делается в окне свойств:

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

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

Обратите внимание, что приведенная форма констант является общей формой, но с таким же успехом можно было разместить поле для доступа к константе в любой другой форме, так как в 1С:Предприятии 8.0 экранные формы и объекты конфигурации разделены. Для данной экранной формы свойство ТипЗначения установлено в значение КонстантыНабор и установлен флажок «Использовать все константы».

Замечание. По сравнению с предыдущей версией 7.7 в 1С:Предприятии 8.0 больше не существует системной формы для редактирования всех констант единым списком, так как такое решение было признано недостаточно гибким. Нельзя было распределить все константы по группам, или, например, полностью скрыть некоторые константы от пользователя, чтобы он даже не догадывался об их существовании. Если все же, несмотря на эти недостатки, прежняя форма констант вас вполне устраивала, то вполне возможно создать такую же на платформе 8.0.

Обращение к константам из программы на встроенном языке производится очень просто, хотя этот способ и отличается от версии 7.7:

// чтение значения из константы
Название = Константы.НазваниеОрганизации.Получить();
// запись нового значения в константу
Константы.НазваниеОрганизации.Установить(НовоеНазвание);

Обратите внимание на слово Константы (а не Константа, как было в версии 7.7). Через такую конструкцию мы обращаемся к объекту КонстантыМенеджер (заметьте, что применяется множественное число), который позволяет затем обратиться к менеджеру конкретной константы по ее имени.

Если расшифровать приведенный выше пример, то станет более понятна взаимосвязь объектов:

//получаем объект для управления списком констант
КонстантыМенеджер = Константы;

//получаем объект для управления одной константой
КонстантаМенеджер = КонстантыМенеджер.НазваниеОрганизации;

//считываем значение константы из базы данных
Значение - КонстантаМенеджер.Получить();

//записываем новое значение константы в базу данных
КонстантаМенеджер.Установить(НовоеЗначение);

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

Существуют свойства глобального контекста, ссылающиеся на объекты типа КонстантыМенеджер, СправочникиМенеджер, ДокументМенеджер и т.д., они называются односложно: Константы, Справочники, Документы. Это позволяет упростить написание программы и следующие примеры это демонстрируют:

Назв = Константы.НазваниеОрганизации.Получить();
СпрСотр = Справочники.Сотрудники;

ВсеДолжности = Справочники.Должности.Выбрать();
ДокНакл = Документы.РасходнаяНакладная;

Работа с константами производится с помощью нескольких объектов, и необходимо понимать их взаимосвязь, потому что подобная ситуация повторяется почти с каждым объектом конфигурации.

Ниже дано описание объектов для работы с константами:

КонстантыМенеджер

Объект предоставляет доступ к списку констант. Через этот объект можно перебрать все константы с помощью конструкции «Для Каждого» или получить объект КонстантаМенеджер для управления конкретной константой. Кроме того, данный объект позволяет создать объект КонстантыНабор для одновременного чтения и записи сразу нескольких констант.

КонстантаМенеджер

Менеджер константы обеспечивает доступ к конкретной константе. Через него можно прочитать и установить ее значение с помощью методов Получить и Установить.

КонстантыНабор

Через этот объект можно получить доступ сразу к нескольким константам, но необязательно всем существующим в

конфигурации.

Схематично взаимосвязь объектов для работы с константами можно отобразить следующим образом:

Работу с набором констант продемонстрируем на следующем примере:

//создаем набор из двух констант
//обратите внимание, что значений констант в наборе еще нет
Набор = Константы.СоздатьНабор("Руководитель,ИНН");
Набор.Прочитать(); //прочитать из базы сразу две константы
//изменить значение констант в наборе (не в базе)
Набор.Руководитель = "Иванов И.И.";
Набор.ИНН = "1234567890";
Набор.Записать(); //записать в базу сразу две константы

Главное, что следует запомнить, — при использовании набора все входящие в него константы считываются и записываются вместе в одной транзакции, т.е. операция над несколькими константами производится одновременно.

Константы — слишком простой объект для полного понимания объектной модели 1С:Предприятия 8.0. Далее на примере справочников мы рассмотрим новую объектную модель во всей ее полноте.


Справочники

Справочники являются основным механизмом хранения условно-постоянной информации. Справочники часто используются в тех случаях, когда необходимо исключить неоднозначный ввод информации. Каждый справочник представляет собой список однородных объектов: сотрудников, организаций, товаров и т.д. Такие объекты называются элементами справочника.

Замечание. Для упрощения понимания можно считать, что справочник — это обычная таблица с заданными колонками. Но в 1С:Предприятии 8.0 есть возможность создания иерархических справочников и табличных частей у справочников. Отсюда можно сделать вывод, что справочник — это не просто таблица, а достаточно сложный механизм хранения данных.

На этапе разработки можно описать, какими свойствами обладает справочник. К настраиваемым свойствам относятся длина и тип кода, количество уровней иерархии, поддержка уникальности кодов, перечень реквизитов справочника и его табличных частей, а также другие параметры.


Структура справочника

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

Во всех справочниках есть системные реквизиты Код и Наименование (если только у них не установлена нулевая длина). Действительно, практически любой объект из реальной жизни характеризуется этими свойствами. Например, для сотрудников кодом может выступать табельный номер, а наименованием — фамилия, имя и отчество (ФИО).

Код элемента справочника может быть как числовым, так и строковым. Система 1С:Предприятие 8.0 предоставляет широкие возможности по работе с кодами элементов справочника: автоматическое присвоение кодов новым элементам, контроль уникальности кода и т.д.

Помимо кода и наименования, в справочниках 1С:Предприятия 8.0 может храниться любая дополнительная информация об объектах предметной области, для чего в Конфигураторе настраивается список реквизитов и табличных частей. Используя механизм справочников легко организовать, например, картотеку сотрудников. Почти наверняка справочник Сотрудники, кроме встроенных реквизитов Код и Наименование, будет иметь какие-то дополнительные реквизиты, например, Должность, Оклад, Адрес, ДатаРождения и т.д.

Для каждого реквизита справочника нужно указать его тип данных, например, «число», «строка», «дата», «булево». Это примитивные типы данных, но можно указать и ссылочные типы данных. Например, реквизит Должность имеет тип данных «СправочникСсылка.Должности». В этом случае, значение реквизита будет выбираться из справочника Должности. Так реализуется простейшая связь между справочниками и другими объектами, когда значения реквизита объекта выбираются из справочника.

Новой возможностью для 1С:Предприятия 8.0 является то, что у реквизита справочника (и реквизитов других объектов) может быть составной тип данных. Это означает, что он может содержать значения разных типов данных, перечень которых задается в Конфигураторе.

Например, реквизит МестоРаботы в справочнике Физлица может выбираться, во-первых, из справочника Организации, если данный человек работает в одной из наших фирм (входящих в наш холдинг), во-вторых, из справочника Контрагенты, если он работает во внешней организации, и в-третьих, он может быть строкового типа, если требуется просто указать место работы сотрудника без ссылок на другие справочники.

Ниже показаны свойства реквизита МестоРаботы, имеющего составной тип данных:

Обратите внимание, что составной тип данных для реквизита

МестоРаботы включает три типа:

• СправочникСсылка.Контрагенты,

• СправочникСсылка. Организации,

• Строка.


Предопределенные элементы

Еще на этапе разработки конфигурации в справочник могут быть введены предопределенные элементы и группы справочника. Эти элементы имеют имена, по которым к ним производится обращение из программы. Предопределенные элементы справочника имеет смысл создавать, если сама конфигурация ориентирована на их использование.

Например, иерархический справочник Сотрудники может иметь две предопределенные группы: Работающие и Уволенные. Эти группы будут использованы в приказе о приеме на работу и приказе об увольнении. При приеме сотрудник добавляется в группу Работающие, а при увольнении переносится в группу Уволенные.

Ниже показано окно для редактирования предопределенных элементов справочника:

Приведем другие примеры предопределенных элементов и групп:

• В справочник Номенклатура может быть добавлена предопределенная группа «Снятые с продажи», которая будет содержать позиции номенклатуры, исключенные из прайс-листа.

• В справочник Контрагенты может быть добавлен предопределенный элемент «Розничный покупатель», который будет использоваться в документе РеализацияТовара, если покупатель не является организацией.

Обращение к предопределенным элементам из программного модуля реализуется по их именам следующим образом:

ГруппаРаботающие = Справочники.Сотрудники.Работающие;


Подчиненные справочники

Между справочниками может быть установлено отношение подчиненности. В этом случае каждый элемент подчиненного справочника будет связан с одним из элементов справочника-владельца. Часто можно сказать, что элементы одного справочника принадлежат элементам другого.

Например, в системе может быть справочник РасчетныеСчета, тогда его можно сделать подчиненным справочнику Контрагенты.

Это означает, что «Контрагент владеет расчетными счетами, а расчетные счета принадлежат контрагенту»

В 1C:Предприятии 8.0 у справочника может быть несколько владельцев, то есть справочник может быть подчинен сразу нескольким справочникам или другим объектам. Но каждый элемент подчиненного справочника имеет одного и только одного владельца, который хранится в одном из объектов-владельцев.

Например, справочник РасчетныеСчета может быть одновременно подчинен справочнику Контрагенты и справочнику Фирмы.

Структура расчетного счета одинакова при любом владельце, поэтому целесообразно завести не два разных справочника, каждый из которых подчинен или справочнику Фирмы, или справочнику Контрагенты, а один справочник РасчетныеСчета, подчиненный сразу двум справочникам. При этом каждый расчетный счет будет принадлежать только одному владельцу (или фирме, или контрагенту). Такая схема позволит избавиться от дублирования кода и упростить конфигурацию.

Справочник может быть подчинен не только другим справочникам, но также планам видов характеристик и планам счетов. Назначение такого подчиненного справочника — хранение подчиненных объектов о конкретной характеристике или о конкретном счете.

Например, можно завести справочник ЗначенияДопСвойств, подчиненный плану видов характеристик ДопСвойства. Это означает, что в справочнике будет храниться перечень возможных значений для каждой характеристики, например, список цветов (красный, зеленый, синий) для такой характеристики, как «Цвет», или для характеристики «Тип разъема» значения «PS/2», «USB» и т.д.

В 1С:Предприятии 8.0 для подчиненных справочников реализовано свойство ИспользованиеПодчинения. Оно позволяет управлять ограничением, накладываемым на владельцев. В качестве владельца могут использоваться только группы, только элементы или комбинированный вариант — группы и элементы. Если у справочника несколько владельцев, то ограничение применяется к каждому из них.

Среди различных вариантов настройки серий кодов есть вариант «В пределах подчинения владельцу». В иерархических подчиненных справочниках он обеспечивает автоматическую нумерацию и контроль уникальности кодов среди элементов с одинаковым владельцем, но разными родителями.


Табличные части

В 1С:Предприятии 8.0 появилась возможность для справочника создать одну или несколько табличных частей. Эту возможность рекомендуется использовать для отражения информации, связанной с данным элементом, но не имеющей собственной объектной сущности (для таких объектов рекомендуется завести подчиненный справочник). Например, для справочника Товары может быть создана табличная часть ЕдиницыИзмерения.

Обратите внимание, что при использовании табличной части уже нельзя будет ссылаться на строки табличной части, т.е. нельзя будет создать реквизит, соответствующий понятию «строка табличной части».

Например, если для справочника Сотрудники завести табличную часть Образование (вместо подчиненного справочника), то для реквизитов документов мы не сможем выбрать тип, аналогичный понятию «место учебы сотрудника». Это надо учитывать при выборе между подчиненным справочником и табличной частью.

Если даже в перспективе может возникнуть потребность ссылаться на подчиненные объекты, например, создавать ссылающиеся на них реквизиты документов или других справочников, то лучше сразу завести подчиненный справочник. Если же ссылка на такие сведения не имеет смысла и никогда не может быть типом какого-либо реквизита, тогда можно завести табличную часть.

Ниже представлен перечень ситуаций и наиболее корректный выбор между подчиненным справочником и табличной частью.

Просьба изучить эти ситуации очень тщательно, чтобы не допускать ошибок при выборе.

Ситуация 1

В базе данных необходимо хранить список расчетных счетов каждого контрагента. Почти наверняка в платежных документах будет необходимо, кроме контрагента, указывать его расчетный счет. Такая информация имеет четкую объектную природу и может быть идентифицирована как «Расчетный счет».

Решение: Справочник Контрагенты и подчиненный ему справочник РасчетныеСчета с полями Банк, Номер, КоррСчет.

Ситуация 2

Допустим, для справочника Номенклатура есть потребность хранить список единиц измерения для каждого товара с указанием коэффициента пересчета в основную единицу измерения. Эти сведения подбираются из справочника ЕдиницыИзмерения, который хранит все существующие в природе единицы измерений. Каждая строка такого подчиненного списка не имеет собственной объектной сущности, а нужна только для пересчета из одной единицы измерения в другую.

Решение: Справочник Номенклатура и табличная часть ЕдиницыИзмерения с полями ЕдиницаИзмерения и

КоэффициентПересчета.

Ситуация 3

Допустим, встроенной системы задания прав пользователей не хватает для некоторых специальных приложений. Например, часто требуется разработать механизм утверждения документов разными пользователями. Тогда для сотрудника нужно хранить список документов, которые он может утверждать, и с этим отлично справится табличная часть УтверждаемыеДокументы справочника Сотрудники. Такая информация не имеет объектной природы, а просто связывает документ и сотрудника, поэтому вряд ли понадобится когда-либо в будущем создавать ссылки на нее.

Решение: Справочник Сотрудники и табличная часть УтверждаемыеДокументы с полем Документ и флажком Утверждается. Заметим, что эту задачу также можно решить с использование регистров сведений, описанных в отдельной главе.

Ситуация 4

Для справочника Сотрудники требуется хранить сведения о составе семьи сотрудника, т.е. вносить информацию о члечленах семьи и их родственных отношениях к сотруднику (муж, жена, сын, дочь и т.д.). Обычно эта списковая информация полностью подчинена элементу справочника Сотрудники, и возникает мысль о том, чтобы завести табличную часть. Но если подумать, то такая информация имеет четкую объектную природу и может быть идентифицирована как «Член семьи». Для некоторых приложений может потребоваться создавать ссылки на членов семьи сотрудника. Аналогичная ситуация наблюдается со сведениям об образовании и о предыдущих местах работы сотрудника.

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


Иерархические справочники

Список элементов справочника в системе 1С:Предприятие 8.0 может быть иерархическим (или многоуровневым). Использование иерархических справочников позволяет сгруппировать элементы справочника по какому-либо признаку с нужной степенью детализации.

Иерархический справочник может быть двух видов:

  • • Элементы и группы

В первом случае все элементы иерархического справочника разделяются на «просто» элементы справочника и группы справочника. Группы могут отличаться по структуре от обычных элементов, т.е. могут содержать другой состав реквизитов.

Для каждого реквизита указывается, относится ли он только к элементу, только к группе или к обоим. Примером иерархического справочника с группами может служить справочник Сотрудники, в котором есть группы Штатные, Совместители и Уволенные.

  • • Только элементы

Во втором случае иерархический справочник состоит только из элементов. Любой элемент может выполнять функцию группы, т.е. он может быть родительским элементом для других элементов этого же справочника. Например, по такому принципу можно организовать справочник Подразделения. В любой момент времени какой-нибудь отдел может быть разделен внутри себя на несколько подотделов, и отразить это в справочнике не составит никакого труда. Другой пример — справочник Районы, который отражает территориальное деление города. Элементы верхнего уровня представляют административные округа, на втором уровне содержатся районы, на третьем уровне — микрорайоны.

Главное отличие этих двух видов иерархического справочника заключается в следующем:

• в первом случае группы и элементы справочника являются разными сущностями (у них обычно разный состав реквизитов), например, группа товаров и товар, группа сотрудников и сотрудник.

• во втором случае справочник содержит информацию о сходных сущностях одной природы, но разного уровня детализации, например, отдел и подотдел, район и микрорайон. Максимально возможное количество уровней иерархии справочника задается в Конфигураторе. Кроме того, в 1С:Предприятии 8.0 появилась возможность неограниченной вложенности групп и элементов друг в друга. Этот вариант устанавливается по умолчанию, и рекомендуется применять именно его, если не требуется в обязательном порядке ограничить глубину вложенности уровней справочника.

Элементы и группы в иерархическом справочнике можно переносить из одного уровня иерархии в другой. Это можно делать программно или интерактивно. При интерактивном переносе элементов можно воспользоваться специальной кнопкой на панели инструментов справочника. Для программного переноса элемента достаточно сменить у него родителя и записать элемент. Если меняется родитель у группы (или родительского элемента), то группа (элемент) переносится в другую ветвь справочника со всеми своими подчиненными элементами.

Отметим, что для элементов самого верхнего уровня поле Родитель имеет значение пустой ссылки на справочник.


Экранные формы

У справочника может быть несколько экранных форм. Даже если разработчик не создал ни одной экранной формы для справочника, то они будут сгенерированы «на лету» при выполнении программы. Конечно, автоматически созданная экранная форма может быть не самой удобной для пользователя, поэтому, когда это требуется, рекомендуется создавать собственные экранные формы с эргономичным интерфейсом.

Ниже показана закладка свойств справочника, посвященная его экранным формам:

Как и в версии 7.7, в 1С:Предприятии 8.0 есть возможность редактировать элемент прямо в списке, в диалоге или обоими способами. У справочника может быть любое количество экранных форм, и некоторые из них назначаются в качестве основных для определенных действий.

Ниже поясняется назначение различных экранных форм справочника:

Форма списка

Отображает список элементов справочника, содержит средства сортировки, поиска и отбора элементов. Из списка элементов можно открыть форму элемента (группы) или редактировать данные прямо в табличном поле. Это регулируется свойством табличного поля СпособРедактирования.

Форма элемента

Отображает и позволяет редактировать сведения об одном элементе справочника. Если у справочника много реквизитов, то они могут быть распределены по закладкам.

Форма группы

Отображает и позволяет редактировать сведения о группе справочника. Группы могут иметь другой состав реквизитов по сравнению с элементами.

Форма выбора элемента

Предназначена для выбора элемента из списка. Такая форма вызывается при выборе значения, например, в поле ввода, связанного с реквизитом документа.

Форма выбора группы

Предназначена для выбора группы из списка. Выбор группы может понадобиться, например, для отчета по товарам, который позволяет вывести не все товары, а только товары заданной группы. Эта форма также используется при интерактивном переносе элемента в другую группу.

Произвольная форма

Данная форма не вызывается системой автоматически, как предыдущие типы форм. Назначение произвольной формы и точки ее вызова определяет разработчик. Основное отличие произвольной формы от других состоит в том, что для нее не назначен основной реквизит, следовательно, контекст формы не включает дополнительные свойства и методы, характерные для основного реквизита.

Обратите внимание, что в любой экранной форме можно вывести список элементов справочника, поскольку в новой версии 1С:Предприятия экранные формы отделены от объектов конфигурации. Для этого нужно всего лишь расположить в форме элемент управления ТабличноеПоле и в его свойстве ТипЗначения выбрать тип «СправочникСписок.<ИмяСправочника>».


Приемы программирования

С помощью встроенного языка 1С:Предприятия 8.0 можно выполнять различные операции над документами: создавать, изменять и удалять их, искать документ по номеру, перебирать их в цикле и т.д.

Работа с документами производится с помощью нескольких программных объектов (аналогичные объекты мы уже рассматривали для справочников):

ДокументыМенеджер

Обеспечивает доступ к менеджерам всех документов конфигурации. Свойства этого объекта совпадают по имени с именами документов и содержат объекты типа ДокументМенеджер.

ДокументМенеджер

Обеспечивает доступ к действиям над документами определенного вида как множеством объектов. Через методы этого объекта можно осуществлять поиск, получать выборку, создавать новый документ, обращаться к формам и макетам документа.

ДокументСсылка

Это специальный объект, однозначно идентифицирующий документ в базе данных и позволяющий обращаться к нему в режиме «только чтение». Значение данного типа хранится, например, в реквизитах других объектов, ссылающихся на документы данного вида. Через свойства и методы этого объекта можно прочитать реквизиты документа, обратиться к его табличным частям.

ДокументОбъект

Предоставляет доступ к документу с возможностью записи и проведения. Даный объект содержит методы, изменяющие документ в базе данных, например, метод Записать.

ДокументВыборка

Предоставляет возможность обхода (перебора) документов определенного вида. Объект этого типа возвращается методом Выбрать объекта ДокументМенеджер.

ДокументСписок

Объект для управления списком документов, отображаемым в форме. Позволяет управлять колонками, отбором и сортировкой в списке. Этот объект не может быть создан программно, он создается системой автоматически при размещении в форме табличного поля, отображающего список документов.

Из одних объектов с помощью определенных свойств или методов можно получить другие объекты, как показано на следующей схеме:

Замечание. На схеме показаны не все возможные взаимосвязи Например, метод Скопировать существует не только у объекта ДокументСсылка, но и у самого объекта ДокументОбъект.

Рассмотрим на примерах выполнение типичных операций с документами.

Обращение к менеджеру документа

Обращение к менеджеру документа производится следующим образом:

ДокСчет = Документы.Счет;
ДокСчет = Документы["Счет"];

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

Внимание! С помощью ключевого слова Новый нельзя создавать новые документы. Для этого предназначен метод СоздатьДокумент объекта ДокументМенеджер, который возвращает объект типа ДокументОбъект. <ИмяДокумента>.

Следующий фрагмент показывает пример создания нового документа.

ДокМенеджер = Документы.Счет;
НовыйДок = ДокМенеджер.СоздатьДокумент();
//при создании документа программным способом
//дата документа не заполняется системой,
//это должен сделать разработчик
НовыйДок.Дата = Дата;
НовыйДок.Записать();

Выборка документов

Перебор документов производится через объект ДокументВыборка, который возвращается при вызове метода Выбрать объекта ДокументМенеджер:

ДокВыборка = Документы.Счет.Выбрать();
Пока ДокВыборка.Следующий() Цикл
    Сообщить("К " + ДокВыборка.Номер + " от " + ДокВыборка.Дата);
    //перебор строк табличной части
    Для Каждого стр Из ДокВыборка.Состав Цикл
        Сообщить!" " + стр Номенклатура);
    КонецЦикла;
КонецЦикла;

Создание и проведение документа

В 1С:Предприятии 8.0 можно программно создать, записать и провести документ. Для создания нового документа применяется метод СоздатьДокумент, который возвращает объект для записи типа ДокументОбъект. Через другие объекты и механизмы нельзя создать, изменить или удалить документ.

Следующий пример демонстрирует создание документа, его запись без проведения и запись с неоперативным проведением:

НовыйДок = Документы.Счет.СоздатьДокумент();
НовыйДок.Дата = Дата;
НовыйДок.Записать(); //обычная запись документа
//запись документа с неоперативным проведением
НовыйДок.Записать(РежимЗаписиДокумента.Проведение,
РежимПроведенияДокумента.Неоперативный);

Внимание! Теперь у документа нет метода Провести, как это было в версии 7.7. Программное проведение документа выполняется с помощью метода Записать с параметрами РежимЗаписиДокумента и РежимПроведенияДокумента.

Ниже приведены возможные значения параметров метода Записать:

Параметр «РежимЗаписиДокумента»:

  • • Запись (по умолчанию),

  • • ОтменаПроведения,

  • • Проведение (в этом случае имеет смысл указывать второй параметр).

Параметр «РежимПроведенияДокумента»:

  • • Неоперативный (по умолчанию),

  • • Оперативный.

Поиск документа

Поиск документа по номеру производится методом НайтиПоНомеру. Этот метод возвращает ссылку на найденный документ или пустую ссылку, если документ не найден. Проверка на пустую ссылку производится методом Пустая():

ДокСсылка = Документы.Счет.НайтиПоНомеру("Сч1ОО1");
Если ДокСсылка.Пустая() Тогда
    Сообщить("Документ с данным номером не найден!");
КонецЕсли;

Если требуется отобрать множество документов с определенным значением реквизита, то можно применить метод Выбрать с указанием структуры отбора и затем обойти полученную выборку.

Не забудьте, что у реквизита, по которому производится отбор, должен быть установлен в Конфигураторе флажок «Индексировать» (для даты документа можно считать, что он уже установлен).

Для выборки документов из базы данных по комбинированному условию, например, по нескольким полям, рекомендуется применять запросы (см. главу «Запросы»).

Удаление документа

Удаление документа производится с помощью объекта ДокументОбъект и только так. Другим способом удалить документ нельзя.

ДокСсылка = Документы.Счет.НайтиПоНомеру("Сч1001");
Если Не ДокСсылка.Пустая() Тогда
    ДокОбъект = ДокСсылка.ПодучитьОбъект();

    //1-й вариант пометки на удаление
    //если документ был проведен, то он остается проведенным (!)
    //движения документа по регистрам сохраняются (!)
    ДокОбъект.ПометкаУдаления = Истина;
    ДокОбъект.Записать();

    //2-й вариант пометки на удаление
    //если документ был проведен, то он делается непроведенным
    //движения документа по регистрам удаляются
    ДокОбъект.УстановитьПометкуУдаления(Истина);

    //непосредственное удаление объекта
    //если документ был проведен, то движения по регистрам удаляются
    ДокОбъект.Удалить();
КонецЕсли;

Внимание! При пометке на удаление методом УстановитьПометкуУдаления проведенный документ делается непроведенным и движения документа по регистрам удаляются (если не установлено свойство документа «Удалять движения автоматически»). А при присвоении свойству ПометкаУдаления значения Истина проведенный документ остается проведенным и движения документа по регистрам сохраняются.

При непосредственном удалении документа контроль за удалением движений документа возлагается на разработчика.

Открытие форм документа

Часто требуется программно открыть какую-либо форму доку-

мента. Рассмотрим на примерах варианты открытия различных

форм документа:

//открытие формы по имени
Документы.Счета.Получитьформу("ОсновнаяФорма").Открыть();
//открытие формы для нового документа
Документы.Счета.ПолучитьФормуНовогоДокумента().Открыть();
//открыть основную форму списка документов
Форма = Документы.Счета.ПолучитьФормуСписка();
Форма.Открыть();
//открыть форму для выбора документа из списка
//текущая форма будет являться владельцем для открываемой формы
Форма = Документы.Счета.ПолучитьФормуВыбора(, ЭтаФорма);
Если НЕ Форма.Открыта() Тогда //если она еще не открыта
    Форма.ИмяСохраненияПоложенияОкна = "ПодборСчетов";
КонецЕсли;
//открыть форму или активизировать уже открытую форму
Форма.Открыть();

Работа с табличным частями

Обращение к табличным частям документа производится по их именам. Для обхода строк табличной части рекомендуется применять конструкцию «Для Каждого...».

Например, ниже показан фрагмент модуля документа ПриходнаяНакладная:

// Для каждой строки сформируем движения
//по регистру остатков УчетНоменклатуры
Для Каждого СтрокаСостава Из Состав Цикл
    Движение = Движения.УчетНоменклатуры.ДобавитьПриход();

    Движение.Период = Дата;
    Движение.Номенклатура = С трсжаСостава.Номенклатура;
    Движение.Склад = Склад;
    Движение.Количество = СтрокаСостава.Количество;
КонецЦикла;
Движения.УчетНоменклатуры.Записать();

Замечание. В 1С:Предприятии 8.0 больше нет понятия «итог по колонке», т.е. система больше не поддерживает хранение итога по колонке табличной части при установке флажка, как это было в версии 7.7. Если требуется хранить и быстро получать итоговую сумму по колонке табличной части, то для этого нужно завести реквизит документа и заполнять его, например, в процедуре ПередЗаписью.

Движения документа

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

Рассмотрим типичную схему создания новых движений по регистру остатков и регистру бухгалтерии при проведении документа:

ВидыСубконто = ПланыВидовХарактеристик.ВидыСубконто;
//по каждой строке сформируем движения по регистру УчетНоменклатуры
Для Каждого СтрокаСостава Из Состав Цикл
    Движ = Движения.УчетНоменклатуры.ДобавитьПриход();
    движ.Период = Дата;
    Движ.Склад = Склад;
    Движ. Номенклатура = СтрокаСостава.Номенклатура;
    Движ.Количество = СтрокаСостава.Количество;
КонецЦикла;
// сформируем одну бухгалтерскую проводку на общую сумму
Движ = Движения.Основной.Добавить() ;
Движ.Период = Дата;
Движ.Ндс = ПланнСчетов.Основной.НДСпоПриобретеннемЦенностям;
Движ.СчетКт = ПланыСчетов.Основной.Поставщики;
Движ.СубконтоКт[ВидыСубконто.Контрагенты] - Контрагент ;
Движ.Сумма = Состав.Итог("НДС");

//записываем движения в базу данных
Движения.УчетНоменклатуры.Записать();
Движения.Основной.Записать();


Важные отличия от версии 7.7

Общие отличия:

• Справочники могут иметь несколько табличных частей.

• Справочник может быть подчинен нескольким владельцам. В качестве владельца может выступать другой справочник, план видов характеристик или план счетов.

• У групп справочника-владельца тоже могут быть подчиненные элементы в других справочниках. Эта возможность включается в свойствах справочника.

• В справочнике с иерархией элементов они могут являться родителями, т.е. у них могут быть подчиненные элементы. Глубину иерархии справочника можно сделать неограниченной.

• У справочников могут быть предопределенные элементы и группы, задаваемые еще на этапе разработки конфигурации.

• Модуль справочника не то же самое, что модуль любой из его форм.

• Список элементов справочника может быть показан в любом табличном поле (в любой форме), если у него соответствующим образом указано свойство ТипЗначения.

• Элемент справочника может быть введен на основании документа, счета и других объектов, или наоборот.

• Реквизиты справочника, как и других объектов, могут быть составного типа данных, перечень возможных типов указывается в свойствах реквизита.

• Максимальная длина наименования увеличена до 150 символов, максимальная длина кода — 50 символов.

• Нумерация элементов в подчиненном иерархическом справочнике может быть установлена в пределах подчинения владельцу.

Отличия в свойствах и методах:

• Вместо метода ПометкаУдаления() для объекта типа СправочникОбъект введено свойство ПометкаУдаления, которое имеет тип «булево» и доступно для чтения и записи. Если ему присвоить значение Истина и записать объект, то элемент будет помечен на удаление. Метод Удалить с параметром 0 уже не применяется для установки пометки удаления.

Для установки пометки удаления также можно использовать метод УстановитьПометкуУдаления.

• Вместо метода ЭтоГруппа() введено свойство ЭтоГруппа типа «булево», доступное только для чтения.

• Методы Выбрать и ВыбратьИерархически возвращают объект типа СправочникВыборка (см. выше взаимосвязь объектов).

• Методы НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту возвращают ссылку на найденный элемент или пустую ссылку, если элемент не найден. В любом случае возвращается объект типа СправочникСсылка.

• Для получения пустой ссылки вместо несуществующей теперь функции ПолучитьПустоеЗначение необходимо использовать метод ПустаяСсылка.

• Вместо метода ПринадлежитГруппе введен метод ПринадлежитЭлементу, поскольку иерархические справочники могут состоять только из элементов (без групп).

• Вместо метода Блокировка с разными параметрами нужно применять методы Заблокировать, Разблокировать и Заблокирован. Последний метод проверяет, удалось ли установить блокировку элемента данным объектом СправочникОбъект.

• Для обращения к метаданным у объектов СправочникСсылка и СправочникОбъект существует метод Метаданные, который возвращает объект специального типа для описания метаданного.


Документы и журналы документов

Документы предназначены для хранения информации обо всех событиях, происходящих на предприятии и имеющих смысл с точки зрения экономики. При помощи документов отражаются платежи с расчетного счета и операции по кассе, кадровые перемещения сотрудников и движения товаров, а также другие события.

Типичными примерами документов являются платежное поручение, счет, приходная накладная, расходная накладная, приходный кассовый ордер. Каждый документ предназначен для отражения своего типа событий, что определяет его структуру и свойства.

Наиболее важными характеристиками документа, отличающими его от других объектов, является наличие у него номера и даты. В 1С:Предприятии 8.0 значения типа «дата» включают в себя также и время.

Дата и время — наиболее важные характеристики документов. Все документы вне зависимости от вида образуют единую хронологическую последовательность. Фактически эта последовательность отражает последовательность событий — так, как они происходили реально. Внутри даты последовательность документов определяется их временем, при этом время документа является не столько средством отражения реального (астрономического) времени ввода документа, сколько средством, позволяющим четко упорядочить документы внутри одной даты. Если получится так, что два документа имеют одинаковую дату и время, то они все равно выстраиваются в последовательность.

Данные, вводимые в реквизиты документа, обычно содержат информацию о событии, например, в расходной накладной — информацию о том, с какого склада, каких товаров и сколько отгружено; в приказе о приеме на работу — информацию о сотруднике, оклад и другие сведения; в договоре с клиентом — условия договора, график плановых платежей и т.д.

Кроме собственно записи, для документа весьма важным аспектом является его проведение. Именно при проведении документ обычно отражает зафиксированное им событие в регистрах

1С:Предприятия 8.0, например, в виде движений по регистру бухгалтерии и/или движений по регистру остатков товаров.


Структура документа

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

В отличие от версии 7.7, в 1С:Предприятии 8.0 у документов может быть несколько табличных частей, различных по структуре.

Для некоторых документов эта возможность будет полезной в целях более полного отражения содержания хозяйственной операций.

Ниже показана закладка «Данные», предназначенная для редактирования списка реквизитов и табличных частей документа:

Реквизиты содержат данные, относящиеся ко всему документу в целом, тогда как табличные части содержат некоторую списковую информацию, часто встречающуюся в экономических документах, например, перечень продаваемых товаров и список дополнительных расходов.


Экранные формы

Экранные формы документа

Документ может иметь несколько экранных форм, некоторые из которых назначаются в качестве основных

Ниже описаны возможные типы экранных форм документа:

Форма документа

Основная экранная форма, представляющая документ на экране. Она необязательно должна совпадать по внешнему виду с печатной формой реального документа. Ее первейшая обязанность — обеспечить удобный способ ввода и просмотра данных.

Форма списка

Данная экранная форма отображает список документов определенного вида и является аналогом журнала, содержащего документы одного вида.

Форма выбора

Форма выбора обычно вызывается системой, когда пользователь заполняет реквизиты типа ДокументСсылка.Если какая-то из форм не была создана разработчиком, то система сгенерирует нужную форму «на лету», когда в ней возникнет необходимость. Конечно, это может быть недостаточно для удобного ввода и просмотра информации, поэтому рекомендуется, когда это необходимо, создавать собственные формы с эргономичным интерфейсом. Особенно это актуально для ежедневно используемых документов Пользователь работает с этими документами каждый день, и малейшая недоработка будет постоянно мешать, снижая его производительность и повышая утомляемость.

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

Ниже приведена экранная форма для документа РасходнаяНакладная, редактируемая в Конфигураторе:

Внимание! У экранных форм могут быть собственные реквизиты Не путайте их с реквизитами документа. Подробнее про реквизиты формы см. главу «Интерфейс пользователя».


Макеты документа

Макеты документа предназначены для формирования его печатных форм, которые могут быть показаны на экране и напечатаны на принтере.

У документа может быть несколько печатных форм, поэтому и макетов может быть несколько. Например, из документа «Посту


Проведение документов

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

Ниже показана закладка «Движения», на которой задаются основные параметры проведения документа.

Самый первый параметр разрешает или запрещает проведение документа.

В списке регистров нужно выбрать только те регистры, по которым данный документ может делать движения. Не стоит отмечать все регистры подряд, так как это может отрицательно сказаться на производительности. В этом списке должны быть помечены только те регистры, по которым документ действительно может делать движения.

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

Стоит отметить, что в 1С:Предприятии 8.0 проведение документа и движения по регистрам не связаны жестко. Документ может быть не проведен и иметь движения.

Рассмотрим параметр «Оперативное проведение». При таком проведении можно контролировать текущие остатки регистров, например, при проведении расходной накладной нужно проверить, достаточно ли товара на складе. Однако иногда бывает так, что документы проводятся не текущей датой, а «задним числом». Обычно такое случается, когда в документе была обнаружена ошибка или какой-то документ раньше не был введен в базу данных. В таких случаях применяется неоперативное проведение, при котором в конфигурации не должно быть обращений к текущим итогам регистров.

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

Например, в модуле документа расходной накладной в процедуре ОбработкаПроведения могут быть следующие строки:

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

При удалении документа или при отмене его проведения движения документа обычно удаляются автоматически, но это можно регулировать установкой параметра «Удаление движений». Для некоторых видов документов разработчик может отменить данную возможность и управлять удалением движении самостоятельно через свойство Движения, предоставляющее доступ к коллекции движений документа.

Оперативная отметка времени

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

Например:

Процедура ПередЗаписыз (Отказ, РежимЗаписи, РежимПроведения)
    Дата = ПолучитьОперативнуюОтметкуВремени();
КонецПроцедуры


Модуль документа

Следует отличать модуль документа и модули его форм (как и в версии 7.7). В модуле документа располагаются процедуры и функции, связанные с документом как объектом конфигурации, независимо от его экранных форм.

Например, там и только там располагаются обработчики следующих событий:

ОбработкаПроведения

Событие возникает в момент проведения документа. Обычно в нем содержится алгоритм формирования движений документа по регистрам. Событие имеет два параметра: Отказ и Режим. Если в обработчике события первому параметру присвоить значение Истина, тогда документ не будет проведен. Второй параметр позволяет узнать режим проведения документа: оперативный или неоперативный.

Перед началом выполнения данной процедуры, если документ раньше сформировал движения, то они обычно очищаются системой автоматически.

ОбработкаУдаленияПроведения

Событие возникает в момент отмены проведения документа. При этом движения документа, как правило, очищаются автоматически.

ОбработкаЗаполнения

Это событие возникает при вводе документа на основании другого документа (или, например, элемента справочника), который передается в параметр Основание. В данной процедуре программист должен предусмотреть заполнение реквизитов документа.

ПередЗаписью

Это событие возникает перед выполнением записи объекта после начала транзакции, но до начала записи документа в базу данных.

ПередУдалением

Событие возникает перед удалением документа из базы, независимо от того, программно или интерактивно он удаляется.

ПриУстановкеНовогоНомера

Данное событие возникает в момент, когда выполняется установка нового номера документа.

ПриКопировании

Это событие возникает при создании документа копированием. В процедуре-обработчике можно произвести дополнительные действия, например, присвоить новую дату и новый номер, заполнить реквизит Автор и т.д.

Замечание. Все эти процедуры-обработчики событий вызываются при наступлении указанных событий независимо от того, как они были инициированы: программно или интерактивно. Даже если документ записывается методом Записать, то будут вызваны процедуры-обработчики ПередЗаписью и ПриЗаписи. Это следует учитывать при разработке конфигураций.

Кроме вышеперечисленных процедур, в модуле документа могут располагаться процедуры и функции, созданные разработчиком.

Если их объявить с ключевым словом Экспорт, то они станут доступными вне документа, как обычные методы.

Часто таким образом производится печать документов, например, ниже приведена процедура печати расходной накладной:

Процедура Печать(ТабДок) Экспорт
    //получение макета
    Макет = Документы.РасходнаяНакладная.ПолучитьМакет("Печать");

    //вывод шапки
    Область = Макет.ПолучитьОбласть("Шапка");
    Область.Параметры.НомерДокумента = Номер;
    Область.Параметры.От = Дата;
    ТабДок.Вывести(Область);

    //вывод табличной части Состав
    Для Каждого СтрокаСостава Из Состав Цикл
        Область = Макет.ПолучитьОбласть("Строка");
        Область.Параметры.Заполнить(СтрокаСостава);
        ТабДок.Вывести(Область);
    КонецЦикла;

    //вывод подвала
    Область = Макет.ПолучитьОбласть("Подвал");
    Область.Параметры.ИтогоКоличество = Состав.Итог("Количество");
    Область.Параметры.ИтогоСумма = Состав.Итог{"Сумма");
    ТабДок.Вывести(Область);
КонецПроцедуры

Теперь в любом программном модуле можно вызвать эту процедуру и передать ей в качестве параметра табличный документ, который затем можно показать на экране или отправить сразу на принтер.

Например, в форме документа по кнопке «Печать» вызывается следующая процедура:

Процедура ПечатьСПросмотром(Кнопка)
    ТабДок = Новый ТабличныйДокумент;
    Печать(ТабДок); //вызывается приведенная выше процедура
    ТабДок.Показать();
КонецПроцедуры

Аналогично, можно организовать печать текущей расходной накладной из журнала документов, и снова будет вызвана наша процедура Печать из модуля документа, например:

Процедура ПечатьТекущегоДокумента()
    Список = ЭлементыФормы.Список,
    Если Список.ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекДокумент = Список.ТекущаяСтрока.ПолучитьОбъект();
    ТабДок = Новый ТабличныйДокумент;
    ТекДокумент.Печать(ТабДок);
    ТабДок.Показать();
КонецПроцедуры


Приемы программирования

С помощью встроенного языка 1C: Предприятия 8.0 можно выполнять различные операции над справочниками: создавать, изменять и удалять элементы, искать нужный элемент, перебирать элементы в цикле и т.д.

Работа со справочниками из программы производится с помощь нескольких объектов. Каждый объект имеет свое назначение, собственные свойства и методы.

Ниже описываются эти объекты и взаимосвязи между ними:

СправочникиМенеджер

Обеспечивает доступ ко всем справочникам конфигурации. Свойства этого объекта совпадают с именами справочников и содержат объекты типа СправочникМенеджер.

СправочникМенеджер

Обеспечивает доступ к операциям над справочником как множеством элементов. Через методы этого объекта можно осуществлять поиск, получать выборку, создавать новые элементы или группы, обращаться к формам и макетам справочника.

СправочникСсылка

Данный объект однозначно идентифицирует элемент (группу) справочника и позволяет обращаться к нему в режиме «только чтение». Через свойства и методы этого объекта можно прочитать реквизиты элемента (группы), обратиться к его табличным частям. Значение этого типа хранится в реквизитах, ссылающихся на элементы данного справочника, например, в реквизите Сотрудник документа ПриемНаРаботу хранится ссылка на конкретный элемент справочника Сотрудники.

СправочникОбъект

Предоставляет доступ к элементу с возможностью записи. Данный объект содержит методы, влияющие на элемент в базе данных, например, методы Записать и Удалить.

СправочникВыборка

Предоставляет возможность обхода (перебора) элементов справочника. Выборка может быть прямой или иерархической (если справочник многоуровневый).

СправочникСписок

Объект для управления списком элементов в табличном поле. Позволяет управлять колонками, отбором и сортировкой в списке.

Из одних объектов с помощью определенных методов или свойств можно получить другие объекты, как показано на следующей схеме:

Замечание. На схеме показаны не все возможные взаимосвязи. Например, метод Скопировать существует не только у объекта СправочникСсылка, но и у самого объекта СправочникОбъект.

Кроме того, у объекта СправочникМенеджер есть методы НайтиПоНаименованию и НайтиПоРеквизиту, которые действуют аналогично методу НайтиПоКоду и возвращают ссылку на найденный элемент или пустую ссылку, если элемент не найден.

Продемонстрируем на примерах выполнение типичных операций со справочниками.

Обращение к менеджеру справочника

Обращение к менеджеру справочника производится следующим образом:

СпрСотр = Справочники.Сотрудники;
СпрТовары = Справочники["Номенклатура"];

Обращение к справочнику в версии 8.0 отличается от версии 7.7, в которой использовалась функция СоздатьОбъект. В новой версии используется свойство глобального контекста Справочники, которое предоставляет доступ к объекту типа СправочникиМенеджер (обратите внимание на множественное число). Данный объект через свои свойства предоставляет доступ к объектам типа СправочникМенеджер (единственное число).

Объект СправочникиМенеджер является коллекцией значений и позволяет обратиться к конкретному элементу коллекции через приведенные выше конструкции. Хотя эти две конструкции функционально эквивалентны, но нужно знать различные варианты их использования:

1. Первый вариант (через точку) применяется, когда имя справочника известно программисту и оно неизменно. Такая конструкция более простая и рекомендуется к применению в большинстве случаев.

2. Во втором варианте имя справочника задается строкой. Такая конструкция может быть использована, когда неизвестно имя справочника, с которым будут производиться действия, например, в универсальном отчете ПечатьСправочника, который выводит на печать содержимое любого заданного справочника.

При обращении к справочнику не следует применять ключевое слово Новый, которое предназначено для создания новых объектов определенных типов, например, массивов или таблиц значений.

Ниже показываются два варианта обращения к справочнику, первый из которых ошибочный:

СпрСотр = Новый Справочники.Сотрудники; // так нельзя!!
СпрСотр = Справочники.Сотрудники; //а вот так правильно

Выборка элементов справочника

Перебор элементов справочника производится через объект СправочникВыборка, который возвращается при вызове методов Выбрать и ВыбратьИерархически объекта СправочникМенеджер:

СпрВыборка = Справочники.Номенклатура.Выбрать();
Пока СпрВыборка.Следующий() Цикл
    Сообщить(СпрВыборка.Код + " " + СпрВыборка.Наименование);
    //перебор строк табличной части
    Для Каждого стр Из СпрВыборка.ЕдиницыИзмерения Цикл
        Сообщить(" " + стр.ЕдиницаИзмерения);
    КонецЦикла;
КонецЦикла;

Отличие метода ВыбратьИерархически от метода Выбрать заключается в том, что выборка формируется с учетом иерархии элементов, то есть сначала в выборке располагается родительский элемент 1-го уровня, за ним следуют его дочерние элементы, затем следующий родительский элемент 1-го уровня и т.д. А при использовании метода Выбрать элементы в выборке следуют в обычном порядке.

Ниже видна разница в работе этих методов (жирным шрифтом выделены группы справочника):

IMG NO

Методы Выбрать и ВыбратьИерархически позволяют отобрать только нужные элементы, например, входящие в определенную группу иерархического справочника или принадлежащие определенному владельцу.

Синтаксическая диаграмма метода Выбрать и ВыбратьИерархически такова (на примере метода Выбрать):

Выбрать(<Родитель>, <Владелец>, <Отбор>, <Порядок>);

Ниже поясняется назначение каждого параметра:

Родитель

Ссылка на родительский элемент или группу. В выборку попадут только элементы, принадлежащие заданному эле-

менту (группе). Параметр имеет смысл только для иерархических справочников.

Владелец

Ссылка на элемент справочника-владельца. В выборку попадут только элементы, принадлежащие заданному элементу-владельцу. Параметр имеет смысл только для подчиненных справочников.

Отбор

Структура, которая позволяет отобрать элементы справочника с заданным значением в определенном реквизите. Ключ структуры содержит имя реквизита, а значение структуры задает значение отбора. В структуре могут использоваться только реквизиты Код, Наименование и реквизиты с установленным признаком индексирования. Обратите внимание, что структура может содержать только один элемент. Для отбора элементов по нескольким признакам можно использовать запросы.

Порядок

Строка, задающая условие упорядочивания по реквизиту, например, «Оклад Убыв». Упорядочивание может быть использовано только для индексированных реквизитов (в том числе для кода и наименования).

Например, выберем из справочника Номенклатура только мониторы и упорядочим их по убыванию цены:

СпрНоменклатура = Справочники.Номенклатура;
ГруппаМониторы = СпрНоменклатура.НайтиПоНаименованию("Мониторы");
СпрВыборка = СпрНоменклатура.Выбрать(ГруппаМониторы,,,"Цена Убыв");
Пока СпрВыборка.Следующий() Цикл
КонецЦикла;

В следующем примере из справочника Семья, подчиненного справочнику Сотрудники, выбираются все сыновья определенного сотрудника. Здесь используется одновременный отбор по владельцу и по реквизиту ТипРодства:

Отбор = Новый Структура) "ТипРодства");
Отбор.ТипРодства = Перечисления.ТипРодства,Сын;
СпрВыборка = Справочники.Семья.Выбрать(,ВыбСотр,Отбор,);

Создание элементов и групп справочника

Создание нового элемента или группы производится через специальный объект СправочникОбъект. Обратите внимание, что другим способом создать элемент справочника нельзя.

Ниже приведен пример создания группы Прочие справочника Сотрудники и элемента в этой группе:

НоваяГруппа = Справочники.Сотрудники.СоздатьГруппу();
НоваяГруппа.Код = 1;
НоваяГруппа.Наименование = "Прочие";
НоваяГруппа.Записать();

НовыйСотрудник = Справочники.Сотрудники.СоздатьЭлемент();
НовыйСотрудник.Код = 100;
НовыйСотрудник.Наименование = "Иванов Иван Иванович";
НовыйСотрудник.Родитель = НоваяГруппа.Ссылка;
НовыйСотрудник.Записать();

Поиск в справочнике

Поиск элемента или группы производится методами НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту. Эти методы возвращают ссылку на найденный элемент или пустую ссылку, если элемент не найден. Проверка на пустую ссылку производится методом Пустая, который возвращает значение Истина, если ссылка действительно пустая.

Следующий пример демонстрирует применение этих методов:

СотрСсылка = Справочники.Сотрудники.НайтиПоКоду(100);
Если НЕ СотрСсылка.Пустая() Тогда
    Сообщить("Найден сотрудник с кодом 100: " +
    СотрСсылка.Наименование);
КонецЕсли;
    //2-й вариант проверки на пустую ссылку
Если СотрСсылка = Справочники.Сотрудники.ПустаяСсылка() Тогда

КонецЕсли;

Удаление элемента или группы справочника

Удаление элемента справочника производится с помощью объекта СправочникОбъект и только так. Другим способом удалить элемент справочника нельзя.

Следует различать пометку на удаление и непосредственное удаление объекта. При установке пометки на удаление элемент (группа) остается в справочнике, но отображается с особым значком. Он также участвует в переборе и в общем случае виден пользователю.

При непосредственном удалении элемент справочника удаляется из базы данных. В этом случае на него не должно быть ссылок в других объектах базы данных, например, документах, иначе эти ссылки станут недействительными, т.е. нарушится ссылочная целостность базы данных. Чтобы этого не произошло, есть возможность пометки элемента на удаление с последующим его окончательным удалением через команду меню «Операции -> Удаление помеченных объектов». В этом случае система проверит правильность удаления объекта с контролем ссылочной целостности базы данных.

Следующий пример находит элемент с определенный кодом и демонстрирует два способа пометки на удаление и непосредственное удаление объекта:

СотрСсылка = Справочники.Сотрудники.НайтиПоКоду(100);
Если Не СотрСсылка.Пустая () Тогда
    СотрОбъект = Сотр.ПолучитьОбъект();

    //1-й вариант пометки на удаление
    СотрОбъект.ПометкаУдапения = Истина;
    СотрОбъект.Записать();

    //2-й вариант пометки на удаление
    СотрОбъект.УстановитьПометкуУдаления(Истина);

    //3-й вариант: непосредственное удаление объекта
    СотрОбъект.Удалить();
КонецЕсли;

Пометка на удаление (снятие пометки) с помощью метода УстановитьПометкуУдаления отличается от первого способа, при котором системному полю ПометкаУдаления присваивается какое-либо значение. Второй параметр этого метода позволяет установить (снять) пометку на удаление для всех подчиненных элементов, если справочник является иерархическим.

Открытие форм справочника

Часто требуется программно открыть какую-либо форму справочника, например, при нажатии на клавишу Подбор в документах для заполнения табличной части.

Рассмотрим возможные варианты открытия различных форм справочника:

//обращение к форме по имени
Форма = Справочники.Сотрудники.Пояучитьформу("ФормаДляМенеджера");
Форма.Открыть();

//открыть основную форму списка
Справочники.Сотрудники.ПолучитьформуСписка().Открыть();

//открыть подбор товара из документа,
//текущая форма будет владельцем открываемой формы
Форма = Справочники.Номенклатура.ПолучитьФормуВыбора(, ЭтаФорма);
Если НЕ Форма.Открыта() Тогда //если она еще не открыта
Форма.ИмяСохраненияПоложенияОкна = "НоменклатураПодбор";
КонецЕсли;

//установить свойства формы до ее открытия
Форма. РежимВыбора = Истина ;
Форма.ЗакрыватьПриВыборе = Ложь;
Форма. РазрешитьСостояниеПрикрепленное = Истина;
//открыть форму или активизировать уже открытую форму
Форма.Открыть();

Работа с табличным частями

Обращение к табличным частям справочника производится через их имена. Для обхода строк табличной части рекомендуется применять конструкцию «Для Каждого...».

Ниже показан пример обработки табличной части УтверждаемыеДокументы для справочника Сотрудники:

Сообщить("Выбранный сотрудник утверждает следующие документы:");
Для Каждого УтвДок Из ВыбСотр.УтверждаемыеДокументы Цикл
    Сообщить(УтвДок.Документ);
КонецЦикла;

Модуль объекта

В версии 8.0 введено такое понятие как модуль объекта, который отличается от модуля формы элемента справочника. В новой версии экранные формы отделены от самих объектов конфигурации, поэтому необходимо понимать предназначение модуля объекта.

Дело в том, что именно в нем располагаются обработчики событий, связанных с элементом справочника.

В версии 8.0 существуют следующие события, обработчики которых располагаются в модуле справочника:

ПриКопировании

Событие возникает при создании элемента справочника копированием. В обработчике события ПриКопировании можно вмешаться в этот процесс и более интеллектуально заполнить некоторые реквизиты элемента справочника.

ПередЗаписью

Процедура-обработчик вызывается после начала транзакции, но до начала записи элемента справочника. В данном обработчике можно отказаться от записи элемента.

ПриЗаписи

Событие возникает после записи элемента справочника в базу данных, но до окончания транзакции записи. В данном обработчике также можно отказаться от записи элемента.

ПередУдалением

Событие возникает перед непосредственным удалением элемента или группы справочника из базы данных. В обработчике события это действие можно отменить.

ПриУстановкеНовогоКода

Событие возникает в момент, когда выполняется установка нового кода элемента справочника.

ОбработкаЗаполнения

Событие возникает при вводе элемента справочника на основании, а также при выполнении метода Заполнить. В процедуре-обработчике этого события должен быть описан алгоритм заполнения реквизитов элемента справочника на основании переданного значения.

Обработчики этих событий должны располагаться в модуле объекта и только там, независимо от наличия у справочника различных форм. Обработчики событий будут вызываться всегда при наступлении указанных событий, даже если событие инициировано программными вызовами, например методами Записать и Удалить. Это важное отличие в обработке событий по сравнению с версией 7.7, в которой такие события вызывались только при интерактивных действиях пользователя.

Приведем пример использования обработчика события. Допустим, в конфигурации категорически не допускается ввод позиции номенклатуры без указания основной единицы измерения. Тогда в модуле объекта справочника Номенклатура необходимо предусмотреть обработку события ПередЗаписью:

Процедура ПередЗаписью(Отказ)
    Если ЭтоГруппа = Ложь И ЕдиницаИзмерения.Пустая() Тогда
        Сообщить("Не указана основная ед. измерения!");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Обратите внимание, что реквизит ЕдиницаИзмерения определен только для элементов справочника Номенклатура, поэтому сначала проверяется, что записывается именно элемент, а не группа (условие «ЭтоГруппа = Ложь»).

Также заметьте, что вторая часть условия в операторе Если не выполняется, если первое условие не выполнено. Это происходит, потому, что, как уже говорилось в главе «Встроенный язык», в 1С:Предприятии 8.0 применяется сокращенное вычисление условий. Если после вычисления части составного условия уже можно определить результат всего условия, то остальная часть условия не вычисляется. Если бы в нашем примере для группы вычислялась вторая часть условия, то выдавалась бы ошибка, поскольку реквизит ЕдиницаИзмерения для групп не определен.


Нумерация документов

Важной характеристикой документа является его номер. Система 1С:Предприятие 8.0 имеет широкие возможности по настройке правил нумерации документов. Разработчик может доверить системе присвоение номеров, включив автоматическую нумерацию документа. В Конфигураторе настраивается тип и длина номера, периодичность, включается или отключается контроль уникальности номеров в пределах периода.

Внимание! Поле, содержащее номер документа, теперь называется Номер, а не НомерДок, как было в версии 7.7. Аналогично, поле, содержащее дату документа, называется Дата, а не ДатаДок.

При редактировании правил нумерации документа доступны для установки следующие параметры:

Автонумерация

Этот параметр заставляет систему автоматически присваивать номера для новых документов.

Периодичность

Здесь указываются две важные характеристики нумератора: пределы контроля уникальности номеров документов и период повторяемости номеров. Если включен признак контроля уникальности номеров (см. ниже), то периодичность нумератора показывает, в каких пределах осуществлять этот контроль. Например, если установлено «В пределах дня», то уникальность номеров документов будет контролироваться в пределах суток. При включенной автоматической нумерации система будет присваивать очередной порядковый номер каждому новому документу. После завершения очередного периода нумерация документов начнется с 1.

Длина

Устанавливает максимальную длину номера документа. Самая большая длина номера, которую можно установить, — 50 символов.

Тип

Здесь выбирается тип значения для номера документа — числовой или строковый. Выбор строкового типа номера бывает необходим, когда используется сложная система нумерации документов. При этом номер документа может включать, помимо цифр, также буквы и символы-разделители, например «К10-56».

Контроль уникальности

Если эта опция включена, то при записи документа в базу данных его номер проверяется на уникальность в пределах, установленных в реквизите Периодичность.

Нумераторы

Нумератор представляет собой объект метаданных, описывающий правила нумерации документов: тип и длину номера, периодичность, необходимость контроля уникальности.

Основное назначение нумератора — обеспечить возможность единой (сквозной) нумерации документов разного вида, для чего этим документам назначается один нумератор. Например, для всех кадровых приказов, к которым относятся документы ПриемНаРаботу, Увольнение, КадровоеПеремещение, назначается нумератор Кадровый.

Так же, как для обычного номера документов, для нумератора можно задать периодичность, длину и тип номера, включить или отключить уникальность номеров в пределах периода. Тогда эти параметры будут действовать на все документы, использующие данный нумератор.

Префиксы номеров

Для некоторых видов документов необходим префикс, например, для всех кадровых приказов можно завести префикс «К», для складских — «С» и т.д. Аналогичным образом можно назначить префиксы для номеров документов одного вида, например, у документа РасходнаяНакладная в префикс номера включить код подразделения.

Для назначения префикса номера документа следует применять метод УстановитьНовыйНомер, например:

Процедура ПриОткрытии()
    Если ЭтоНовый() Тогда
        ПрефиксНомера = глПользователь.Подразделение.ПрефиксНомеров;
        УстановитьНовыйНомер(ПрефиксНомера);
    КонецЕсли;
КонецПроцедуры


Журналы документов

В системе 1С:Предприятие 8.0 журналы документов являются объектами конфигурации, предназначенными для смысловой группировки документов. Для отображения журнала используется элемент управления ТабличноеПоле. Работая со списком документов, пользователь может создать новый документ, открыть или удалить его, найти нужный документ по номеру. Кроме того, есть возможность установить нужный интервал, тем самым ограничив выборку документов.

Стоит отметить, что у самого документа может быть форма списка, которая является аналогом журнала для документов одного вида. Если она не создана, то генерируется системой автоматически, когда в ней возникает потребность, но, если требуется, можно создать ее в Конфигураторе и настроить удобный внешний вид формы.

Документ при записи может регистрироваться в нескольких журналах, что настраивается в Конфигураторе. Не рекомендуется указывать много журналов, в которых должен регистрироваться документ, поскольку это может отрицательно сказаться на производительности системы при интенсивном вводе документов.

В журнале обычно отображаются документы разного вида. Например, ниже показан журнал Торговля, в котором регистрируются все торговые документы (счета, приходные и расходные накладные и т.д. ).

Графы журнала

В журнале документов могут быть созданы графы журнала, которые отображают информацию из документов.

Например, в журнале Торговля создана графа Контрагент:

При настройке графы журнала указывается список реквизитов документов, из которых она будет отображать информацию Из каждого документа можно взять только один реквизит Не рекомендуется смешивать в одной графе разнородную информацию,например, контрагента и сумму документа.


Последовательности

Последовательности документов — это специальный механизм 1C:Предприятия 8.0, который позволяет поддерживать правильность движений документов В версии 8.0 возможности последовательностей получили дальнейшее развитие.

Если документ при проведении использует текущие итоги регистра (например, расходная накладная списывает товары по методу FIFO или LIFO), то в случае изменения движений «задним числом» движения всех последующих документов становятся некорректными, и эти документы необходимо перепровести.

При настройке последовательности в Конфигураторе описывается, какие изменения регистров будут влиять на последовательность и какие документы входят в эту последовательность (это могут быть документы разного вида).

Обратите внимание, что документ ПриходнаяНакладная не входит в последовательность УчетНоменклатуры, потому что при своем проведении он не использует текущие итоги регистров Однако при проведении приходной накладной «задним числом» сформируются новые движения по регистру накопления СтоимостнойУчетНоменклатуры, что нарушит последовательность. Чтобы ее восстановить, нужно будет перепровести все расходные накладные, начиная от границы последовательности.

Граница последовательности — это позиция последнего проведенного документа с «правильными» движениями. Если какие-то движения изменяются задним числом, граница последовательности отодвигается назад на последний документ, при проведении которого использовались последние «правильные» итоги, а все документы, проведенные на основе изменившихся итогов, окажутся после границы последовательности.

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

В 1С:Предприятии 8.0 появилась новая возможность указать измерения для последовательности документов. В этом случае перепроводиться будут только те документы, которые изменили состояние регистра по данному значению измерения, например, только по конкретному товару. Это значительно ускоряет перепроведение документов, когда их очень много.


Важные отличия от версии 7.7

Встроенные реквизиты НомерДок и ДатаДок заменены реквизитами Номер и Дата. Значения типа «дата» включают в себя также и время.

У документа может быть несколько табличных частей, различных по структуре.

Максимальная длина номера документа увеличена до 50 символов.

Для каждого документа указывается перечень регистров, по которым он может делать движения.

Больше нет общих реквизитов документов. Поддержка общих реквизитов отрицательно сказывалась на производительности системы.

У документа теперь нет метода Провести. Программное проведение документа осуществляется методом Записать с параметрами РежимЗаписиДокумента (возможные значения: Запись,Проведение и ОтменаПроведения) и РежимПроведенияДокумента (возможные значения: Оперативный и Неоперативный).

Движения документа не связаны жестко с признаком его проведения. Проведенность документа означает окончание его обработки с точки зрения пользователя. За соответствием признака проведенности документа и актуальностью его движений должен следить разработчик.

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

Больше нет такого понятия, как «подчиненные документы»,соответственно метод ВыбратьПодчиненныеДокументы был удален. Вместо этого можно использовать критерии отбора.

Больше нет граф отбора, вместо них предлагается использовать критерии отбора.


Перечисления

Перечисления используются в системе 1C:Предприятие 8.0 для описания постоянных наборов значений, не изменяемых в процессе работы конфигурации. В отличие от элементов справочников, значения перечислений вводятся на этапе разработки прикладного решения и не могут быть изменены в процессе работы с программой. Пользователь обычно выбирает одно из значений перечисления.

Типичными примерами перечислений являются:

  • • ТипКлиента (значения: Обычный, Важный),

  • • Пол (значения: Мужской, Женский),

  • • ВидКонтрагента (значения: ЧастноеЛицо, Организация).

Список значений перечисления нельзя редактировать, так как алгоритм конфигурации ориентирован на наличие определенных значений. Например, в процедуре расчета скидки может быть следующий фрагмент:

Если ТипКлиента - Перечисления.ТипКлиента.Обычный Тогда
    //расчет скидки для обычных клиентов
Иначе Если ТипКлиента = Перечисления.ТипКлиента.Важный Тогда
    //расчет скидки для важных клиентов
Иначе
    Сообщить("Не указан тип клиента!");
КонецЕсли;

Отсюда видно, что при изменении значений перечисления возможно потребуется изменение программных модулей, иначе программа перестанет правильно работать.

Внимание! В отличие от версии 7.7, в версии 8.0 при обращении к значению перечисления используется множественное число в слове «Перечисления», например, Перечисления.ТипКлиента.Важный.


Отчеты и обработки

Отчеты и обработки - это не сохраняемые в базе данных объекты, предназначенные для формирования печатных форм или обработки данных в базе данных.

Отчеты и обработки совершенно идентичны по структуре, у них просто разное назначение:

. Отчеты предназначены для вывода информации, формирования различных печатных форм с детальными и сводными данными, например, отчеты АнализПродаж, ПрайсЛист, РеестрДокументов.

. Обработки предназначены для изменения данных в базе данных и выполнения других действий, например, ПерерасчетЗарплаты, ЗакрытиеПериода, КлиентБанк.

Структура отчета и обработки одинакова:

Реквизиты

Реквизиты отчета (обработки) содержат параметры формирования отчета (выполнения обработки). Эти реквизиты отличаются от реквизитов справочников тем, что они не сохраняются в базе данных. Например, реквизиты НачДата и КонДата у отчета АнализПродаж.

Табличные части

Табличные части содержат списки параметров для отчета или обработки, обычно состоящие из нескольких колонок.

Например, табличная часть условияПоСубконто у отчета «ОСВ по счету».

Экранные формы предназначены для отображения отчета/обработки на экране. Это могут быть и различные дополнительные формы, предназначенные для ввода параметров или отображения результатов. В качестве примера можно назвать формы ВыборПериода и ФормаВложеннойТаблицы обработки КонсольЗапросов.

Макеты

Макеты являются шаблонами печатных форм, на основе которых формируются выходные формы. Макеты могут быть как у отчетов, так и обработок. Например, макеты РеестрДокументов, ОсновнойМакет.

Правилом хорошего тона при разработке в системе 1С:Предприятие 8.0 является реализация основного алгоритма формирования отчета (выполнения обработки) в модуле объекта. Экранная форма и ее модуль предназначены лишь для взаимодействия с пользователем, задания параметров отчета (обработки) и отображения результатов, а основная обработка данных должна производиться в модуле объекта.

Например, в модуле отчета объявляется процедура Печать с ключевым словом Экспорт, которая в качестве параметра принимает табличный документ:

В модуле формы в обработчике события Нажатие кнопки «ОК» вызывается процедура Печать и ей передается элемент формы типа ПолеТабличногоДокумента. Процедура Печать выбирает информацию из базы данных и заполняет табличный документ.

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

Чтобы научиться формировать печатные формы, необходимо прочитать главу «Отчеты». Отчеты часто извлекают информацию из базы данных с помощью запросов. Механизм запросов является очень гибким и описан в отдельной главе «Запросы». Во многих случаях отчеты и обработки обращаются к регистрам, работа с которыми описана в главах «Регистры сведений», «Регистры накопления» и др.


Внешние обработки

Так же, как и в версии 7.7, в версии 8.0 любой отчет или обработка может быть сохранен во внешний файл, т.е. он будет храниться вне информационной базы. В версии 8.0 изменился формат у внешних обработок, теперь они хранятся в файлах с расширением «EPF».

Для запуска внешней обработки можно использовать команду меню «Файл -> Открыть». Если же это требуется сделать программным образом, то необходимо воспользоваться менеджером внешних обработок, для чего предназначено свойство ВнешниеОбработки глобального контекста. Обратите внимание, что теперь нет команды ОткрытьФорму, которая была в версии 7.7.

Следующий пример обращается к внешней обработке «АнализПродаж.ерf», задает ей параметр Контрагент и вызывает процедуру Печать, а результат помещается в поле табличного документа:

Обработка = ВнешниеОбработки.Создать("с:\АнализПродаж.epf");
Обработка.Контрагент = ВыбКонтрагент;
Обработка.Печать(ЭлементыФормы.ПолеТабДок);

Заметьте, что форма внешней обработки даже не показывается на экране. Из нее используется только процедура Печать для формирования печатной формы.


Важные отличия от версии 7.7

• У отчетов и обработок может быть несколько экранных форм.

• Отчеты и обработки могут иметь реквизиты и табличные части, но их смысл отличается от реквизитов и табличных частей справочников и документов. Через них передаются параметры формирования отчета или выполнения обработки.

• Основная процедура формирования отчета или выполнения обработки обычно располагается в модуле объекта и объявляется с ключевым словом Экспорт. В модуле формы (или из любого другого программного модуля) производится вызов данной процедуры.

Изменилась техника формирования печатной формы (табличного документа), о чем подробно рассказывается в главе «Отчеты».

Внешние обработки хранятся в EPF-файлах, несовместимых с ERT. Для программного запуска внешней обработки или открытия ее формы необходимо воспользоваться менеджером внешних обработок.


Глава 4.

Интерфейс пользователя

Пользовательский интерфейс — это видимая часть программы, с которой непосредственно взаимодействует конечный пользователь. Интерфейс прикладного решения состоит из следующих частей:

  • • панели интерфейса (главное меню и панели инструментов конфигурации);

  • • экранные формы, в которых размещаются различные элементы управления (кнопки, поля ввода, списки, флажки и т.д.);

  • • диалоговые окна, предупреждения и вопросы, служебные сообщения, календарь, калькулятор и т.д.;

  • • печатные формы и окна текстовых документов, отображаемые на экране, также составляют важную часть интерфейса пользователя.

Любая конфигурация на платформе 1С:Предприятие 8.0 имеет интерфейс, частично состоящий из интерфейса самой платформы и собственного интерфейса конфигурации.

К интерфейсу платформы относятся внешний вид главного окна программы, системные пункты меню, стандартные панели инструментов, встроенные экранные формы и элементы управления.

Встроенный интерфейс платформы присутствует во всех конфигурациях, что является одним из преимуществ системы программ.

1С:Предприятие 8.0, позволяющим ускорить обучение пользователей при работе с различными конфигурациями, независимо от их назначения.

К интерфейсу самой конфигурации относятся главное меню конфигурации, которое сливается с системным меню, главные панели инструментов, экранные формы и расположенные на них элементы управления, выходные печатные формы, диалоговые окна и служебные сообщения. Для тиражных конфигураций интерфейс должен быть максимально стандартизирован.


Интерфейс пользователя

Интерфейсы

В данном разделе под термином «интерфейс» понимается объект конфигурации, который находится в ветви «Общие» дерева конфигурации. Этот объект предназначен для реализации командного интерфейса конфигурации (главное меню и панели инструментов).

В простой конфигурации можно создать один интерфейс, но чаще создается несколько интерфейсов для каждого типа пользователей. Рекомендуется один из интерфейсов назначить основным, а также разработать специальный интерфейс для администратора системы, в котором будут присутствовать все основные объекты конфигурации. Имена интерфейсам лучше присваивать исходя из названия должности пользователей или по названиям подсистем.

Интерфейс как объект конфигурации состоит из панелей интерфейса. Причем главное меню также является одной из таких панелей, как показано ниже:

Логически связанные пункты рекомендуется объединять в подменю и группировать с помощью линий-разделителей.

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

Чтобы ускорить доступ к часто выполняемым командам, предусмотрите кнопку на панели инструментов конфигурации или даже сочетание клавиш (акселератор, горячая клавиша).

Ниже на рисунке видно, что для пункта «Валюты» назначено сочетание клавиш Alt-V для быстрого открытия справочника валют:

Средства встроенного языка допускают программное манипулирование интерфейсами. В частности, можно включить и выключить определенный интерфейс или сразу несколько интерфейсов.

В 1С:Предприятии 8.0 можно переключать интерфейс «на лету» без перезапуска программы.


Экранные формы

Чаще всего пользователь оценивает интерфейс конфигурации по экранным формам, с которыми он встречается в повседневной работе, например, формами списков справочников, документов, диалогами отчетов и обработок.

Многие объекты в 1C:Предприятии 8.0 могут иметь одну или несколько форм Кроме того, в конфигурации могут быть так называемые общие формы, которые не принадлежат конкретному объекту, а относятся к конфигурации в целом Обычно одна из общих форм служит в качестве формы констант, обеспечивая удобный доступ к ним

Ниже приведен пример типичной экранной формы документа:

В верхней части формы располагается вспомогательная командная панель Чуть ниже идут идентификационные реквизиты номер, дата и время документа, там же можно поместить название документа жирным шрифтом Затем идут реквизиты шапки документа в одну или две колонки, далее табличная часть, еще ниже итоговая информационная строка и, наконец, в самом низу — кнопки управления формой. Такой стандарт представления экранных форм традиционно применяется для экономических документов, и рекомендуется его придерживаться


Редактор форм

Для разработки форм в 1C:Предприятии 8.0 существует мощный редактор форм, имеющий богатый набор элементов управления и сервисных функций, включая выравнивание, задание привязок границ и др.

Ниже показана форма документа ВыплатаСотрудникам в режиме Конфигуратора:

IMG

Отметим следующие моменты:

  • • в форме расположены различные элементы управления надписи, поля ввода, табличное поле, командные панели,

  • • при размещении элементов управления в форме их можно выравнивать по сетке, которую можно включить и выключить, а также задать ее шаг,

  • • у экранных форм, помимо диалога, имеется модуль формы и реквизиты формы, которые не следует путать с модулем и реквизитами объекта.

Редактор форм позволяет изменять внешний вид экранной формы с помощью следующих инструментов:

  • • Панель «Элементы управления» позволяет разместить в форме различные элементы управления, к которым относятся: кнопка, надпись, поле ввода, табличное поле, флажок, переключатели и т.д. Панель «Элементы управления» выглядит следующим образом:

  • • Палитра свойств дает возможность редактировать внешний вид и поведение выделенных элементов управления. Кроме того, у формы в целом также существуют собственные свойства.

Обратите внимание, что свой набор свойств может быть даже у частей элемента управления. Например, табличное поле, колонка табличного поля и ячейка — все имеют различный набор свойств.

  • • Панель «Форматирование» позволяет редактировать внешний вид элементов управления. Это значительный прогресс по сравнению с версией 7.7, где все свойства настраивались в специальном окне с несколькими закладками. Те же самые свойства можно редактировать напрямую через палитру свойств.

Панель «Форматирование» выглядит следующим образом:

  • • Панель «Редактор форм» позволяет установить порядок обхода элементов управления (по клавише TAB), запустить форму для проверки (Ctrl-R), вызвать конструктор для вставки элемента управления или разместить в форме элементы управления, связанные с реквизитами объекта конфигурации. Ручная настройка порядка обхода доступна, если отключен автоматический порядок обхода. Рекомендуется задавать естественный порядок обхода элементов управления: слева направо сверху вниз. Кнопки панели редактора форм показаны ниже:

  • • Панель «Выравнивание» становится доступна, когда в форме выделено несколько элементов управления. С помощью данных кнопок можно оперировать группой элементов, выравнивать их по краю или по центру, задавать одну ширину или высоту и даже выравнивать автоматически. Команды панели выравнивания приведены на следующем рисунке:

Режим редактирования привязок границ элементов управления позволяет настроить поведение формы при изменении размеров для максимального использования пространства формы. Прямо в форме стрелками обозначаются текущие привязки, а в специальном окне можно настроить привязки вручную.

Контекстное меню в редакторе форм позволяет выполнить некоторые действия над текущим элементом управления, например, добавить страницу на панель.

Наконец, с помощью мыши можно размещать элементы управления в форме, передвигать их и изменять их размер.


Элементы управления

Элементы управления являются основными строительными блоками, из которых складывается интерфейс пользователя. Все элементы управления имеют некоторые сходные свойства. К таким свойствам относятся имя, заголовок, положение в форме и размеры, привязка границ, порядок обхода, видимость, доступность и др.

Ниже перечислены все элементы управления, существующие в 1C:Предприятии 8.0.

Поле ввода

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

В 1С:Предприятии 8.0 есть возможность сигнализировать пользователю красной пунктирной линией о том, что поле не заполнено.

Чтобы использовать эту возможность, достаточно в свойствах поля установить флажок «Автоотметка незаполненного». Для всех обязательных реквизитов рекомендуется установить данное свойство, что значительно облегчит работу пользователя и ускорит освоение системы.

В свойствах поля ввода можно также настроить его внешний вид: цвет фона, стиль и цвет рамки, картинку. Не рекомендуется кардинально изменять внешний вид элементов управления. Только минимальная и правильная настройка облагородит конфигурацию, придаст ей стильный и профессиональный вид.

Рекомендуется соблюдать единый стиль оформления для всей конфигурации, а в пределах одной формы это является обязательным. Значительное изменение интерфейса ведет к тому, что пользователь должен приложить дополнительные усилия для изучения данной конфигурации.

Чтобы ускорить освоение конфигурации начинающими пользователями, для всех полей ввода указывайте свойство Подсказка.

Это также относится и к другим элементам управления. В 1C:Предприятии 8.0 можно даже создать раздел справочной системы по данной форме, куда следует включить подробное описание всех элементов управления для ввода данных и кнопок.

У поля ввода для чисел, дат и логических выражений может быть назначен формат, который позволяет настроить внешний вид вводимых данных.

С помощью специального редактора можно сформировать форматную строку, в которой будет указана длина и точность для чисел, разделитель дробной части и другие параметры:

Чтобы уменьшить количество ошибок из-за неправильно введенных пользователем данных, используйте свойства «Мин.значение» и «Макс. значение», а там где это необходимо, ставьте флажок «Неотрицательный». Обратите внимание, что если поле ввода связано с реквизитом объекта типа «число», то флажок «Неотрицательный» устанавливается в свойствах реквизита объекта, а не в свойствах поля ввода. Если отрицательные числа всетаки допускаются, то их лучше все равно автоматически выделять с помощью стиля «Отрицательное число» (обычно красным цветом). Для этого достаточно в свойствах поля ввода установить флажок «Выделять отрицательные».

Необходимо понимать разницу между полем ввода и реквизитом объекта. Поле ввода является элементом управления, видимым пользователю и предназначенным для редактирования реквизита объекта. Чтобы реквизит объекта был доступен пользователю для просмотра и редактирования, между элементом управления (например, полем ввода или колонкой табличного поля) и реквизитом объекта устанавливается связь. Это делается путем указания свойства Данные для элемента управления.

Заметьте, что имя поле ввода может не совпадать с именем реквизита документа. Например, поле ввода с именем ПолеОклад может быть связано с реквизитом Оклад.

Имя элемента управления используется при обращении к нему для установки свойств, определяющих его внешний вид и поведение. В этом случае обращение производится через коллекцию ЭлементыФормы, например:

ПолеОклад = ЭлементыФормы.ПолеОклад;
ПолеОклад.Видимость = Истина;
ПолеОклад.МаксимальноеЗначение = 10000;
ПолеОклад.МинимальноеЗначение = 500;
ПолеОклад.ОтметкаНезаполненного = Истина;
ПолеОклад.КнопкаОчистки = Истина;

У поля ввода существует несколько событий, которые разработчик может перехватывать для выполнения каких-либо действий.

Некоторые из этих событий приведены ниже:

ПриИзменении

Событие возникает при интерактивном изменении данных пользователем, например, после выбора элемента из справочника или после ввода числа и при переходе к другому элементу управления.

НачалоВыбора

Событие возникает при нажатии на кнопку выбора у поля ввода или нажатии клавиши F4.

НачалоВыбораИзСписка

Событие возникает при нажатии на кнопку выбора из списка.

Очистка

Это событие возникает при нажатии кнопки очистки или по комбинации клавиш Shift+F4

Регулирование

Данное событие возникает при нажатии на одну из кнопок регулирования (увеличения или уменьшения значения).

Открытие

Событие возникает при нажатии на кнопку открытия объекта или комбинации клавиш Ctrl-Shift-F4.

ОбработкаВыбора

Это событие возникает после осуществления выбора, но до помещения выбранного значения в элемент управления.

ОкончаниеВводаТекста

Событие возникает после окончания ввода текста при переходе к другому элементу управления. Например, в расходной накладной при изменении контрагента нужно пересчитать цены в соответствии с типом цен для текущего контрагента:

Процедура КонтрагентПриИзменении(Элемент)
    Если Не Контрагент.Пустая() Тогда
        Если ТипЦен о Контрагент.ТипЦен Тогда
            ТипЦен = Контрагент.ТипЦен;
            ПересчетЦен();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Надпись

Надпись обычно содержит поясняющий текст к полям ввода и другим элементам управления для ввода данных. Рекомендуется располагать надписи слева или сверху от элементов управления, которые они поясняют. Надписи можно выравнивать по краям или по центру, задавать им различное начертание, размер и цвет текста, цвет фона, стиль и цвет рамки. Надпись также может иметь картинку.

Разработчик имеет возможность программно управлять свойствами надписи, например:

ЭлементыФормы. НадписьТипЦен. Заголовок = "Тип розничной цены";
ЭлементыФормы.НадписьТипЦен.ЦветТекста = Новый Цвет(200,0,0);
ЭлементыФормы.НадписьТипЦен.ПрозрачныйФон = Истина;
ЭлементыФормы.НадписьТипЦен.Видимость = Истина;

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

Последнее, что стоит здесь отметить, — элемент управления Надпись имеет событие Нажатие. Если же в свойствах установить один флажок, то надпись также может служить гиперссылкой.

Кнопка

Кнопка позволяет выполнить какое-либо стандартное действие или вызвать процедуру (обработчик события Нажатие).

Разработчик указывает заголовок кнопки, настраивает ее внешний вид, включая начертание и размер шрифта, цвет фона и текста, размер и положение картинки.

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

Для каждого пункта подменю можно указать одно из стандартных действий или назначить процедуру модуля. Например, пункт «Печать» вызывает процедуру ПечатьСПросмотром:

Процедура ПечатьСПросмотром(Кнопка)
    ТабДок = Новый ТабличныйДокумент;
    ДокументОбъект.Печать(ТабДок);
    ТабДок.Показать() ;
КонецПроцедуры

Командная панель

Командная панель представляет собой набор кнопок, обычно с пиктограммами, для выполнения действий в текущей форме или с некоторым элементом управления, например, табличным полем.

Внимание! Следует различать «командную панель» и «панель интерфейса». Командная панель располагается в форме и содержит кнопки и подменю. Панель интерфейса представляет собой главное меню или панель инструментов конфигурации.

Командная панель может формироваться автоматически или настраивается разработчиком. Если в свойствах командной панели установлен флажок Автозаполнение, то затем обычно указывается свойство ИсточникДействий. При этом командная панель автоматически будет заполнена командами, характерными для данного источника. Например, если источником действий является табличное поле, то на командной панели появятся кнопки Добавить, Изменить, Удалить и т.д.

В командной панели, могут присутствовать кнопки с картинкой, с надписью и картинкой, или только с надписью.

Для каждой кнопки командной панели, как и для обычной кнопки, есть свойство Действие, которое задает одно из стандартных действий или вызывает процедуру модуля.

Кнопки могут являться подменю, например, как кнопка «Действия» в стандартных командных панелях.

Если у командной панели установлено свойство «Вспомогательная», то это говорит о гом, что командная панель не участвует в обходе элементов формы (клавиши TAB и Shift-TAB).

Программно можно изменять свойства командной панели, добавлять и удалять кнопки, менять их порядок и т.д. Ниже демонстрируются некоторые возможности 1С:Предприятия 8.0 по работе с командными панелями средствами встроенного языка:

//обращение к командной панели в форме
КомПанель = ЭлементыФормы.КоманднаяПанельТаблицы;
// добавим кнопку Открыть, вызывающую процедуру ОткрытьЭлемент
КомПанель.Кнопки.Добавить("кнОткрыть",
    ТипКнопкиКоманднойПанели.Действие,
    "Открыть",
    Новый Действие("ОткрытьЭлемент"));
//сделаем командную панель доступной
КомПанель,Доступность = Истина;

Командная панель может быть также использована в качестве контекстного меню для некоторых элементов управления, если установить им свойство КонтекстноеМеню.

Контекстное меню вызывается по нажатию правой кнопки мыши, Shift-FlO или специальной кнопки на Windows-клавиатуре. При открытии оно подстраивается под текущее положение курсора:

Разработчик может доверить формирование контекстного меню системе (свойство АвтоКонтекстноеМеню) или использовать в качестве контекстного меню командную панель или ее кнопку - подменю.

Флажок

Флажок применяется для тех данных, которые характеризуются состояниями «включено» и «выключено». Флажок обычно имеет два состояния, хотя в 1С:Предприятии 8.0 можно создавать флажки и с тремя состояниями: «включено», «выключено» и «не опреопределено» (затемненная галочка). Такие флажки должны иметь тип данных не «булево», как обычно, а «число».

При размещении в форме флажка автоматически создается реквизит типа «булево» или «число», через который можно программно считывать и устанавливать текущее значение флажка. Через коллекцию ЭлементыФормы можно управлять свойствами флажка, например:

Сообщить(флУправленческийУчет);
флБухгалтерскийУчет = Ложь;
ЭлементыФормы.флУверенность.ТриСостояния = Истина;
флУверенность = 2; //будет означать третье состояние "Не знаю"

В свойствах флажка можно настроить его внешний вид, включая положение текста (слева или справа), цвет фона, шрифт и цвет текста, стиль и цвет рамки.

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

Разработчик может написать собственную процедуру, которая выполняет какие-либо действия при изменении состояния флажка.

Переключатели

Переключатели позволяют выбрать один вариант из нескольких, поэтому их всегда два или больше. Рекомендуется визуально объединять переключатели в группу с помощью рамки.

Внимание! Первый переключатель в группе должен иметь установленное свойство «Первый в группе». Все переключатели данной группы должны иметь последовательный порядок обхода.

Если эти условия не выполняются, то переключатели будут работать неправильно.

Чтобы установить последовательный порядок обхода, нужно сначала в свойствах формы отключить флажок «Автопорядок обхода», затем нажать кнопку [image] на панели инструментов или выбрать пункт меню «Форма -> Порядок обхода», тогда у элементов формы отобразится их порядковые номера Затем, последовательно щелкая мышкой на каждом элементе управления, укажите правильный порядок обхода. Порядок обхода можно также задать в свойствах переключателя с помощью свойства «Порядковый номер», напрямую установив нужное число.

Свойство Данные первого переключателя в группе ссылается на реквизит формы или реквизит объекта, через который можно программно прочитать или установить состояние переключателя.

Внимание! Свойство «Выбираемое значение» необходимо задать для каждого переключателя. Оно говорит о том, какое именно значение будет записано в реквизит формы или реквизит объекта при установке данного переключателя. Тип значения группы переключателей может быть не только числовым, но и строковым, датой и т.д.

Следующий фрагмент демонстрирует установку и считывание состояния переключателей:

//прочитать текущий выбор пользователя
Сообщить(ПереключательНаправлениеПечати);
//установить первый переключатель
ПереключательНаправлениеПечати = "Файл";
//установить второй переключатель
ПереключательНаправлениеПечати = "Принтер;

Табличное поле

Табличное поле позволяет вывести данные в виде таблицы или дерева. Это может быть список элементов справочника, список документов, табличная часть справочника или документа, таблица значений и т.д.

Есть возможность выводить в табличное поле иерархические данные в виде вложенных папок или в виде дерева.

В Конфигураторе разработчик задает перечень колонок табличного поля, но пользователь при работе может самостоятельно настроить порядок и расположение колонок для себя.

Обратите внимание на режим изменения ширины колонок. Если вы просто меняете мышкой ширину колонки, то суммарная ширина всех колонок остается прежней, а если при этом удерживать клавишу Ctrl, то меняется.

Пользователь может отсортировать динамический список по реквизиту, установить произвольный отбор. Для этого применяется следующее окно, вызываемое из контекстного меню табличного поля:

Система 1C:Предприятие 8.0 имеет широкие возможности по оформлению табличного поля. Можно указывать цвет фона и текста шапки, колонок, ячеек и подвала, выводить картинки в ячейки, задавать чередование фона для строк, изменять стиль и цвет рамки Будьте внимательны, когда устанавливаете свойства колонки и ячейки, поскольку у табличного поля в целом, у колонки и каждой ячейки — у всех свой набор свойств.

Некоторые свойства табличного поля можно устанавливать программно, например, следующий фрагмент для табличного поля тпНоменклатура включает режим показа с чередованием фона строк:

Поле = ЭлементыФормы.тпНоменклатура;

Поле.ЧередованиеЦветовСтрок = Истина;

У табличного поля есть несколько событий, которые можно использовать для вызова собственных процедур-обработчиков.

Ниже приведены наиболее часто используемые события табличного поля:

Выбор

Возникает при двойном щелчке мыши или нажатии клавиши Enter на ячейке табличного поля.

ВыборЗначения

Вызывается при выборе значения из списка в режиме выбора. Выбор значения также может быть инициирован кнопкой на панели инструментов или через контекстное меню.

ПриАктивизацииСтроки

Возникает при смене текущей строки табличного поля, т.е. при установке на нее курсора, если раньше текущей была другая строка.

ПриВыводеСтроки

Возникает при выводе строки в табличное поле. В процедуре-обработчике события допускается изменение оформления как строки в целом, так и каждой ячейки в отдельности.

ПередУдалением

Возникает перед удалением строки или группы строк табличного поля. В процедуре-обработчике можно отказаться от удаления строки.

ПередНачаломИзменения

Возникает перед началом интерактивного изменения строки табличного поля.

Обратите внимание на событие ПриВыводеСтроки, которое возникает при формировании каждой строки табличного поля.В этом событии можно заполнить некоторые ячейки, а также изменить оформление отдельной ячейки и всей строки.

Например, требуется вывести список валют в табличное поле Список с указанием текущего курса, который хранится в регистре сведений КурсыВалют. Тогда это можно сделать следующим образом:

Процедура СписокПриВыводеСтроки(Элемент,ОформлениеСтроки, ДанныеСтроки)
    //берем текущую валюту из параметра ДанныеСтроки
    ТекВалюта = ДанныеСтроки.Ссылка;
    //ссылка на регистр сведений
    РегКурсы = РегистрыСведений.КурсыВалют;
    //ссылка на оформление ячейки Курс
    ЯчейкаКурс = ОформлениеСтроки.Ячейки.Курс;
    //считываем курс из регистра сведений и выводим в ячейку
    Отбор = Новый Структура("Валюта",ТекВалюта);
    Курс = РегКурсы.ПолучитьПоследнее(,Отбор).Курс;
    ЯчейкаКурс.УстановитьТекст(Курс);
КонецПроцедуры

В 1C:Предприятии 8.0 нет текстовых колонок, в которых можно вызвать функцию, как это было в версии 7.7. Вместо них предлагается использовать событие ПриВыводеСтроки, в котором можно выводить информацию в ячейки и управлять их внешним видом, используя объекты ОформлениеСтроки и ДанныеСтроки.

У объекта ОформлениеСтроки есть свойство Ячейки, которое содержит коллекцию объектов ОформлениеЯчейки.

Например, выведем справочник Номенклатура с указанием остатка товара на складе, а для тех товаров, у которых остаток меньше 10, установим предупреждающий цвет фона. Это позволит контролировать остатки товаров в реальном времени и вовремя заказывать дефицитные товары:

Процедура СписокПриВыводеСтроки(Элемент,ОформлениеСтроки,ДанныеСтроки)
    СтруктураОтбора = Новый Структура("Номенклатура");
    СтруктураОтбора.Номенклатура = ДанныеСтроки.Ссылка;
    РегОстатки = РегистрыНакопления.УчетНоменклатуры;
    //считываем остаток из регистра
    тзОстатки = РегОстатки.Остатки(,СтруктураОтбора,
    "Номенклатура","Количество"),
    Если тзОстатки.Количество() > 0 Тогда
        ОстатокТовара = тзОстатки[0].Количество;
        ЯчейкаОстаток = ОформлениеСтроки.Ячейки.Остаток;
        ЯчейкаОстаток.ОтображатъТекст = Истина;
        ЯчейкаОстаток.Текст = ОстатокТовара;
        Если ОстатокТовара < 10 Тогда
            ЯчейкаОстаток.ЦветФона = Новый Цвет(255,230,230);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

На практике остаток товара лучше сравнивать не с конкретным значением, а с критическим уровнем запаса каждого товара, который определяется исходя из потребности в данном товаре.

Заметим, что такой сервис предъявляет довольно высокие требования к производительности компьютера, потому что при каждом обновлении списка заново считываются данные из регистра, поэтому так делать крайне не рекомендуется. Этот пример был специально приведен, чтобы показать, как не надо делать. Для больших динамических списков было бы более рационально спроектировать специальный отчет Остатки с периодическим обновлением.

Любое табличное поле пользователь может вывести в табличный документ для печати или текстовый документ. Это возможно из контекстного меню с помощью пункта «Вывести список». При выводе табличного поля учитываются текущие отбор и сортировка списка. Есть возможность вывести только выделенные строки, а также указать, выводить или нет подчиненные объекты, например, элементы иерархического справочника нижележащих уровней.

Поле списка

Поле списка предназначено для вывода различного рода списков и тесно связано с объектом СписокЗначений. Фактически поле списка — это элемент управления для визуального представления списка значений.

При размещении поля списка в форме создается новый реквизит формы типа СписокЗначений, через который можно добавлять и удалять значения в списке. В свойствах задается форматирование списка, режим вывода пометки, возможность отображения картинок и т.д.

Следующий пример добавляет в поле списка три значения и включает режим вывода пометок:

сзСотрудники.Добавить("Иванов");
сзСотрудвики.Добавить("Петров");
сзСотрудники.Добавить("Сидоров",Истина);
ЭлементыФормы.сзСотрудники.ОтображатьПометку = Истина;

Поле списка имеет события, которые можно перехватывать с помощью процедур-обработчиков и выполнять полезные действия:

Выбор

Возникает при выборе строки из поля списка.

ПриАктивизацииСтроки

Возникает при смене текущей строки поля списка.

ПриИзмененииФлажка

Возникает при изменении пометки строки поля списка.

Поле выбора

Поле выбора позволяет выбрать одно значение из нескольких возможных, которые обычно задаются еще на этапе разработки.

Перечень возможных значений указывается в свойстве «Строки списка выбора». Программно список возможных значений поля выбора доступен через свойство СписокВыбора, представляющее собой объект типа СписокЗначений.

Через свойство Значение можно считывать и устанавливать значение, выбранное в поле выбора. Конечно, у поля выбора существуют события, например, НачалоВыбора, ОбработкаВыбора, ПриИзменении, Очистка и др.

Панель

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

В 1С:Предприятии 8.0 панель может располагаться в любом месте формы, а на страницу одной панели можно поместить вложенную панель.

Закладки панели могут располагаться сверху, снизу или сбоку.

Для бокового расположения может быть выбрана горизонтальная или вертикальная ориентация текста. Если закладок много и все они не помещаются на экране, то автоматически включается прокрутка, или их можно разместить в несколько рядов. В заголовок закладки можно добавить картинку или использовать только картинку без текста.

Стоит отметить, что у самой формы в целом есть панель, которая имеет как минимум одну страницу. Разработчик может добавлять собственные страницы в панель формы. При программировании на встроенном языке главная панель формы доступна через свойство формы Панель.

Внимание! Не путайте три разных термина: «панель формы», «командная панель» и «панель интерфейса». Панель формы обеспечивает доступ к страницам, действующим на всю форму. Командная панель располагается в форме и содержит кнопки и подменю. Панель интерфейса является составной частью интерфейса как объекта конфигурации и представляет главное меню и панели инструментов конфигурации.

Страницы панели могут существовать и без закладок, если в свойстве панели «Отображение закладок» выбрано значение «Не отображать». Тогда выбор текущей страницы должен осуществляться средствами встроенного языка, например:

Панель.ТекущаяСтраница = Панель.Страницы["СтрКартинка"];

Разберем еще одно важное свойство РаспределятьПоСтраницам.

Это свойство типа «булево», которое определяет, изменяется ли состав отображаемых на панели элементов управления при переключении между страницами. Если установлено значение Ложь, то видимостью элементов управления должен управлять разработчик средствами встроенного языка, перехватывая событие ПриСменеСтраницы. Это событие может быть также использовано для реализации переключения отбора в виде закладок.

Внимание! При снятии флажка РаспределятьПоСтраницам все элементы формы, располагающиеся на других страницах, кроме текущей, будут удалены.

В 1С:Предприятии 8.0 можно программно управлять страницами панели, добавляя или удаляя их, изменять порядок их следования и т.д. В следующем примере на панель формы добавляются страницы, а затем меняется их порядок.

Процедура ПриОткрытии()
    //очищаются все страницы панели со всеми элементами управления,
    //после выполнения этого метода
    //панель имеет одну страницу и одну закладку
    Панель.Страницы.Очистить();
    //индекс первой страницы равен 0, изменим для нее имя и заголовок
    Панель.Страницы[0] Имя = "СтраницаОсновные";
    Панель.Страницы[0].Заголовок = "Основные";
    //добавим вторую страницу, ее индекс будет 1
    Панель.Страницы Добавить("СтраницаКартинка","Картинка",,);
    //добавим третью страницу, ее индекс будет 2
    Панель.Страницы.Добавить("СтраницаПрочее","Прочее",,);
    //сдвигаем третью страницу "Прочее" (с индексом 2)
    //на 1 позицию к началу
    Панель.Страницы.Сдвинуть(2,-1);
    //удалим страницу Прочее
    // в метод Удалить может передаваться номер или сама страница
    Панель Страницы Удалить(Панель.Страницы["СтраницаПрочее"]);
    //для страницы Картинка изменим текст заголовка
    //доступ к странице возможен по имени как к свойству коллекции
    Панель.Страницы.СтраницаКартинка.Заголовок = "Изображение";
КонецПроцедуры

Поле табличного документа

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

Следующие элементы управления используются не так часто и будут описаны очень кратко. Более подробные сведения о них приведены в документации.

Рамка

Рамка предназначена для визуальной группировки логически связанных элементов управления. Для рамки можно установить заголовок, цвет текста, тип и цвет рамки. Эти свойства можно также устанавливать программно. Рамка может также использоваться в качестве линии, что можно задать в ее свойстве «Рамка».

Картинка

Картинка позволяет вывести в форму графическое изображение или анимацию в формате GIF. Встроенный язык имеет средства для загрузки картинок из файлов. Кроме того, картинки могут храниться в базе данных в полях типа ХранилищеЗначений.

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

В конфигурации может существовать библиотека картинок, которая располагается в ветви «Общие картинки» в дереве конфигурации. Методику работы с общими картинками можно найти в документации. Здесь отметим, что можно выбирать картинку из файла (поддерживаются все основные графические форматы: bmр, jpg, gif, tif, wmf, ico). Картинки некоторых форматов можно редактировать в специальном Редакторе картинок.

Диаграмма

Элемент управления Диаграмма предназначен для показа статистических данных в наглядном графическом виде, что очень удобно для анализа. Диаграмма в 1C:Предприятии 8.0 может располагаться прямо в экранной форме, а не только в печатной форме(табличном документе).

Существует возможность задать тип диаграммы: график, плоская и объемная гистограмма, круговая, изометрическая, биржевая и др. У диаграммы также может быть легенда, содержащая имена серий.

Кроме всего прочего, на диаграмме работают расшифровки. Если два раза щелкнуть мышью на точке графика (или столбике), то можно получить более детальную информацию, конечно, если это предусмотрено в конфигурации.

Индикатор

Индикатор показывает ход выполнения длительного процесса.

Рекомендуется всегда его использовать во время выполнения процедур, требующих длительного времени. На пользователя это действует благотворно: он видит, что процесс идет, меньше нервничает и не прервет, чего доброго, работу программы.

Но все-таки для того, чтобы пользователь мог прервать чрезмерно затянувшийся процесс (или «зависшую» программу), в теле цикла необходимо вызывать процедуру ОбработкаПрерыванияПользователя, подробнее о которой написано в документации.

Полоса регулирования

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

Поле календаря

Элемент управления ПолеКалендаря позволяет в наглядном режиме выбирать дату. Красным квадратом выделяется текущая дата. Если поле календаря расширить, то оно автоматически отразит большее количество месяцев.

Поле текстового документа

Поле текстового документа позволяет отобразить и редактировать в форме произвольный текст. Для этого элемента управления можно задать свойство «Расширение» из следующих возможных вариантов: HTML, встроенный язык и язык запросов. Тогда при отображении текста будут применены характерная цветовая палитра и другие встроенные возможности для данного содержимого. Например, для языка запросов будут выделяться ключевые слова ВЫБРАТЬ, ИЗ, ГДЕ и т.д., а из контекстного меню можно будет вызвать Конструктор запросов.

Поле HTML-документа

Данный элемент управления предназначен для отображения HTML-страниц. Это могут быть как локальные страницы, так и страницы в Интернете. У этого элемента управления есть метод Перейти, который позволяет указать адрес страницы (URL) или HTML-макет, хранящийся в конфигурации.

ЭлементыФормы.ПолеНТМLДокумента.Перейти("http://www.lc.ru");

После того, как HTML-документ будет полностью загружен и отображен, возникнет событие ДокументСформирован. Оно может быть обработано в программном модуле для выполнения каких-либо действий. Система 1С:Предприятие 8.0 предоставляет доступ к HTML-документу как к СОМ-объекту, для чего предназначено свойство Документ.

Разделитель

Разделитель позволяет изменять размеры привязанных к нему элементов управления, например, табличных полей, списков и т.д.

Разделитель может быть невидимым. Подробнее про разделители рассказывается в документации.

ActiveX

Кроме встроенных элементов управления, в 1С:Предприятии 8.0 есть возможность расположить в форме ActiveX-компоненты, написанные на других языках. Из таких компонентов можно назвать Windows Media Player, Microsoft Office Pivot Table и др.


Привязка границ

В процессе работы пользователи часто меняют размеры формы: уменьшают или увеличивают их. При этом общая структура формы должна сохраняться, чтобы максимально использовать доступное пространство формы для отображения информации.

Для нормальной работы с формой при изменении размеров поведение различных элементов управления должно быть разным.

Некоторые элементы управления должны оставаться на месте, другие должны перемещаться вместе с границами, а третьи должны изменить свой размер. Для реализации такого поведения в 1С:Предприятии 8.0 существует механизм привязок границ элементов управления.

По умолчанию все новые формы используют автоматическую привязку границ, но для более точного задания поведения элементов формы можно использовать ручную привязку, которая бывает простой или сложной.

Если открыть экранную форму документа РасходнаяНакладная в режиме «Предприятие» и изменить ей размеры, то мы увидим, что при увеличении ширины формы, размеры полей для ввода данных увеличиваются, некоторые надписи перемещаются, размер табличного поля увеличивается. Привязки границ элементов управления настраиваются в Конфигураторе в редакторе форм.

Для наглядного отображения текущих привязок выберите пункт меню «Форма -> Показать привязки», тогда в форме появятся красные и синие стрелки, некоторые из которых являются пунктирными:

Ниже поясняется назначение стрелок:

  • • Сплошная стрелка — это жесткая привязка к границе. При изменении размеров формы расстояние до границы всегда сохраняется.

  • • Пунктирная стрелка — это привязка к границе с сохранением пропорций. В этом случае граница элемента стремится к привязке пропорционально расстоянию до нее.

  • • Красные стрелки идут от границ панели или формы.

  • • Синие стрелки идут от элементов управления.

  • • Сама стрелка указывает направление влияние привязки, т.е. какую границу толкнет или потянет за собой данная привязка при изменении размеров формы.

Устанавливать привязки можно сразу для нескольких элементов управления, выделив их мышью. Редактирование привязок для конкретного элемента или группы элементов управления производится в специальном окне «Привязка границ...», запускаемого из палитры свойств по ссылке «Установить правила».

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

Существуют следующие способы привязки (на примере горизонтальных привязок):

  • • к левой границе — элемент целиком перемещается вместе с перемещением левой границы области;

  • • к правой границе — элемент целиком перемещается вместе с перемещением правой границы области;

  • • растягивать — при горизонтальном изменении размеров области ширина элемента изменяется так, что расстояние до границ области остается постоянным;

  • • пропорционально — при изменении размеров области размеры элемента изменяются так, что соотношение расстояний от правой границы элемента до левой и правой границы области остается постоянным;

  • • к центру — правая и левая границы элемента привязываются к центру формы или другого элемента управления;

Аналогично производится привязка при вертикальном изменении размеров.

Существуют более сложные способы привязки границ, в том числе с использованием разделителей. После настройки привязок рекомендуется проверить форму с помощью тестового окна, которое вызывается по нажатии клавиш Ctrl-R или кнопки на панели редактора форм. За более подробной информацией по привязкам обращайтесь к документации.


Приемы программирования

В данном разделе будут рассмотрены свойства, методы и события объекта Форма, с помощью которого можно управлять внешним видом и поведением формы средствами встроенного языка.

Открытие и закрытие форм

Формы обычно открываются системой автоматически, и разработчику не нужно прикладывать дополнительных усилий для открытия форм из пунктов меню, панелей инструментов или при заполнении реквизитов путем выбора элемента справочника или документа. Однако разработчик может программно открывать и закрывать формы, используя методы объекта Форма. Предварительно он должен получить форму нужного ему объекта, например:

Процедура ОткрытьФормуПодчиненногоСправочника()
    СпрРасчСчета = Справочники.РасчетныеСчета;
    //сначала получим основную форму списка справочника
    //текущая форма будет являться владельцем для нее
    ФормаРС = СпрРасчСчета.ПолучитьФормуСписка(,ЭтаФорма);
    //если текущая форма будет закрыта,
    //то и дочерние формы тоже закроются
    ФормаРС.ЗакрыватьПриЗакрытииВладелыда = Истина;
    //открыть новую форму или активизировать уже открытую
    Если ФормаРС.Открыта() Тогда
        ФормаРС.Активизировать();
    Иначе
        ФормаРС.Открыть();
    КонецЕсли;
КонецПроцедуры

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

Необходимо понимать разницу между событиями, возникающими при открытии формы:

ПередОткрытием

Событие возникает перед открытием формы, до показа ее на экране. В обработчике события можно отказаться как от открытия формы, так и от стандартной обработки при открытии объекта.

ПриОткрытии

Событие возникает при открытии формы, до показа окна пользователю. В обработчике этого события отказаться от открытия формы уже нельзя. Между событиями ПередОткрытием и ПриОткрытии выполняются различные стандартные системные действия, которые могут зависеть от основного реквизита формы. Наличие этих двух обработчиков позволяет выполнить какие-то действия до системных и после.

ПриПовторномОткрытии

Событие возникает при открытии уже открытой формы. При активизации открытой формы данное событие не возникает.

Форма может быть открыта в модальном режиме с использованием метода ОткрытьМодально. В этом случае пользователь должен сначала закрыть модальную форму, прежде чем продолжать работу с другими окнами. При этом работа программы будет приостановлена до закрытия модального окна, которое может быть закрыто интерактивно или автоматически по истечении установленного времени.

В модуле формы с помощью свойства МодальныйРежим можно определить, что форма открыта в модальном режиме. Ниже открывается в модальном режиме общая форма ВыборОснования.

При ее закрытии она возвращает объект ДокументСсылка, содержащий выбор пользователя.

ВыбЯок = ПолучитьОбщуюФорму("ВыборОснования").ОткрытьМодально();

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

В метод Закрыть можно передать параметр закрытия, который будет являться возвращаемым значением, если форма была открыта с помощью метода ОткрытьМодально.

Формы для выбора

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

Обычно формы для выбора содержат табличное поле со списком элементов справочника или документов. При двойном щелчке на строке (или нажатии клавиши Enter) выбранное пользователем значение передается в родительскую форму.

Рассмотрим свойства, методы и события, имеющие важное значение для форм выбора:

• Свойство РежимВыбора определяет поведение формы при выборе элемента из главного списка формы, т.е. списка, связанного с ее основным реквизитом. Если оно установлено в значение Истина, то форма работает в режиме выбора, иначе — в обычном режиме.

• Свойство МножественныйВыбор разрешает или запрещает выбор нескольких строк из табличного поля. Несколько строк можно выделить мышью, удерживая клавишу Ctrl.

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

Свойство ЗакрыватьПриВыборе содержит признак того, что форму необходимо закрыть после осуществления выбора значения. Если это свойство установить в значение Ложь, то можно использовать форму для выбора нескольких значений.

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

Событие ОбработкаВыбора у формы возникает при выборе объекта в одной из подчиненных форм или при вызове в одной из подчиненных форм метода ОповеститьОВыборе.

Внешний вид формы

При проектировании форм палитра свойств позволяет настраивать внешний вид формы. Эти же свойства могут быть считаны или установлены программно для изменения внешнего вида формы «на лету», при выполнении программы.

Рассмотрим основные свойства формы, определяющие ее внешний вид:

Заголовок

Содержит текст заголовка формы. Обратите внимание, что это свойство, а не метод, как было в версии 7.7.

АвтоЗаголовок

Если это свойство содержит значение Истина, то к заголовку формы будет автоматически добавляться информация, определяемая основным реквизитом формы.

Ширина, Высота,

Эти свойства определяют ширину и высоту формы в пунктах (логических единицах).

ИзменениеРазмера,

Разрешает или запрещает изменять размер.

ИзменениеРазмера,

Разрешает или запрещает изменять размер.

ИмяСохраненияПоложенияОкна,

Содержит имя для сохранения размеров и положения окна данной формы. Параметры окна, настроенные и сохраненные с данным именем, впоследствии восстанавливаются при следующем показе формы.

ПоложениеОкна,

Определяет положение окна в прикрепленном состоянии. Вариант прикрепления можно установить окну только в том случае, если он не был ранее сохранен в профиле.

СостояниеОкна,

Определяет состояние окна формы. Данное состояние можно установить окну только в том случае, если состояние окна не было ранее сохранено в профиле. Соединяемое Окно, Окно способно соединяться с другими окнами.

Элементы формы

Форма позволяет обращаться к расположенным в ней элементам управления, для чего предназначено свойство ЭлементыФормы.

В 1C:Предприятии 8.0 можно даже программно добавлять и удалять элементы управления в форму при выполнении программы, чего не было в версии 7.7.

Обращение к элементу управления обычно производится по его имени через коллекцию ЭлементыФормы, например:

КнопкаОК = ЭлементыФормы.КнопкаОК;
тпСотр = ЭлементыФормы.ТабдичноеПолеСотрудникиСписок;
НадписьТипЦен = ЭлементыФормы["ТипЦен"];

С помощью методов Добавить, Удалить, Очистить можно редактировать список элементов управления «на лету». Переустанавливая свойства элементов управления, можно изменять их внешний вид и поведение.

Внимание! Индексация элементов в коллекции начинается с 0.

У элементов управления, расположенных в форме, появляются дополнительные свойства и методы. Ниже показаны наиболее важные дополнительные свойства таких элементов управления:

Имя

Имя элемента управления, например, «КнопкаОК».

Данные

Это свойство содержит имя связанного реквизита формы или реквизита объекта. Для элементов управления, связанных с реквизитами объектов, изменение значения в элементе управления автоматически влечет изменение значения связанного реквизита.

ТипЗначения

Это свойство описывает допустимые типы значений для элемента управления.

АвтоКонтекстноеМеню

Если в этом свойстве содержится значение Истина, то для элемента управления будет использовано автоматически сформированное контекстное меню, в противном случае необходимо указать свойство КонтекстноеМеню.

КонтекстноеМеню

Значением свойства является элемент управления типа КоманднаяПанель или одна из его кнопок-подменю.


Важные отличия от версии 7.7

Появился редактор картинок. Картинки могут располагаться в надписях, полях ввода и других элементах управления.

Кнопки, картинки и надписи могут служить гиперссылками. В этом режиме они реагируют на одинарный щелчок мыши (возникает событие Нажатие).

Предопределенные процедуры версии 7.7 теперь называются процедурами-обработчиками событий и в общем случае могут иметь имена, отличающиеся от имен событий. Это относится ко всем процедурам-обработчикам, кроме расположенных в модулях объектов и модуле приложения. Назначение обработчика для события производится в свойствах формы или элемента управления.

Для поля ввода можно легко добавить кнопки очистки, открытия значения, выбора из списка и т.д.

У полей ввода появилось свойство «Автоотметка незаполненного», которое позволяет включить вывод пунктирной красной линии для незаполненных полей.

Появилась функция «ввод по строке». Например, если пользователь наберет первые буквы наименования, то в поле ввода автоматически подставится элемент справочника.

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

Новый механизм стилей позволяет гибко настроить оформление всей конфигурации и отдельных форм.

Конфигурация может быть многоязычной, т.е. для каждого элемента интерфейса можно задавать заголовок сразу на нескольких языках.


Коллекция значений

Глава 5.

Коллекции значений

Коллекция представляет собой не хранящуюся в базе данных совокупность значений или объектов — элементов коллекции. В 1С:Предприятии 8.0 работа с коллекциями была унифицирована:

добавление, удаление и обход элементов всех коллекций производится однотипным образом.

Некоторые коллекции называются универсальными, потому что разработчик может их создавать средствами встроенного языка для решения своих задач.

К универсальным коллекциям значений относятся следующие:

  • • массив,

  • • список значений,

  • • таблица значений,

  • • дерево значений,

  • • структура,

  • • соответствие.

Общее у этих объектов то, что они содержат несколько значений(элементов коллекции), позволяют добавлять и удалять значения.

Они не хранятся в базе данных, а используются для работы с временными наборами данных для вспомогательной обработки, группировки и анализа информации.

Все эти объекты создаются средствами встроенного языка с помощью ключевого слова Новый. Массив, структура и соответствие имеют конструкторы с параметрами, которые определяют начальное состояние объекта, например, количество элементов в массиве.

Для универсальных коллекций значений доступен обход элементов с помощью конструкции «Для Каждого». Также возможно обращение к элементу с помощью оператора [...] (квадратные скобки), куда в качестве аргумента обычно передается индекс элемента, а для структуры или соответствия — ключ элемента коллекции.

Внимание! Индексация элементов коллекций всегда начинается с 0.

В системе 1С:Предприятие 8.0 есть и другие коллекции, которые являются свойствами объектов. Такие коллекции называются специализированными или коллекциями-свойствами. Их нельзя создать с помощью ключевого слова Новый, а можно только использовать.

Например, свойство Колонки элемента управления ТабличноеПоле представляет собой коллекцию колонок. Разработчик может средствами встроенного языка добавлять или удалять колонки, менять их порядок, изменять заголовок и т.д.

Если коллекция-свойство является фиксированной, то не допускается редактировать список ее элементов.

Ниже будут рассмотрены только универсальные коллекции значений.


Коллекция значений

Массив

Массивы представляют собой пронумерованную совокупность значений любого типа. К элементу массива можно обращаться по индексу через оператор [...], причем индекс первого элемента равен 0. В качестве значений элементов массива могут быть другие массивы, что, в частности, позволяет организовывать многомерные массивы.

Продемонстрируем на примерах возможности работы с массивами:

Создание нового массива производится следующим образом:

Мас = Новый Массив; //одномерный массив без элементов
Мас2 = Новый Массив(10); //одномерный массив из 10 элементов
Мас3 = Новый Массив(4,5); //массив с двумя измерениями

При указании нескольких параметров конструктора фактически создается массив, элементами которого являются другие массивы, что является аналогом многомерного массива.

Для добавления и удаления элементов массива можно использовать методы объекта Массив:

Мас = Новый Массив; //одномерный массив без элементов
Мас.Добавить("Иванов"); //элемент будет иметь индекс 0
Мас.Добавить("Петров"); //индекс 1
Мас.Добавить("Сидоров"); //индекс 2
//после вставки нового элемента Иванов и Петров будут сдвинуты ниже
Мас2.Вставить(0,"Сидоров");
//удаляем Сидорова (Иванов и Петров сдвигаются обратно)
Мас2.Удалить(0);
Мас2 = Новый Массив(4,5); //массив с двумя измерениями
Мас2[0][0] = "Иванов";
Мас2[0][1] = "Петров";
//после вставки нового элемента Иванов и Петров будут сдвинуты ниже
Мас2[0].Вставить(0,"Сидоров");
//следующий элемент будет относиться ко 2-му измерению
//и будет являться 6-м (индекс = 5)
//при создании массива во 2-м измерении
//было создано 5 элементов, имеющих значение Неопределено
Мас2[1].Добавить{"Петров");

Перебор элементов массива возможен с использованием оператора [...] или цикла «Для Каждого»:

//1-й вариант
Для Каждого эл Из Мас Цикл
    Сообщить(эл);
КонецЦикла;
//2-й вариант
Для н = 0 По Мас.ВГраница() Цикл
    Сообщить(Мас[н]);
КонецЦикла;

У объекта Массив есть следующие методы:

ВГраница

Возвращает наибольший индекс в массиве, равный количество элементов минус 1. Если количество элементов массива равно 0, возвращается -1 (минус единица).

Количество

Возвращает количество элементов массива.

Добавить

Добавляет элемент в конец массива.

Вставить

Вставляет значение в массив по указанному индексу.

Удалить

Удаляет значение из массива по указанному индексу.

Очистить

Удаляет все значения из массива.

В 1С:Предприятии 8.0 в массив можно загружать данные или выгружать данные из него в другие коллекции значений. Это реализуется с помощью соответствующих методов других коллекций значений. Например, объект СписокЗначений имеет методы ВыгрузитьЗначения и ЗагрузитьЗначения, которые работают с массивом. Аналогично действуют методы ВыгрузитьКолонку и ЗагрузитьКолонку объекта ТаблицаЗначений.


Структура и соответсвие

Структура и соответствие

Структура и соответствие являются динамическими наборами данных — коллекциями значений. Каждый элемент такой коллекции представляет собой пару «ключ» и «значение». Ключи структуры и соответствия уникальны, поэтому они однозначно идентифицируют элемент коллекции.

Внимание! В структуре ключи могут быть только строковые и должны подчиняться правилам именования переменных. В соответствиях ключи могут быть почти любого типа.

Структуры часто применяются в методах объектов для указания отборов, например:

?

Структуры можно использовать для передачи списка параметров(в версии 7.7 для этой цели часто применялся список значений и его методы Установить и Получить):

Параметры = Новый Структура("ДатаНач,ДатаКон");
Параметры.ДатаНач = ВыбДата;
Параметры.ДатаКон = ДобавитьМесяц(ВыбДата,1);
Если ВыбТипОтчета = 0 Тогда
    Параметры.Вставить("ТипОтчета",ВыбТипОтчета);
КонецЕсли;
глСформироватьОбороты(Параметры);

Можно перебрать элементы структуры или соответствия с помощью конструкции «Для Каждого». Каждый элемент коллекции является объектом специального типа КлючИЗначение:

Для Каждого парам Из Параметры Цикл
    ИмяПараметра = парам.Ключ;
    Значение = парам.Значение;
КонецЦикла;

Для структуры можно обращаться к элементам коллекции через точку, поскольку ключи являются свойствами структуры:

НачДата = парам.ДатаНач;
КонДата = парам.ДатаКон;

Для соответствия такое обращение через точку невозможно, так как ключи соответствия могут быть самого разнообразного типа.

С помощью метода Свойство можно получить значение заданного ключа или убедиться, что его в структуре нет, например:

Найдено = парам.Свойство("ТипОтчета",ВыбТипОтчета);
Если Найдено Тогда
    СформироватьПользовательскийОтчет(ВыбТипОтчета);
Иначе
    СформироватьОтчетПоУмолчанию();
КонецЕсли;

У соответствия нет метода Свойство и обращение производится с помощью оператора [...] или метода Получить:

ТоварАналог = соотвАналоги[Товар].Значение;


Список значений

Список значений — это аналог одномерного массива, который предназначен в основном для решения интерфейсных задач, например, при использовании элементов управления СписокВыбора и ПолеВыбора.

В списке значения могут храниться значения разных типов, хотя можно наложить ограничение с помощью свойства ТипЗначения.

Список значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.

Список значений можно представить себе как таблицу, содержащую следующие колонки:

• Значение — собственно хранимое значение.

• Представление — пользовательское представление значения, которое будет показано при выводе значения на экран, например, в диалоге выбора значения из списка. Если представление не указано, то оно формируется системой автоматически.

• Пометка - пометка (флажок), связанная со значением. Может быть использована для отметки некоторых значений из списка.

• Картинка — графическое изображение, связанное с данным значением.

В 1С:Предприятии 8.0 объект СписокЗначений состоит из объектов типа ЭлементСпискаЗначений, которые имеют свойства Значение, Представление, Пометка и Картинка.

Создание новых списков значений производится с помощью ключевого слова Новый:

сзСотр = Новый СписокЗначений;

Ниже демонстрируются приемы добавления и удаления элементов списка значений:

сзСотр.Очистить(); //удалим все элементы

//У следующего элемента индекс 0, представление "Иванов Иван"

сзСотр.Добавить("Иванов","Иванов Иван");

//У следующего элемента будет индекс 1, представление "Петров Петр"

//и установлена пометка

сзСотр.Добавить("Петров","Петров Петр", Истина);

сзСотр.Удалить(1); //удалить 2-й элемент, т.е. Петрова

сзСотр.Вставить(0,"Сидоров"); //Иванов сдвигается ниже

сзСотр.Сдвинуть(1,-1); //сдвинем Иванова обратно к началу

Обращение к элементу списка значений производится по индексу через оператор [...] или с помощью метода Получить, например:

сзСотр[0].Значение = "Кузнецов";

Перебор элементов списка значений производится следующим образом:

//1-й вариант
Для Каждого эл Из сзСотр Цикл
    Сообщить(Эл.Значение);
КонецЦикла;

//2-й вариант
Для н = 0 По сзСотр.Количество()-1 Цикл
    Сообщить(сзСотр[н].Значение);
КонецЦикла;

В списке значений можно искать заданное значение:

НайденныйЭлементСписка = сзСотр.НайтиПоЗначению("Иванов");
Если НайденныйЭлементСписка = Неопределено Тогда
    Сообщить("Элемент найден!");
КонецЕсли;

Как уже говорилось выше, в списке значений могут быть пометки, которые представляют собой флажки (значения типа «булево»). С помощью пометок несколько значений списка могут быть выделены, и тем самым они будут отличаться от остальных. Назначение пометок определяется проектной логикой.

Разработчик может программно считывать и устанавливать пометки у элементов списка значений:

сзСотр = Новый СписокЗначений;
сзСотр.Добавить("Иванов",Истина); //пометка установлена
сзСотр.Добавить("Петров"); //пометка не установлена
сзСотр.Добавить("Сидоров"); //пометка не установлена
ВыборПроизведен = сзСотр.ОтметитьЭлементы("Укажите сотрудников");
Если ВыборПроизведен Тогда
    Для Каждого эл Из сзСотр Цикл
        Если эл.Пометка Тогда
            Сообщить("Отмечен сотрудник " + эл.Значение);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Методы ВыбратьЭлемент и ОтметитьЭлементы открывают диалоговое окно для пользователя, в котором он может выбрать один элемент или расставить пометки, тем самым выбрав несколько элементов.

Элементы списка значений могут быть легко отсортированы по значению или по представлению:

сзСотр.СортироватьПоЗначению(НаправлениеСортировки.Возр);
сзСотр.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);

В список значений можно загрузить значения из массива и выгрузить значения в массив, например:

мас = Новый Массив;
мас.Добавить("Иванов");
мас.Добавить("Якушин");
мас.Добавить("Сидоров"};
сзСотр.ЗагрузитьЗначения(мас) ;
сзСотр.СортироватьПоЗначению();
мас2 = сзСотр.ВыгрузитьЗначения();

При размещении в форме поля списка автоматически создается новый реквизит формы типа СписокЗначений. Через этот реквизит можно управлять содержимым списка, добавлять или удалять элементы, расставлять пометки, задавать картинки. Следует понимать, что ПолеСписка — это не список значений, а элемент управления, имеющий собственный набор свойств и методов.

Со списком значений также тесно связан элемент управления ПолеВыбора. Его свойство СписокВыбора представляет собой список значений, из которого пользователь может выбрать одно значение.


Таблица значений

Таблица значений — это не сохраняемый в базе данных объект, предназначенный для создания динамических наборов данных.

Таблица значений состоит из строк и колонок. В отличие от списка значений, таблица значений имеет структуру, которую определяет разработчик.

Объект ТаблицаЗначений имеет много полезных методов для обработки данных. Разработчик средствами встроенного языка может добавлять и удалять строки и колонки, перебирать строки, искать значение, сортировать по любым колонкам и выполнять другие операции.

При создании новой таблицы значений в нее обычно добавляются колонки:

тзТовары = Новый ТаблицаЗначений;
тзТовары.Колонки.Добавить("Ссылка");
тзТовары.Колонки.Добавить("Наименование");
тзТовары.Колонки.Добавить("Цена");
тзТовары.Колонки.Добавить("Количество");

У таблицы значений есть свойство Колонки, которое представляет собой коллекцию колонок и позволяет добавлять, удалять и менять их порядок.

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

Функция СоздатьОписаниеТипов(НазваниеТипа,Длина,Точность="")
    мас = Новый Массив;
    мас.Добавить(Тип(НазваниеТипа));
    Если Точность = "" Тогда
        КвалифСтроки = Новый КвалификаторыСтроки(Длина,
        ДопустимаяДлина.переменная)
    Иначе
        КвалифЧисла = Новый КвалификаторыЧисла(ДопустимыйЗнак.Любой,
        Длина,Точность);
    КонецЕсли;
    Возврат Новый ОписаниеТипов(мас, квалифСтроки, КвалифЧисла);
КонецФункции

тзТовары = Новый ТаблицаЗначений;
ТипКолСсылка = СоздатьОписаниеТипов("СправочникСписок.Номенклатура");
тзТовары.Колонки.Добавить("Ссылка", ТипКолСсылка,"Товар",5);
ТипКолНаим = СоздатьОписаниеТипов("Строка",50);
тзТовары.Колонки.Добавить("Наименование", ТипКолНаим);
ТипКолЦена = СоздатьОписаниеТипов("Строка",15,2);
тзТовары.Колонки.Добавить("Цена", ТипКолЦена, "Цена",15);
ТипКолКолич = СоздатьОписаниеТипов("Строка",15,4);
тзТовары.Колонки.Добавить("Количество",ТипКолКолич,"Кол-во",15);

При работе со строками таблицы значений необходимо понимать, что строка — это объект типа СтрокаТаблицыЗначений. Поэтому добавление строк в таблицу значений производится следующим образом:

//удаляем все строки из таблицы (колонки остаются)
тзТовары.Очистить();
СпрВыборка = Справочники.Номенклатура.Выбрать();
Пока СпрВыборка.Следующий() Цикл

    НовСтрока = тзТовары.Добавить();

    НовСтрока.Ссылка = СпрВыборка.Ссылка;
    НовСтрока.Наименование = СпрВыборка.Наименование;
    НовСтрока.Цена = СпрВыборка.Цена;
КонецЦикла;

Чтобы удалить колонки из таблицы значений нужно применить метод Очистить для свойства-коллекции Колонки:

тзТовары.Колонки.Очистить();

По индексу можно удалить строку:

тзТовары.Удалить(0); //удалить 1-ю строку с индексом 0
тзТовары.Удалить(1); //удалить 2-ю строку с индексом 1

Перебор строк таблицы значений обычно реализуется с помощью конструкции «Для Каждого», при этом в переменной цикла будет содержаться не номер строки, а вся строка целиком как объект СтрокаТаблицыЗначений:

Для Каждого стр Из тзТовары Цикл
    Сообщить(стр.Наименование);
    Сообщить(стр.Цена);
КонецЦикла;

Допускается также обращение к строке по индексу, при этом так-же возвращается объект типа СтрокаТаблицыЗначений. При работе с индексами необходимо всегда помнить, что индексация строк таблицы значений начинается с 0.

Для н=0 По тзТовары.Количество()-1 Цикл
    Сообщить(тзТоаары[н].Наименование);
    Сообщить(тзТовары[н].Цена) ;
КонецЦикла;

Часто возникает необходимость найти значение в таблице значений. Для решения этой задачи предназначены методы Найти и НайтиСтроки. В метод Найти передается искомое значение и список колонок, которые нужно просматривать. Если значение найдено, то возвращается строка таблицы значений, иначе — значение Неопределено.

НайденнаяСтрока = тзТовары.Найти(100,"Цена");
Если НайденнаяСтрока = Неопределено Тогда
    Сообщить("Товар с такой ценой найден! " + НайденнаяСтрока.Наименование);
КонецЕсли;

Метод НайтиСтроки позволяет найти сразу несколько строк таблицы значений, удовлетворяющих заданному условию. В параметрах этого метода передается структура, задающая условия отбора. Ключ структуры определяет имя колонки, а ее значение — искомое значение. Метод НайтиСтроки возвращает массив, содержащий ссылки на найденные строки таблицы значений:

Отбор = Новый Структура("Цена",100);
МассивСтрок = тзТовары.НайтиСтроки(Отбор);
Сообщить("Найдено " + МассивСтрок.Количество() + " товаров с такой ценой");

Внимание! Массив, возвращаемый методом НайтиСтроки, содержит строки таблицы значений (не их копии, а сами строки).При изменении какой-либо строки в таблице значений это отразится в массиве, и наоборот.

Таблица значений позволяет упорядочить содержащиеся в ней данные, для чего предназначен метод Сортировать:

тзТовары.Сортировать("Наименование Возр");
тзТовары.Сортировать("Цена Убыв");
тзТовары.Сортировать("Цена Убыв, Наименование Возр");

Таблица значений имеет очень полезную возможность группировки строк и подсчета итогов по группе, что реализуется методом Свернуть, имеющим следующие параметры:

Свернуть(<Колонки группировок>, <Колонки суммирования>)

Этот метод осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения по этим строкам, хранящиеся в колонках, указанных во втором параметре, суммируются.

Внимание! Списки колонок для метода Свернуть не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений. Например, у нас есть таблица значений со следующими данными:

В следующем примере эта таблица сворачивается по колонкам Сотрудник и Год с подсчетом суммы по колонке Доход:

//подсчитаем годовой доход по каждому сотруднику
тзДоходыСотр.Свернуть("Сотрудник,Год","Доход");

В результате мы получим следующую таблицу значений:

Если исходная таблица значений вам понадобится в дальнейшем, то лучше сделать копию таблицы значений и сворачивать уже ее:

МаДоходыПоГодам = тзДоходыСотр.Скопировать();
МаДоходыПоГодам.Свернуть("Сотрудник,Год","Доход");

Таблица значений позволяет подсчитать итог по колонке числового типа, например:

ВсегоДоход = тзДоходыСотр.Итог("Доход");
ВсегоНДС = тзСостав.Итог("НДС");

И последнее, о чем хотелось рассказать, из таблицы значений можно выгрузить целую колонку в массив и загрузить ее из массива:

МассивЦен = тзТовары.ВыгрузитьКолонку ("Цена") ;
тзТовары.ЗагрузитьКолонку("Количество",МассивОстаткиТоваров);


Дерево значений

Дерево значений — это объект для хранения временных наборов данных, возникающих при работе программы.

Работа с деревом значений напоминает работу с таблицей значений, за исключением того, что в дереве могут быть представлены иерархические данные (по аналогии с иерархическим справочником). Это достигается тем, что каждая строка дерева значений может иметь подчиненные строки, а те, в свою очередь, тоже могут иметь подчиненные строки и т.д.

Дерево значений предоставляет возможность обхода строк и подсчета итогов по всем строкам дерева или по текущему уровню иерархии.

Объект ДеревоЗначений имеет свойство Строки и Колонки, через которые осуществляется доступ к коллекции строк 1-го уровня и колонок дерева значений. У каждой строки дерева значения (т.е. объекта СтрокаДереваЗначений) есть свойство Строки, содержащее коллекцию подчиненных строк для данной строки дерева значений.

Следующий пример создает дерево значений и наполняет его данными:

дзОтделы = Новый ДеревоЗначений;
дзОтделы.Колонки.Добавить("Отдел");
дзОтделы.Колонки.Добавить("Руководитель");
Нов = дзОтделы.Строки.Добавить(); //индекс 0
Нов.Отдел = "Бухгалтерия";
Нов = дзОтделы.Строки.Добавить(); //индекс 1
Нов.Отдел = "Руководство";

//детализируем отдел "Бухгалтерия"
Нов = дзОтделы.Строки[0] .Строки.Добавить ();
Нов.Отдел = "Расчет зарплаты";
Нов = дзОтделы.Строки[0].Строки.Добавить();
Нов.Отдел = "Основные средства";

//детализируем руководство
Нов = дзОтделы.Строки[1] .Строки.Добавить ();
Нов.Отдел = "Высшее руководство";
Нов = дзОтделы.Строки[1].Строки.Добавить();
Нов.Отдел = "Отдел маркетинга";

Так же, как и с таблицей значений, можно создать полную копию дерева значений с помощью метода Скопировать:

НОваяОргСтруктура = ДзОтделы.Скопировать();

Обход строк реализуется с помощью конструкции «Для Каждого» или оператором [...]:

//1-й вариант: обход строк 1-го уровня
Для Каждого стр Из дзОтделы Цикл
    Сообщить(стр.Отдел);
КснецЦикла;

//2-й вариант (индексация строк начинается с 0)
Для н = 0 По дзОтделы.Строки.Количество()-1 Цикл
    стр = дзОтделы.Строки[н];
    Сообщить(стр);
КснецЦикла;

Следующая программа с помощью рекурсивной процедуры обходит все строки дерева значений, включая подчиненные:

Процедура ПоказатьПодчиневные (СтрокаДерева,Уровень=0)
    Для Каждого стр Из СтрокаДерева.Строки Цикл
        отступ = "";
        Для н = 1 По Уровень Цикл
            отступ = отступ + " ";
        КонецЦикла;
        Сообщить(отступ + стр.Отдел);
        ПоказатьПодчиненные(стр,Уровень+1);
    КонецЦикла;
КонецПроцедуры
ПоказатьПодчиненные(дзОтделы);

Результат работы программы:

Бухгалтерия

Расчет зарплаты

Основные средства

Руководство

Выслше руководство

Отдел маркетинга

Аналогично таблице значений, дерево значений позволяет искать значение с помощью метода Найти или искать сразу несколько строк методом НайтиСтроки. Принципы работы этих методов полностью идентичны рассмотренным выше для таблицы значений, за исключением последнего параметра БключатьПодчиненные. Если передать в него значение Истина, то поиск будет производиться в том числе и по подчиненным строкам, иначе — только по строкам текущего уровня.


Важные отличия от версии 7.7

  • • У массивов может быть несколько измерений, что позволяет организовывать многомерные массивы.

  • • Можно добавлять и удалять элементы массива, при этом его размерность будет динамически меняться.

  • • Введен новый объект ДеревоЗначений. Строки дерева значений могут иметь подчиненные строки, что дает возможность хранить в памяти иерархически организованные данные.

  • • Введены новые объекты Структура и Соответствие. Ключи соответствия могут быть любого типа.

  • • Обход элементов коллекции возможен через конструкцию «Для Каждого». К элементам коллекции можно также обращаться через оператор [...] (квадратные скобки). Индексация элементов коллекции начинается с 0.

  • • Изменилась объектная модель при работе с коллекциями значений. Каждое значение из списка значений — это объект типа ЭлементСпискаЗначений, каждая строка таблицы значений—это объект СтрокаТаблицыЗначений, а для дерева значений —СтрокаДереваЗначений. Для структуры и соответствия каждый элемент коллекции — это объект типа КлючИЗначение.

  • • Для списка значений, колонки таблицы или дерева значений можно указать список допустимых типов с помощью свойства ТипЗначения.

  • • У таблицы значений и дерева значений есть метод НайтиСтроки, возвращающий массив строк, удовлетворяющих заданному условию.

  • • Список значений может иметь картинки к значениям.


Глава 6.

Запросы

Запросы в системе 1С:Предприятие 8.0 предназначены для выборки информации из базы данных. По сути, запрос - это обращение к системе с просьбой выбрать определенную информацию из базы данных, а часто не только выбрать, но и произвести некоторую обработку: сгруппировать, отсортировать, вычислить итоги.

Например, с помощью запроса можно легко выбрать всех сотрудников, занимающих определенную должность, или можно узнать объем продаж каждого товара в течение года с детализацией до месяца.

Стоит отметить, что в других системах с помощью запросов можно не только выбирать информацию из базы данных, но и изменять ее: добавлять, удалять и изменять записи в таблицах, управлять правами пользователей, создавать и модифицировать таблицы, поля, индексы и другие объекты базы данных. В системе 1С:Предприятие 8.0 запросы предназначены только для чтения данных. Изменять данные с помощью запросов нельзя, и тем более нельзя изменять структуру базы данных, что возможно только в режиме «Конфигуратор». Запись данных в 1С:Предприятии 8.0 производится только через объекты встроенного языка, что обеспечивает высокий уровень логической целостности базы данных.

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

Приведем пример решения задачи обоими методами: с помощью языка программирования и с помощью запроса. Допустим, необходимо вывести сотрудников с окладом больше 10000 руб.

1-й способ. Используется язык программирования:

Выборка = Справочники.Сотрудники.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.Оклад > 10000 Тогда
        Сообщить(Выборка.Наименование + " имеет оклад " + Выборка.Оклад);
    КонецЕсли;
КонецЦикла;

2-й способ. Используется механизм запросов:

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Сотрудники ГДЕ Оклад > 10000");
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Сообщить(Выборка.Наименование + " имеет оклад " + Выборка.Оклад);
    КонецЦикла;

Обратите внимание на особенности второго варианта с использованием запроса:

  • • внутри цикла не нужно фильтровать записи, поскольку запрос выполнил всю работу за нас;

  • • вариант с запросом обычно выполняется быстрее, так как в клиент-серверном варианте работы запрос выполняется на сервере и не требуется передавать по сети весь справочник, который может быть очень большим.

В клиент-серверном варианте работы 1С:Предприятия 8.0 запросы будут транслироваться в SQL для выполнения в среде MS SQL Server. Сервер баз данных предпримет необходимые действия для оптимизации запроса.

Даже если вы работает в файловом варианте, то вариант с запросом обычно эффективнее обычного цикла для обработки больших справочников, списков документов и извлечения данных из регистров.

Но необходимо иметь в виду, что при использовании запроса, результат целиком помещается в память, тогда как выборка, сформированная средствами встроенного языка, загружает информацию порциями и позволяет перебрать большие списки объектов, не требуя значительного объема памяти.

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

Заметим, что в приведенном выше примере мы рассмотрели самое простое применение механизма запросов. С помощью запросов можно не только отбирать нужные записи по любому условию, но также группировать, сортировать, подсчитывать итоги. И сейчас мы научимся все это делать!


Выполнение запроса

Для работы с запросами в системе 1С:Предприятие 8.0 предусмотрено несколько специальных объектов, а именно:

  • • Запрос,

  • • РезультатЗапроса,

  • • ВыборкаИзРезультатаЗапроса.

Общая схема выполнения запроса такова:

1. Создание объекта типа Запрос с текстом запроса на специальном языке запросов.

2. Установка параметров запроса с помощью метода УстановитьПараметр.

3. Выполнение запроса, получение результата.

4. Получение выборки из результата запроса или выгрузка результата в таблицу значений / дерево значений. Также есть возможность использовать результат запроса как источник данных для сводной таблицы.

5. Обработка выборки или таблицы значений (например, перебор строк) и выполнение действий, для которых был нужен запрос, например, вывод области при формировании отчета. Графически это можно представить следующим образом:

Приведем простой пример, иллюстрирующий выполнение типичного запроса:

//создание объекта Запрос
Запрос = Новый Запрос("ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура");
//выполнение запроса и получение результата
РезультатЗапроса = Запрос.Выполнить();
//получение выборки из результата запроса
Выборка = РезультатЗапроса.Выбрать();
//обход записей в выборке
Пока Выборка.Следующий() Цикл
    //обращение к полям
    Сообщить(Выборка.Наименование);
КонецЦикла;

Два основных элемента механизма запросов — это язык запросов и обход выборки из результата запроса. Именно в них заключена основная мощь механизма запросов, поэтому ниже они будут рассмотрены более подробно. Но прежде, чем мы перейдем к написанию запросов «с чистого листа», познакомимся с Конструктором запросов, который значительно упрощает освоение языка запросов.


Конструктор запросов

В системе 1С:Предприятие 8.0 существует Конструктор запросов, который рекомендуется начинающим пользователям для быстрого создания запросов. При использовании Конструктора вы застрахованы от синтаксических ошибок в запросе, и это превращает его в очень удобное средство для первоначального изучения языка запросов.

Конструктор запросов может быть вызван как в режиме «Предприятие», так и в режиме «Конфигуратор».

Ниже на рисунке показана первая закладка Конструктора запросов — «Таблицы и поля», на которой задается список выбираемых полей из одной или нескольких таблиц:

Вообще конструктор запросов имеет следующие закладки:

Таблицы и поля

На этой закладке выбираются нужные объекты путем переноса их из списка «База данных» в списки «Таблицы» и «Поля».

Связи

Эта закладка появляется, только если в запросе соединяются несколько несколько таблиц. Здесь можно настроить условия соединения.

Группировка

Если требуется сгруппировать результаты запроса, т.е. свернуть по группировочным полям, выберите поля, по которым будет выполнена группировка.

Условия

На этой закладке можно указать условия, по которым будет выполняться отбор исходных данных. По каждому полю можно выбрать вид условия и указать параметр.

Дополнительно

На этой закладке устанавливаются дополнительные настройки запроса, например, исключение повторяющихся записей, а также блокировка данных для изменения.

Объединения / Псевдонимы

Здесь можно объединить данные из нескольких таблиц, указав условия объединения. На этой же закладке назначаются псевдонимы полей.

Порядок

Если требуется, укажите условия сортировки полученной информации.

Итоги

На этой закладке определяется, по каким полям подсчитывать промежуточные итоговые данные, а также подсчитывать или нет общие итоги.

Выходная форма

Эта закладка появляется, если вызван конструктор выходных форм в дереве метаданных или в форме редактирования объекта метаданных. Конструктор выходных форм генерирует не только запрос, но и процедуру его обработки, а также макет.

Консоль запросов

Для системы 1С:Предприятие 8.0 была создана удобная обработка «Консоль запросов», которая поставляется на дисках информационно-технологического сопровождения (ИТС). Эта обработка позволяет в режиме запуска «Предприятие» написать текст на языке запросов и тут же получить результат.

Все запросы хранятся в древовидном списке, который можно сохранить в файл и загрузить из файла. Результат запроса отображается в виде таблицы, дерева или выводится в табличный документ (отчет), который можно напечатать или скопировать в другую программу через буфер обмена. Кроме того, Консоль запросов позволяет получить результат запроса в виде сводной таблицы, для чего предназначена соответствующая закладка в нижней части формы.

Для написания текста запроса можно задействовать Конструктор запросов, описанный выше. Для этого достаточно щелкнуть правой кнопкой на текстовом поле, в которое вводится запрос, и выбрать пункт «Конструктор запросов».


Язык запросов

Для выполнения запроса необходимо составить текст на специальном языке запросов, который сильно отличается от обычного языка программирования по синтаксису и назначению.

Замечание! Язык запросов системы 1C:Предприятие 8.0 очень похож на стандартный SQL, но имеет некоторые отличия. Если вы знаете SQL, то изучить язык запросов 1C:Предприятия 8.0 будет гораздо легче.

Все ключевые слова языка запросов 1С:Предприятие 8.0 имеют английские эквиваленты, совпадающие там, где это возможно, со стандартным SQL. Например, ключевое слово ВЫБРАТЬ может быть заменено на SELECT, а ключевое слово ИЗ на FROM. Полный перечень английских эквивалентов приведен в документации.

В общем случае текст запроса строится по следующей схеме:

ВЫБРАТЬ <Список полей >|*
[ИЗ <Список таблиц-источников>]
[ГДЕ <Список условий>]
[УПОРЯДОЧИТЬ ПО <Список полей > ] | [АВТОУПОРЯДОЧИВАНИЕ]
[СГРУППИРОВАТЬ ПО <Список полей>]
[ИТОГИ [<агрегатные функции>] ПО <Список полей> [,ОБЩИЕ]]

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

* SQL - Structured Query Language, язык структурированных запросов к базам данных, который был изобретен еще в начале 1970-х. Первоначально язык назывался SEQUEL, и отсюда исторически сохранилось произношение его названия.


Предложение ВЫБРАТЬ / SELECT

Предложение ВЫБРАТЬ позволяет указать список полей для выборки. Если вместо перечня полей указана звездочка («*»), тогда это означает, что нужно выбрать все поля таблицы. Указание конкретных полей позволяет выбрать только заданные колонки из исходной таблицы-источника запроса.

В качестве источника данных для запроса можно использовать справочники, документы, журналы документов, регистры и другие таблицы-источники.

Синтаксическая диаграмма конструкции ВЫБРАТЬ такова:

ВЫБРАТЬ [РАЗЛИЧНЫЕ] [ПЕРВЫЕ <Количество>] <:Список полей выборки I *>

Примеры:

ВЫБРАТЬ Наименование, Цена ИЗ Справочник.Товары
ВЫБРАТЬ * ИЗ Справочник.Сотрудники
ВЫБРАТЬ Номер, Дата, Представление ИЗ Документ.РасходнаяНакладная
ВЫБРАТЬ * ИЗ РегистрНакопления.Продажи

В системе 1С:Предприятие 8.0 можно построить запрос без указания ключевого слова ИЗ, тогда список полей должен содержать полные имена таблиц, например:

ВЫБРАТЬ Справочник.Товары.Наименование, Справочник.Товары.Цена
ВЫБРАТЬ Справочник.Сотрудники.*

Псевдонимы полей (КАК/AS)

Для поля может быть назначен псевдоним с помощью ключевого слова КАК. Это позволяет обращаться к полю по псевдониму при указании итогов и порядка сортировки, а также в результате запроса.

В следующем запросе для полей Наименование и ЕдИзм назначаются псевдонимы:

ВЫБРАТЬ Наименование КАК Товар, Цена, ЕдИзм КАК ЕдиницаИзмерения
ИЗ Справочник.Товары
УПОРЯДОЧИТЬ ПО Товар

Результат запроса будет следующий:

Товар | Цена | ЕденицаИзмерения
Бумага | 130 | Пачка
Вилы | 1000 | Шт
Грабли | 1500 | Шт

Ключевое слово КАК необязательно и может быть опущено, но для повышения наглядности его рекомендуется указывать, особенно на первых порах. Ниже приведен пример того же запроса без ключевого слова КАК:

ВЫБРАТЬ Наименование Товар, Цена, ЕдИзм ЕдиницаИзмерения
ИЗ Справочник.Товары
УПОРЯДОЧИТЬ ПО Товар

Ключевое слово РАЗЛИЧНЫЕ/DISTINCT

Ключевое слово РАЗЛИЧНЫЕ позволяет оставить в результате запроса только отличающиеся строки. Например, если мы выбираем контрагентов из документа РасходнаяНакладная, то вполне вероятно, что один и тот же контрагент, может встретиться в нескольких накладных, поэтому без ключевого слова РАЗЛИЧНЫЕ он будет присутствовать в результате запроса несколько раз.

Например, в результате приведенного ниже запроса несколько раз встречается контрагент ООО «Новый мир»:

ВЫБРАТЬ Контрагент ИЗ Документ.РасходнаяНакладная

Контрагент

ООО"Новый мир"
ЗАО"Стройметмаш"
ООО"Новый мир"
ООО"Механика"

Если же указать ключевое слово РАЗЛИЧНЫЕ, то повторяющиеся записи из результата запроса будут удалены:

ВЫБРАТЬ РАЗЛИЧНЫЕ Контрагент ИЗ Документ.РасходнаяНакладйая

Контрагент

ООО"Новый мир"
ЗАО"Стройметмаш"
ООО"Механика"

Ключевое слово ПЕРВЫЕ / ТОР

Данное ключевое слово позволяет ограничить выборку несколькими первыми записями. Часто это ключевое слово применяется

в комбинации с сортировкой (см. предложение УПОРЯДОЧИТЬ ПО).

Допустим, требуется выбрать 3 самых дорогих товара. Это реализуется следующим запросом:

ВЫБРАТЬ ПЕРВЫЕ 3 Наименование, Цена
ИЗ Справочник.Номенклатура
УПОРЯДОЧИТЬ ПО Цена УБЫВ

Результат запроса будет такой:

Наименование | Цена
ЖК-МониторLG Flatron 21" | 1500
Компьютор Farmoza | 1450
ЖК-МониторLG Flatron 17" | 1200

Поля из вложенных таблиц

Поле в списке выборки может ссылаться на вложенную таблицу источника данных, например, на табличную часть справочника. В этом случае поле результата запроса будет иметь тип РезультатЗапроса, то есть содержать вложенный результат запроса, сформированный на основе вложенной таблицы-источника.

По умолчанию во вложенный результат запроса включаются все поля вложенной таблицы-источника данных. Имеется возможность явно определить группу полей, которые должны содержаться во вложенном результате запроса.

Список полей, выбираемых из вложенной таблицы, описывается по следующему образцу:

//требуются все поля из вложенной таблицы
ВЫБРАТЬ Документ.РасходнаяНакладная.Состав
ВЫБРАТЬ Документ.РасходнаяНакладная.Состав.*
//требуется только одно поле из табличной части
ВЫБРАТЬ Документ.РасходнаяНакладная.Состав.Сумма
//требуется несколько полей из табличной части
ВЫБРАТЬ Документ.РасходнаяНакладная.Состав.(Количество,Сумма)
//для полей вложенной таблицы можно указать псевдонимы
ВЫБРАТЬ Документ.РасходнаяНакладная.Состав.(Количество КАК Кол,Сумма КАК Сум)


Предложение ИЗ / FROM

Предложение ИЗ позволяет указать таблицы-источники для запроса и задать порядок их соединения, если таблиц несколько.

Вот простые примеры запросов с предложением ИЗ:

ВЫБРАТЬ * ИЗ Справочник.Товары
ВЫБРАТЬ * ИЗ Документ.РасходнаяНакладная

Напомним, что конструкция ИЗ необязательна, если в списке выбираемых полей указаны полные имена таблиц, например,

ВЫБРАТВ Справочник.Товары.*
ВЫБРАТЬ Документ.РасходнаяНакладная.Дата,
Документ.РасходнаяНакладная.Номер

Таблицы-источники данных

Каждая таблица-источник предоставляет свой набор полей. С полным их перечнем вы можете ознакомиться в документации или Синтакс-помощнике.

В 1C:Предприятии 8.0 существуют следующие таблицыисточники данных для запросов:

  • • Таблица констант,

  • • Таблица справочника,

  • • Таблица документов,

  • • Таблица журнала документов,

  • • Таблицы последовательностей,

  • • Таблица плана видов характеристик,

  • • Таблица критерия отбора,

  • • Таблица плана видов расчета,

  • • Таблицы регистров расчета,

  • Разработка в системе 1С:Предприятие 8.0

  • • Таблицы регистров сведений,

  • • Таблицы регистров накопления,

  • • Таблицы регистров бухгалтерии.

В данной главе подробно описаны только таблицы для обращения к справочникам и документам.

Таблица справочника

Таблица справочника позволяет организовать запрос к любому справочнику и предоставляет следующие поля:

Ссылка

Ссылка на элемент справочника. Через ссылку можно будет обратиться к любому полю справочника, даже если оно не включено в запрос.

ПометкаУдаления

Признак пометки на удаление элемента справочника. Если равно значению Истина, то элемент помечен на удаление.

Родитель

Указывает на элемента-родителя (или группу), в которой содержится данный элемент. Это поле будет включено в результат запроса только для иерархических справочников.

ЭтоГруппа

Признак того, что элемент справочника является группой.

Это поле включается в результат запроса только для иерархических справочников.

Владелец

Ссылка на элемент справочника-владельца, которому принадлежит данный элемент, т.е. которому он подчинен. Это поле будет включено в результат запроса только для подчиненных справочников.

Представление

Виртуальное поле* (см.ниже). Содержит представление элемента справочника, например, его наименование или код.

Код

Код элемента. Встроенное поле для всех справочников.

Наименование

Наименование элемента. Встроенное поле для всех справочников.

<имя реквизита>

Далее идут реквизиты справочника, как они определены в Конфигураторе, например, Цена, ЕдИзм и т.д.

<имя табличной части>

Если у справочника есть табличные части, то к ним можно обращаться по имени. При этом в результате запроса появляется вложенная таблица.

Приведем примеры простых запросов к справочнику:

ВЫБРАТЬ Код, Наименование, Цена, Родитель
ИЗ Справочник.Номенклатура
ВЫБРАТЬ *.Представление
ИЗ Справочник.Номенклатура
ВЫБРАТЬ Наименование, ЭтоГруппа, ПометкаУдаления
ИЗ Справочник.Номенклатура
ГДЕ ЭтоГруппа = ИСТИНА И ПометкаУдаления = ЛОЖЬ

Таблица документа

Таблица документа предназначена для выборки данных из документов. Она предоставляет следующие поля:

Ссылка

Через ссылку на документ можно будет обратиться к любому полю документа, даже если оно не включено в запрос.

ПометкаУдаления

Признак пометки на удаление документа.

Номер

Номер документа. Встроенное поле для всех документов.

Дата

Дата и время документа. Встроенное поле для всех документов.

Проведен

Содержит признак проведенности документа. Данное поле всегда включается в результат, даже если для документа запрещено проведение.

<имя реквизита>

Далее идут реквизиты шапки документа, как они определены в Конфигураторе, например, Контрагент, Склад и т.д.

<имя табличной части>

Если у документа есть табличные части, то к ним можно обращаться по имени. При этом в результате запроса появляется вложенная таблица.

МоментВремени

Виртуальное поле. Содержит момент времени документа, который включает дату и ссылку на документ. Напомним, что тип «дата» включает также и время с точностью до секунды.

Представление

Виртуальное поле. Содержит строку-представление документа, например, «Расходная накладная 0035 от 25.07.2003 12:05:01».

Итак, мы рассмотрели две основные таблицы-источники данных для справочников и документов. Таблицы-источники для регистров будут представлены в соответствующих главах. Таблицыисточники для других объектов (констант, журналов документов и т.д.) имеют достаточно простую структуру и в данной книге не рассматриваются.

Псевдонимы источников КАК/AS

В языке запросов есть возможность указать псевдоним для таблицы-источника с помощью ключевого слова КАК. При этом можно обращаться к источнику через псевдоним, например, в списке полей конструкции ВЫБРАТЬ или при соединении таблиц, которое будет описано ниже.

Ниже приведен пример использования псевдонима таблицыисточника:

ВЫБРАТЬ Спр.Наименование,
Спр.Цена,

Спр.Страна
ИЗ Справочник.Номенклатура КАК Спр

Запросы к табличным частям

В качестве таблиц источников можно указывать табличные части объектов, например, справочников и документов. Это не то же самое, что получать табличную часть как поле запроса, содержащее вложенную таблицу, о чем было рассказано выше.

Например, в следующем запросе производится обращение к табличной части Состав документа РасходнаяНакладная:

ВЫБРАТЬ Товар, Цена, Количество, Сумма
И3 Документ.РасходнаяНакладная.Состав
ВЫБРАТЬ Ссылка.Дата, Ссылка.Номер,
Номенклатура, Цена, Количество, Сумма
ИЗ Документ.РасходнаяНакладная.Состав

Если запрос делается к табличной части справочника или документа, то обращение к реквизитам шапки документа или обычным реквизитам справочника производится через поле Ссылка, например:

ВЫБРАТЬ Ссылка.Дата, Ссылка.Номер,
Номенклатура, Цена, Количество, Сумма
ИЗ Документ.РасходнаяНакладная.Состав

Вложенные запросы в списке источников

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

ВЫБРАТЬ Товары.Номенклатура КАК Товар,
Товары.Номенклатура.ЗакупочнаяЦена КАК Цена
ИЗ (
ВЫБРАТЬ Номенклатура ИЗ Документ.РасходнаяВакладная.Состав
ОБЪЕДИНИТЬ
ВЫБРАТЬ Номенклатура ИЗ Документ.ПриходнаяНакладная.Состав
) КАК Товары
СГРУППИРОВАТЬ ПО Товары.Номенклатура

Конструкция СОЕДИНЕНИЕ...ПО/JOIN...ON

Важной возможностью языка запросов системы 1С:Предприятие 8.0 является обращение сразу к нескольким таблицам. При этом их можно соединять определенным образом. Например, необходимо выбрать все проданные товары и вывести их в отчет с указанием группы, к которой они относятся. Это делает представленный ниже запрос:

ВЫБРАТЬ Док.Номенклатура,
Спр.ЗакупочнаяЦена КАК Цена,
Спр.Родитель КАК Группа
ИЗ Документ.РасходнаяНакладная.Состав КАК Док
СОЕДИНЕНИЕ Справочник. Номенклатура КАК Спр
ПО Док.Номенклатура = Спр.Ссылка

Результат этого запроса показан ниже:

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

ВЫБРАТЬ Номенклатура,
Номенклатура.ЗакупочнаяЦена КАК Цена,
Номенклатура.Родитель КАК Группа
ИЗ Документ.РасходнаяНакладная.Состав

Возможность разыменования полей в 1С:Предприятии 8.0 допускает обращение к свойствам объектов через несколько точек, например, «Номенклатура.Поставщик.Страна». Это позволяет значительно упростить написание запросов.

Рассмотренное соединение относится к классу внутренних. В языке запросов системы 1С:Предприятие 8.0 существует возможность внешних соединений, которые могут быть левыми (LEFT OUTER), правыми (RIGHT OUTER) и полными (FULL OUTER).

Левое внешнее соединение

Конструкция ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отличие от внутреннего соединения, в результат запроса надо включить еще и записи из первого источника (указанного слева от слова СОЕДИНЕНИЕ), для которых не найдено соответствующих условию записей из второго источника.

Таким образом, в результат запроса будут включены все записи из первого источника, они будут соединены с записями из второго источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из второго источника, будут содержать значение NULL в полях, формируемых на основании записей из этого источника.

Обратите внимание, что NULL-значения не являются нулем или пустой строкой. Это специальные маркеры, обозначающие неуказанные (отсутствующие) значения или значения, не имеющие смысла.

Например, нужно показать курсы всех валют, которые хранятся в регистре сведений КурсыВалют. Возможно, что для некоторой валюты не будет найдено соответствующей записи в регистре сведений, но она также должна попасть в отчет (запросы к регистрам сведений и таблица СрезПоследних описаны в главе «Регистры сведений»):

ВЫБРАТЬ Спр.Наименование, Peг.Курс
ИЗ Справочник.Валюты КАК Спр
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
РегистрСведений.КурсыВалют.СрезПоследних КАК Peг
ПО Спр.Ссылка = Peг.Валюта

Результат запроса показан в следующей таблице:

Правое внешнее соединение

Конструкция ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить еще и записи из второго источника (указанного справа от слова СОЕДИНЕНИЕ), для которых не найдено соответствующих условию записей из первого источника.

Таким образом, в результат запроса будут включены все записи из второго источника они будут соединены с записями из первого источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из первого источника, будут содержать значение NULL в полях, формируемых на основании записей из этого источника.

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

ВЫБРАТЬ Спр.Наименование, Peг.Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних() КАК Peг
ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Спр
ПО Спр.Ссылка = Peг.Валюта

Полное внешнее соединение

Конструкция ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и те записи из обоих источников, для которых не найдено соответствий.

Таким образом, в результат запроса будут включены все записи из обоих источников; они будут соединены друг с другом при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из какого-либо источника, будут содержать NULL в полях, формируемых на основании записей из этого источника.

*Примечание. Виртуальные поля.

Некоторые поля в таблицах-источниках виртуальные, например, поле «Представление» для таблицы справочника и документа, или поле «МоментВремени» для документа. Это значит, что они не хранятся в базе данных, а генерируются «на лету». Виртуальные поля не включаются в результат запроса, когда вместо списка полей указана звездочка («*»), их нужно указывать явно, например «ВЫБРАТЬ *, Представление ИЗ Справочник.Товары». Такое решение было принято для ускорения выполнения классического запроса «ВЫБРАТЬ * ИЗ...». В этом случае не требуется генерировать представления для элементов справочников и документов, следовательно запросы будут выполняться быстрее.


Предложение ГДЕ / WHERE

Предложение ГДЕ позволяет задать условие отбора данных из исходных таблиц-источников запроса. В запросе будут выбраны только те записи, для которых выполняется заданное условие.

Например, выберем товары с ценой, большей или равной определенному значению:

ВЫБРАТЬ Наименование, ЗакупочнаяЦена КАК Цена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена >= 1300

Результат запроса будет следующий:

Логические операторы И, ИЛИ, НЕ

В условиях можно использовать логические операторы И, ИЛИ, НЕ, с помощью которых можно строить достаточно сложные логические выражения.

Например, выберем товары, произведенные в России по цене, меньшей определенного значения:

ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена,
СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения = "Россия" И ЗакупочнаяЦена < 1000

В реальных задачах крайне рекомендуется уточнять у пользователей условия на такого рода неравенства, потому что пользователь часто имеет в виду «меньше или равно», а не «строго меньше». Возможно, в данном запросе товары с ценой 1000 тоже подойдут, тогда знак «<» надо заменить на «<=».

При указании нескольких логических сомножителей И, ИЛИ, НЕ целесообразно расставлять скобки, чтобы правильно определить порядок выполнения логических операций и повысить наглядность запроса.

Например, следующие два запроса могут привести к неожиданным для программиста результатам, потому что оператор И имеет больший приоритет, чем ИЛИ (а оператор НЕ имеет еще больший приоритет, чем И):

ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена,
СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения = "Россия" ИЛИ СтранаПроисхождения = "США"
И ЗакупочнаяЦена < 1000

В результате мы получим следующие записи:

Этот запрос будет интерпретирован системой как «Выбрать все товары из страны Россия, независимо от цены, а также товары из страны США, которые дешевле 1000». Т.е. условие по цене будет проверяться только для товаров из США, а товары из России будут включены в запрос при любой цене.

Вероятно, программист имел в виду совсем другое: «Выбрать товары из России и США, которые дешевле 1000», что реализовано вторым запросом. Условие по цене будет проверяться для всех товаров, независимо от страны-производителя:

ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена,
СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ (СтранаПроисхождения = "Россия" ИЛИ СтранаПроисхождения = "США")
И ЗакупочнаяЦена < 1000

Параметры в языке запросов

Обычно требуется, чтобы параметры условий пользователь мог указать самостоятельно в каком-либо диалоге. Для этого запрос конструируется с использованием параметров.

Обратите внимание, что в следующем запросе параметр МинЦена предваряется знаком «&».

ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена >= &МинЦена

Общая схема выполнения запроса с параметрами выглядит сле-

дующим образом:

//создание объекта Запрос с текстом запроса
Запрос = Новый Запрос("Выбрать Наименование, Цена
            | ИЗ Справочник.Номенклатура
            | ГДЕ Цена >= ШинЦена");

//передача параметров в запрос
Запрос.УстановитьПараметр("МинЦена",1000);

//выполнение запроса с установленными параметрами
Результат = Запрос.Выполнить();

Стоит заметить, что для многих типов данных в языке запросов нет литералов, поэтому их значения можно задать только через параметры, даже если пользователь не должен их изменять.

Ключевое слово МЕЖДУ / BETWEEN

В языке запросов есть вспомогательное ключевое слово МЕЖДУ для задания интервалов. Например, если параметр МинЦена равен 1000, а МаксЦена — 1500, тогда следующий запрос выберет товары с ценой из указанного интервала:

ВЫБРАТЬ Наименование,
ЗакупочнаяЦена КАК Цена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена МЕЖДУ &МинЦена И ШаксЦена

Ключевое слово МЕЖДУ введено для повышения наглядности при задании интервалов и всегда может быть заменено неравенствами. Следующий запрос полностью эквивалентен предыдущему:

ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ ЗакупочнаяЦена >= МинЦена И ЗакупочнаяЦена <= МаксЦена

Проверка вхождения значения в список (В / IN)

В условии можно проверять значения на вхождение в некоторый список или на принадлежность группе справочника (или элементу, если иерархический справочник состоит из одних элементов). В случае иерархического справочника можно применять конструкцию В ИЕРАРХИИ для проверки вхождения в группу независимо от уровня иерархии.

Следующие запросы демонстрируют варианты использования ключевого слова В:

//выбираем товары из заданного списка
ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ Ссылка В (&СписокВыбранныхТоваров)
//выбираем товары, принадлежащие определенной группе
//независимо от уровня, на котором они находятся
ВЫБРАТЬ Наименование, ЗакупочнаяЦена
ИЗ Справочник.Номенклатура
ГДЕ Ссылка В ИЕРАРХИИ (&ВыбраннаяГруппа)

В первом запросе параметр СписокВыбранныхТоваров является списком значений. В запросе будут выбраны только те товары, которые представлены в данном списке.

Во втором запросе параметр ВыбраннаяГруппа является группой иерархического справочника Номенклатура. В результат запроса будут включены товары, принадлежащие к заданной группе, независимо от того, на каком уровне иерархии они находятся.

В качестве списка значений, можно указывать и другой запрос, тогда сначала будет выполнен вложенный запрос, а затем основной. Например, следующий составной запрос выбирает товары, по которым есть хотя бы одна расходная накладная:

ВЫБРАТЬ Спр.Наименование, Спр.ЗакупочнаяЦена
ИЗ Справочник.Номенклатура КАК Спр
ГДЕ Спр.Ссылка В (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура
ИЗ Документ.РасходнаяНакладная.Состав)

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

ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура, Номенклатура.ЗакупочнаяЦена
ИЗ Документ.РасходнаяНакладная.Состав

Это стало возможно, потому что разыменование полей заставляет систему 1С:Предприятие 8.0 производить неявное соединение таблиц. Рекомендуется всегда пользоваться разыменованием полейтам, где это возможно, и не усложнять запросы лишними конструкциями.

Проверка ссылочного значения (ССЫЛКА / REF)

Оператор ССЫЛКА позволяет проверить, является ли значение выражения ссылкой на таблицу, указанную справа от него. Этот оператор полезен для полей, имеющих составной тип данных. Следующий запрос выбирает товары, для которых единица измерения ссылается на справочник ЕдиницыИзмерения, а не является, например, строкой.

ВЫБРАТЬ Наименование, ЕдиницаИзмерения
ИЗ Справочник.Номенклатура
ГДЕ ЕдиницаИзмерения ССЫЛКА Справочник.ЕдиницыИэмерения

Проверка пустых значений (ЕСТЬ NULL/ IS NULL)

Оператор ЕСТЬ NULL позволяет проверить значение заданного выражения на NULL.

Замечание. NULL-значения не являются нулем (0), пустой строкой («») или пробелом (« »). NULL-значения - это неуказанные, отсутствующие или неизвестные значения.

Если проверяемое значение равно NULL, то результатом оператора будет Истина, иначе — Ложь. Применение логического оператора НЕ изменяет действие оператора на обратное. Любая операция обычного сравнения (=, >, <= и т.д.) значения NULL с чем-либо еще дает результат, аналогичный Ложь.

Следующий запрос выбирает из справочника Номенклатура все товары, для которых строковое поле СтранаПроисхождения имеет NULL-значение:

ВЫБРАТЬ Наименование, СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения ЕСТЬ NULL

Обратите внимание, что в результате запроса присутствуют только группы справочника, так как для них поле Страна имеет NULL-значение (вообще не указывается). В результат запроса не попали товары, у которых строковое поле СтранаПроисхождения имеет значение «» (пустая строка). Как уже было сказано выше, ни ноль, ни пустая строка, ни пробел не являются NULL-значением.

Чтобы выбрать товары, у которых не указана страна (строковое поле), нужно применить обычное сравнение на пустую строку:

ВЫБРАТЬ Наименование, СтранаПроисхождения КАК Страна
ИЗ Справочник.Номенклатура
ГДЕ СтранаПроисхождения = ""

Если стоит задача выбрать элементы с неуказанным реквизитом, имеющим ссылочный тип, тогда следует поступать по-другому. Например, требуется выбрать все товары с незаполненным полем ОсновнойПоставщик, которое является ссылкой на справочник Контрагенты.

Предлагается следующая схема для решения этой задачи:

Запрос = Новый Запрос("
    | ВЫБРАТЬ Наименование, ОсновнойПоставщик
    | ИЗ Справочник.Номенклатура
    | ГДЕ ОсновнойПоставщик = йПустойКонтрагент ");
Запрос.УстановитьПараметр("ПустойКонтрагент",
Справочники.Контрагенты.ПустаяСсылка());
Результат = Запрос.Выполнить();

В условии запроса используется параметр ПустойКонтрагент. Этот параметр до выполнения запроса получает значение пустой ссылки на справочник Контрагенты. Для этого используется метод ПустаяСсылка объекта СправочникМенеджер.

Результат приведенного выше запроса будет следующий:

Сравнение строк (ПОДОБНО / LIKE)

Ключевое слово ПОДОБНО позволяет сравнить значение строкового выражения, указанного слева от него, со строкой шаблона, указанной справа. Если значение выражения удовлетворяет шаблону, то результатом оператора будет Истина, иначе — Ложь.

Например, следующий запрос выберет всех контрагентов, начинающихся на определенную букву:

ВЫБРАТЬ Наименование ИЗ Справочник.Контрагенты
ГДЕ Наименование ПОДОБНО "М%"

В выражении шаблона был использован служебный символ «%», обозначающий любую последовательность символов. Кроме этого, есть и другие служебные символы для задания выражения шаблона.

Следующие символы в строке шаблона являются служебными и имеют особый смысл:

Если необходимо записать один из перечисленных символов в качестве самого себя, а не в качестве служебного символа, то ему должен предшествовать спецсимвол, который определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.

Например, следующая строка обозначает любую строку, начинающуюся со знака подчеркивания «__». Так как знак подчеркивания является служебным, то для его использования в качестве именно знака подчеркивания, необходимо его экранировать другим спецсимволом, например «\»:

ВЫБРАТЬ Наименование ИЗ Справочник.СистемныеФайлы
ГДЕ Наименование ПОДОБНО "\_%" СПЕЦСИМВОЛ "\"


Предложение УПОРЯДОЧИТЬ ПО / ORDER BY

Часто результат запроса требуется отсортировать по алфавиту или по числовому полю. В общем случае в качестве значения упорядочивания может быть выражение.

Например, представим список товаров, упорядоченный по алфавиту. При сортировке сначала идут товары, начинающиеся на цифры, затем на английские буквы, а затем на русские буквы:

ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура
УПОРЯДОЧИТЬ ПО Наименование ВОЗР

Сортировка часто применяется с ключевым словом ПЕРВЫЕ. Например, следующий запрос сортирует товары по убыванию цены и показывает 5 самых дорогих товаров:

ВЫБРАТЬ ПЕРВЫЕ 5 Код, Наименование, ЗакупочнаяЦена КАК Цена
ИЗ Справочник.Номенклатура
УПОРЯДОЧИТЬ ПО Цена УБЫВ

Результат запроса показан в таблице:

Упорядочивание по иерархии

Для иерархических справочников можно упорядочить элементы с учетом иерархии. Если мы имеем дело со справочником товаров, то вряд ли будет наглядным отчет, в котором клавиатуры чередуются с мониторами. Каждый вид товара должен быть упорядочен в пределах своей группы.

Это достигается с помощью ключевого слова ИЕРАРХИЯ, которое используется в следующем запросе:

ВЫБРАТЬ Ссылка КАК Товар
ИЗ Справочник.Номенклатура
УПОРЯДОЧИТЬ ПО Наименование ИЕРАРХИЯ

Будьте внимательны, когда составляете подобный запрос не к справочнику, а к документу или регистру, в котором есть реквизит, выбираемый из иерархического справочника. В этом случае иерархического упорядочивания не происходит.

Следующий запрос это демонстрирует:

ВЫБРАТЬ Номенклатура КАК Товар
ИЗ Документ.РасходнаяНакладная.Состав
УПОРЯДОЧИТЬ ПО Номенклатура.Наименование ИЕРАРХИЯ

Для нужного эффекта необходимо организовать левое внешнее соединение со справочником, как сделано в этом запросе:

ВЫБРАТЬ Спр.Ссылка Товар, ДокСостав-Ссылка Документ
ИЗ Справочник.Номенклатура КАК Спр
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Состав КАК ДокСостав
ПО ДокСостав.Номенклатура = Спр.Ссылка
УПОРЯДОЧИТЬ ПО Спр.Наименование ИЕРАРХИЯ

Упорядочивание во вложенных таблицах

В предложении УПОРЯДОЧИТЬ ПО можно определять также и условия сортировки записей из вложенных таблиц, причем их можно комбинировать с условиями упорядочивания по таблице верхнего уровня.

Например, необходимо вывести спецификацию товарных накладных, показать сам документ, номенклатуру и количество. Документы требуется упорядочить по номеру, а данные из табличной части Состав — по наименованию товара.

Это делается с помощью следующего запроса:

ВЫБРАТЬ НаклСостав.Ссылка.Номер,
Номенклатура, Количество
ИЗ Документ.РасходнаяНакладная.Состав КАК НаклСостав
УПОРЯДОЧИТЬ ПО НаклСостав.Ссылка.Номер,
НаклСостав.Номенклатура.Наименование

Автоупорядочивание /AUTOORDER

Ключевое слово АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим автоматического формирования полей для упорядочивания результата запроса. Оно часто используется при построении отчетов.

Автоупорядочивание работает по следующим правилам:

  • • Если в запросе было указано предложение УПОРЯДОЧИТЬ ПО, то каждая ссылка на таблицу, находящаяся в этом предложении, будет заменена полями, по которым по умолчанию сортируется таблица (для справочников это код или наименование, для документов — дата документа). Если поле для упорядочивания ссылается на иерархический справочник, то будет применена иерархическая сортировка по этому справочнику.

  • • Если в запросе отсутствует предложение УПОРЯДОЧИТЬ ПО, но есть предложение ИТОГИ, тогда результат запроса будет упорядочен по полям, присутствующим в предложении ИТОГИ после ключевого слова ПО, в той же последовательности и в случае, если итоги рассчитывались по ссылочным полям, то по полям сортировки по умолчанию таблиц, на которые были ссылки.

  • • Если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО и ИТОГИ, но есть предложение СГРУППИРОВАТЬ ПО, тогда результат запроса будет упорядочен по полям, присутствующим в предложении, в той же последовательности и в случае если группировка велась по ссылочным полям, то по полям сортировки по умолчанию таблиц, на которые были ссылки.

  • • И наконец, если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО, ИТОГИ и СГРУППИРОВАТЬ ПО, результат будет упорядочен по полям сортировки по умолчанию для таблиц, из которых выбираются данные, в порядке их появления в запросе.


Предложение СГРУППИРОВАТЬ ПО / GROUP BY

Агрегатные функции в запросе

Часто требуется не просто выбрать отдельные записи из базы данных, а получить сводную информацию, например, для ответа на следующие вопросы:

  • • Каков общий объем продаж за период?

  • • Какова средняя стоимость заказа в каждом филиале?

  • • Сколько сотрудников работает в штате?

  • • Какова наименьшая и наибольшая цена продажи каждого товара?

В системе 1С:Предприятие 8.0 такие запросы можно создавать с помощью агрегатных функций, группировок и предложения ИМЕЮЩИЕ (HAVING). Ниже будут описаны агрегатные функции языка запросов.

Любая агрегатная функция принимает в качестве аргумента какой-либо столбец, а возвращает единственное значение. Например, агрегатная функция СУММА (SUM) принимает в качестве аргумента столбец чисел и вычисляет его сумму.

В языке запросов 1С:Предприятия 8.0 существуют следующие агрегатные функции:

СУММА (SUM)

Вычисляет сумму всех значений, содержащихся в столбце.

МАКСИМУМ (МАХ)

Находит наибольшее значение в столбце.

МИНИМУМ (MIN)

Находит наименьшее значение в столбце.

СРЕДНЕЕ (AVG)

Вычисляет среднее арифметическое значение по столбцу.

КОЛИЧЕСТВО (COUNT)

Подсчитывает количество значений, содержащихся в столбце. Если в качестве параметра данной функции передать звездочку («*»), то функция подсчитает количество строк в таблице результата запроса. Ниже приведен пример запроса с несколькими агрегатными функциями:

ВЫБРАТЬ
СУММА(Оклад) КАК ФондОплатыТруда,
МИНИМУМ(Оклад) КАК МинОклад,
МАКСИМУМ(Оклад) КАК МаксОклад,
СРЕДНЕЕ(Оклад) КАК СреднийОклад,
КОЛИЧЕСТВО)*) КАК Количество
ИЗ Справочник.Сотрудники

Результат запроса будет содержать всего одну строку:

Рассмотрим более подробно функцию КОЛИЧЕСТВО / COUNT.

Эта функция подсчитывает количество значений параметра, попавших в выборку. В отличие от других агрегатных функций она допускает три варианта использования:

• Позволяет узнать количество строк в результате запроса. Для этого в качестве параметра функции надо указать звездочку («*»). Это наиболее часто встречающийся вариант использования функции КОЛИЧЕСТВО. Даже если в строке все поля содержат NULL, то такая строка тоже будет посчитана.

• Позволяет подсчитать количество значений указанного поля, не являющихся NULL-значениями. В качестве параметра функции можно указывать ссылки на поля, содержащие значения любого типа, при этом NULL-значения игнорируются.

• Позволяет узнать количество различных значений указанного поля. Для этого перед спецификацией поля надо указать ключевое слово РАЗЛИЧНЫЕ / DISTINCT, при этом NULL-значения игнорируются. Например, с помощью функции КОЛИЧЕСТВО можно ответить на следующие вопросы:

• Сколько сотрудников, у которых оклад больше заданной величины?

ВЫБРАТЬ КОЛИЧЕСТВО)*) КАК Количество
ИЗ Справочник.Сотрудники
ГДЕ Оклад > &ВыбОклад

• Сколько различных клиентов купили хоть что-нибудь за заданный период?

ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагент) КАК Количество
ИЗ Документ.РасходнаяНакладная
ГДЕ Дата МЕЖДУ НачДата И &КонДата


Предложение СГРУППИРОВАТЬ ПО / GROUP BY

Очень часто запрос делается с целью не просто выбрать записи из таблицы, но также сгруппировать их определенным образом. Под словом «сгруппировать» имеется в виду не распределить записи по группам, а свернуть по группировочным полям, вычислив агрегатные функции по каждой группе. Например, если требуется узнать объем продаж каждого товара за период, тогда в запросе понадобится группировка по товару. Ниже приведен запрос с группировкой к документам РасходнаяНакладная:

ВЫБРАТЬ Номенклатура, СУММА(Сумма) КАК ОбъемПродаж
ИЗ Документ.РасходнаяНакладная.Состав КАК ДокСостав
ГДЕ ДокСостав.Ссылка.Дата МЕЖДУ ЬНачДата И &КонДата
СГРУППИРОВАТЬ ПО Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

В данном примере использована агрегатная функция СУММА для поля Сумма табличной части Состав. Запрос группирует все продажи по товарам и подсчитывает объем продаж по каждому товару:

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

ВЫБРАТЬ
    Подразделение,
    СУММА(Оклад) КАК ФондОплатыТруда
    МИНИМУМ(Оклад) КАК МинОклад,
    МАКСИМУМ(Оклад) КАК МаксОклад,
    СРЕДНЕЕ(Оклад) КАК СреднийОклад,
    КОЛИЧЕСТВО(*) КАК КоличествоЧеловек
ИЗ Справочник.Сотрудники
СГРУППИРОВАТЬ ПО Подразделение

В языке запросов можно группировать данные по нескольким полям, при этом будут подсчитаны агрегатные функции для каждой комбинации группировок:

ВЫБРАТЬ Номенклатура,
    ДокСостав.Ссылка.Контрагент КАК Контрагент,
    СУММА(Сумма) КАК Продажи
ИЗ Документ.РасходнаяНакладная.Состав КАК ДокСостав
ГДЕ ДокСостав.Ссылка.Дата МЕЖДУ ШачДата И &КонДата
СГРУППИРОВАТЬ ПО Номенклатура, Контрагент
АВТОУПОРЯДОЧИВАНИЕ


Предложение ИМЕЮЩИЕ / HAVING

Предложение ИМЕЮЩИЕ позволяет накладывать условия на значения агрегатных функций. В других конструкциях языка запросов, например, в предложении ГДЕ, использовать агрегатные функции в условиях нельзя. В условии отбора ИМЕЮЩИЕ можно использовать только агрегатные функции и поля, по которым осуществляется группировка.

Например, необходимо выбрать товары, которых продали не менее 70 штук. Тогда нужно сначала подсчитать объем продаж по каждому товару, а затем применить условие отбора уже к получившимся группам, а не к исходным записям. Эта задача решается с помощью приведенного ниже запроса:

ВЫБРАТЬ Номенклатура, Сумма (Количество) КАК Продано
ИЗ Документ.РасходнаяНакладная.Состав
СГРУППИРОВАТЬ ПО Номенклатура
ИМЕЮЩИЕ Сумма (Количество) >= 70

Результат запроса будет следующий:

Приведем другой пример, когда отбор групп необходим. Выберем клиентов, купивших за заданный период товаров на сумму 10000 и выше:

ВЫБРАТЬ Контрагент, СУММА(Сумма) КАК Куплено
ИЗ РегистрНакопления.Продажи
ГДЕ Период МЕЖДУ &НачДата И ЬКонДата
СГРУППИРОВАТЬ ПО Контрагент
ИМЕЮЩИЕ СУММА(Сумма) >= 10000

Обратите внимание, что ключевое слово ГДЕ применяется здесь только для отбора записей за нужный период. Затем данные группируются по контрагенту с подсчетом суммы проданных товаров, и к получившимся строкам применяется условие ИМЕЮЩИЕ.


Предложение ИТОГИ / TOTALS

Язык запросов системы 1С:Предприятие 8.0 имеет очень мощную возможность расчета итогов, чего нет в стандартном языке SQL. Данный механизм дает возможность включить в результат запроса дополнительные строки, содержащие общие и промежуточные итоги по заданным полям и группировкам.

Общие итоги

Рассмотрим сначала общие итоги, как более простые для понимания. Следующий запрос выбирает из регистра накопления Продажи все записи за заданный период и рассчитывает общий объем продаж:

ВЫБРАТЬ Номенклатура, Сумма
ИЗ РегистрНакопления.Продажи
ИТОГИ СУММА(Сумма) ПО Общие

В результате запроса появляется дополнительная итоговая строка:

При обходе результата запроса итоговые строки можно отличить от обычных с помощью метода ТипЗаписи(). Например, выведем результат данного запроса в окно сообщений, а итоговую строку выделим заглавными буквами:

Запрос = Новый Запрос("
    |ВЫБРАТЬ Номенклатура, Сумма
    |ИЗ РегистрНакопления.Продажи
    |ИТОГИ СУММА(Сумма) ПО Общие");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда
        Сообщить("ОБЩИЙ ИТОГ: " + Выборка.СуммаПродажи);
    Иначе
        Сообщить("Товар/услуга: " + Выборка.Номенклатура +
        "Сумма: " + Выборка.СуммаПродажи);
    КонецЕсли;
КонецЦикла;

Итоги по группировкам

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

Простой запрос с итогами по группировкам выглядит следующим образом:

ВЫБРАТЬ Номенклатура, Период, Сумма

ИЗ РегистрНакопления.Продажи

ИТОГИ СУММА(Сумма) ПО Номенклатура

АВТОУПОРЯДОЧИВАНИЕ

Результат запроса включает в себя обычные записи из регистра и итоги по каждому товару:

Обратите внимание, что запрос с итогами по группировкам отличается от обычной группировки (свертки) с помощью предложения СГРУППИРОВАТЬ ПО с агрегатными функциями. В последнем случае в результат запроса не включаются исходные записи, а остаются только итоговые строки.

Например, следующий запрос выводит объем продаж, сгруппированный по каждой номенклатуре, и не выводит детальные записи регистра накопления:

ВЫБРАТЬ Номенклатура, СУММА(Сумма) КАК Сумма
ИЗ РегистрНакопления.Продажи
СГРУППИРОВАТЬ ПО Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Можно рассчитать итоги по комбинации группировок, перечислив их через запятую:

ВЫБРАТЬ Контрагент, Номенклатура, Сумма
ИЗ РегистрНакопления.Продажи
ИТОГИ СУММА(Сумма)
    ПО Контрагент, Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

В данном запросе будет рассчитан объем продаж по каждой комбинации подразделения и номенклатуры. Кроме того, в запрос будут включены исходные записи из регистра накоплений:

Порядок группировок в тексте запроса имеет довольно важное значение, поскольку сначала рассчитываются итоги по первому группировочному полю, затем по второму и т.д.

Если в предыдущем примере поменять местами контрагента и номенклатуру, то получим следующий результат:

ВЫБРАТЬ Контрагент, Номенклатура, Сумма
ИЗ РегистрНакопления.Продажи
ИТОГИ СУММА(Сумма)
ПО Номенклатура, Контрагент

АВТОУПОРЯДОЧИВАНИЕ

Результат запроса показан ниже:

В 1С:Предприятии 8.0 реализована возможность обхода группировок в произвольном порядке. То есть из одного результата запроса возможно получать отчеты с различной последовательностью группировок. Например, в отчете на основе одного результата запроса могут выводиться сначала группировки по товарам, а затем по поставщикам.

Итоги по иерархии

Если группировочное поле является ссылкой на справочник, то для расчета итогов по группам справочника (или родительским элементам, если справочник состоит из одних элементов) необходимо указать ключевое слово ИЕРАРХИЯ. В этом случае в результат будут добавлены записи с итогами для уровней иерархии справочника.

Например, выберем записи справочника Номенклатура, рассчитаем объем продаж по каждой позиции и по группам справочника:

ВЫБРАТЬ Номенклатура, Сумма
ИЗ РегистрНакопления.Продажи
ИТОГИ СУММА (Сумма) ПО Номенклатура ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ

Заметьте, что в результат запроса включены группы справочника, и по ним подсчитаны итоги:

Несколько итогов в запросе

В языке запросов допускается совместное использование различных итогов в одном запросе, например, общих, иерархических и итогов по группировкам.

Ниже представлен запрос, который выбирает данные из расходных накладных и дополнительно подсчитывает общие итоги, итоги по контрагентам, по каждому товару и группе товаров.

ВЫБРАТЬ
НаклСостав.Ссылка.Контрагент КАК Контрагент,
НаклСостав.Номенклатура КАК Номенклатура,
НаклСостав.Ссылка.Номер,
НаклСостав.Сумма КАК Продажи
ИЗ Документ.РасходнаяНакладная.Состав КАК НаклСостав
ИТОГИ СУММА(Продажи) ПО
ОБЩИЕ,
Контрагент,
Номенклатура ИЕРАРХИЯ


Предложение ОБЪЕДИНИТЬ / UNION

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

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

Объединяемые запросы должны иметь одинаковое количество полей в списке полей выборки. Если поля выборки объединяемых запросов имеют разный тип, то поля результата запроса будут иметь составной тип данных.

Пример, выберем проданные или купленные товары за определенный период:

ВЫБРАТЬ
    НаклСостав.Номенклатура,
    НаклСостав.Цена КАК Цена
ИЗ Документ.РасходнаяНакладная.Состав КАК НаклСостав
ГДЕ НаклСостав.Ссылка.Дата МЕЖДУ &НачДата И &КонДата

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    НаклСостав.Номенклатура,
    НаклСостав.Цена
ИЗ Документ.ПриходнаяНакладная.Состав КАК НаклСостав
ГДЕ НаклСостав.Ссылка.Дата МЕЖДУ &НачДата И &КонДата

Обратите внимание, что по умолчанию при объединении запросов полностью одинаковые строки, сформированные разными запросами, заменяются одной. Если требуется, чтобы были оставлены все одинаковые строки, необходимо указать ключевое слово ВСЕ.

Например, выберем проданные или купленные нами товары с указанием даты, цены покупки или цены продажи. Даже если для какого-то товара в определенный день совпадет цена покупки и цена продажи, то в запросе это все-таки будут две разные строки:

ВЫБРАТЬ
    НаклСостав.Ссылка.Дата,
    НаклСостав.Номенклатура,
    НаклСостав.Цена КАК Цена
ИЗ Документ.РасходнаяНакладная.Состав КАК НаклСостав
ГДЕ НаклСостав.Ссылка.Дата МЕЖДУ ЬНачДата И &КонДата
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    НаклСостав.Ссылка.Дата,
    НаклСостав.Номенклатура,
    НаклСостав.Цена
ИЗ Документ. ПриходнаяНакладная.Состав КАК НаклСостав
ГДЕ НаклСостав.Ссылка.Дата МЕЖДУ ШачДата И ЬКонДата


Встроенные функции языка запросов

В языке запросов есть встроенные функции, которые могут быть использованы в списке полей выборки предложения ВЫБРАТЬ и в условии отбора предложения ГДЕ. Если параметр функции является значением NULL, то возвращается тоже NULL. Для функций работы с датой следует учитывать, что тип «дата» включает в себя дату и время с точностью до секунды.

В языке запросов существуют следующие функции:

ПОДСТРОКА (<Строка>, <Позиция>, <ЧислоСимволов>)

Данная функция предназначена для выделения подстроки из строки.

ГОД (<дата>)

Выделяет год из даты. Возвращает число от 1 до 9999.

МЕСЯЦ (<дата>)

Выделяет месяц из даты (от 1 до 12).

ДЕНЬ (<дата>)

Выделяет число из даты (от 1 до 31).

ЧАС (<дата>)

Выделяет часы из даты (от 0 до 23). ' ,г . ,' .

МИНУТА (<дата>)

Выделяет минуты из даты (0 до 59).

СЕКУНДА (<дата>)

Выделяет секунды из даты (0 до 59).

КВАРТАЛ (<дата>)

Определяет номер квартала по дате (от 1 до 4).

НЕДЕЛЯ (<дата>)

Определяет номер недели в году по дате (от 1 до 53).

ДеньГода (<дата>)

Определяет номер дня в году по дате (от 1 до 366).

ДеньНедели (<дата>)

Определяет номер дня недели по дате (от 1 до 7).

НачалоПериода ( <дата>, <ТипПериода> )

Возвращает начало периода по заданной дате. В качестве параметра ТипПериода передается Год, Месяц, Неделя, День, Час и т.д.

КонецПериода (<дата>,<ТипПериода>)

Возвращает конец периода по заданной дате.

Например, следующий запрос разбирает дату приема сотрудника на составляющие без учета времени и выводит первые 2 буквы от его ФИО, используя функцию ПОДСТРОКА:

ВЫБРАТЬ Наименование, ДатаПриема
    ПОДСТРОКА(Наименование,1,2) КАК Сокращение,
    ЦеныДатаПриема) КАК Число,
    МЕСЯЦ(ДатаПриема) КАК Месяц,
    ГОД(ДатаПриема) КАК Год
ИЗ Справочник.Сотрудники


Операции выбора в языке запросов

Операции выбора в языке запросов (ВЫБОР / CASE)

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

Следующий запрос использует операцию выбора для заполнения поля Диапазон:

ВЫБРАТЬ
    Наименование,
    ЗакупочнаяЦена КАК Цена,
ВЫБОР
    Когда ЭтоГруппа = Истина Тогда "Это группа"
    Когда ЗакупочнаяЦена >= 1000 Тогда "1000 и выше"
    Когда ЗакупочнаяЦена >= 100 Тогда "100 - 1000"
    Когда ЗакупочнаяЦена >= 10 Тогда "10 - 100"
    Когда ЗакупочнаяЦена > 0 Тогда "О - 10"
    Иначе "Не задана"
КОНЕЦ КАК Диапазон
ИЗ Справочник.Номенклатура


Приведение типов в языке запросов

Поля исходных таблиц могут иметь составной тип данных. Для таких полей может возникнуть необходимость привести значения поля к какому-либо определенному типу. В языке запросов предусмотрена конструкция ВЫРАЗИТЬ, которая выполняет приведение типа. Ею можно пользоваться в списке полей выборки (предложение ВЫБРАТЬ) и в условии отбора (предложение ГДЕ).

Синтаксическая диаграмма конструкции ВЫРАЗИТЬ такова:

ВЫРАЗИТЬ (<Выражение> КАК <Тип значения>)

Выражение приводится к одному из примитивных типов или к ссылочному типу данных. Если выражение является составного типа данных и требуемый тип данных входит в список допустимых, то приведение типа считается осуществимым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом приведения типа будет значение NULL. Если выражение не содержит в составном типе требуемый тип значения, то выполнение данного запроса завершится ошибкой из-за принципиальной невозможности совершить приведение типов.


Литералы и параметры в языке запросов

В выражениях языка запросов могут напрямую указываться зна-

чения типа «булево», «число», «строка» или «дата». Также могут

использоваться значения параметров запроса.

В следующей таблице приведены все возможные типы литералов

и примеры их значений:

Обратите внимание, что значения типа «дата» задаются с помощью ключевого слова ДАТАВРЕМЯ, после которого в скобках последовательно указываются год, месяц, день, час, минута и секунда.

В запрос также могут передаваться параметры. Эта возможность уже использовалась нами при рассмотрении предложения ГДЕ.

Значения параметров могут использоваться в выражениях языка запросов, для этого необходимо указать символ «&» и после него имя параметра.

Например, выберем все приходные накладные за определенный период. Период будет задаваться параметрами НачДата и КонДата:

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Документ.ПриходнаяНакладная
    ГДЕ Дата МЕЖДУ НачДата и КонДата");
Запрос.УстановитьПараметр("НачДата",ВыбНачалоПериода);
Запрос.УстановитьПараметр("КонДата",ВыбКонецПериода);
Результат = Запрос.Выполнить();

В качестве параметра может быть передано любое значение, например, значение одного из примитивных типов (число, строка, дата, булево), ДокументСсылка, СправочникСсылка, список значений и т.д.

Группы справочника и список значений часто применяются с ключевым словом В. Если передается группа справочника (или родительский элемент для справочников из одних элементов), то можно применить конструкцию В ИЕРАРХИИ:

Например, покажем цены на товары из указанного списка:

//1-й пример: отбор по списку товаров
Запрос = Новый Запрос("
    |ВЫБРАТЬ * ИЗ Справочник.Номенклатура
    |ГДЕ Ссылка В &СписокТоваров");
Запрос.УстановитьПараметр("СписокТоваров",СписокВыбранныхТоваров);
//2-й пример: отбор по группе товаров
Запрос = Новый Запрос("
    | ВЫБРАТЬ * ИЗ Справочник.Номенклатура
    | ГДЕ Ссылка В ИЕРАРХИИ  ГруппаТоваров");
Запрос.УстановитьПараметр("ГруппаТоваров",ВыбГруппа);


Предложение ДЛЯ ИЗМЕНЕНИЯ

Данное ключевое слово позволяет заблокировать определенные данные от изменения другими сеансами работы с информационной базой 1C:Предприятия 8.0. Это необходимо, чтобы в процессе обработки результата запроса была уверенность в актуальности сведений, полученных из запроса. Такая возможность абсолютно необходима при проведении документов, для которых движения документа зависят от данных, содержащихся в регистре на момент проведения документа.

Стоит заметить, что если данные были считаны в транзакции, то они и так не могут быть изменены другими пользователями. Предложение же ДЛЯ ИЗМЕНЕНИЯ позволяет выполнить принудительную блокировку данных, чтобы потом не возникало взаимной блокировки при попытке записи.

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

Следующий пример демонстрирует применение запроса с ключевым словом ДЛЯ ИЗМЕНЕНИЯ:

ВЫБРАТЬ
    Док.Номенклатура, Док.Номенклатура.Услуга КАК Услуга,
    Док.Номенклатура.ЗакупочнаяЦена КАК ЗакупочнаяЦена,
    Док.Количество, Док.Сумма,
    ОстаткиСкл.КоличествоОстаток КАК КоличествоСкл,
    Остатки.КоличествоОстаток, Остатки.СуммаОстаток
ИЗ
    Документ.РасходнаяНакладная.Состав КАК Док
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
    РегистрНакопления.УчетНоменклатуры.Остатки(
    Номенклатура В ( ПарНоменклатура) И
    Склад = ПарСклад) КАК ОстаткиСкл
    ПО
        Док.Номенклатура = ОстаткиСкл.Номенклатура
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
    РегистрНакопления.СтоимостнойУчетНоменклатуры.Остатки(Момент,
    Номенклатура В (ПарНоменклатура)) КАК Остатки
    ПО Док.Номенклатура = Остатки.Номенклатура
    ГДЕ Док.Ссылка = Ссылка

ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.УчетНоменклатуры.Остатки

Необходимо понимать, что в транзакции любые данные защищены от изменения другими пользователями. Опция же ДЛЯ ИЗМЕНЕНИЯ нужна для блокировки от транзакционного чтения. Ее используют, чтобы как можно раньше сказать системе, что данная таблица должна быть заблокирована от чтения.

При работе в клиент-серверном варианте блокировка накладывается только на записи, которые задействованы в запросе. Использование данного ключевого слова позволяет в момент обращения к запросу поставить одного из двух конкурирующих пользователей в состояние ожидания, пока другой проведет свой документ.

Проще говоря, если не использовать данное ключевое слово, то два пользователя прочитают, что товар есть на складе, и как минимум один из них не сможет провести документ. А если применить ДЛЯ ИЗМЕНЕНИЯ, то в момент чтения данных (выполнения запроса) тот, кто позже начал, будет ждать, пока данные освободятся. Поэтому запрос с этим ключевым словом обычно ставят как можно раньше в процедуре проведения документа, чтобы уменьшить количество бесполезных действий.


Обработка результата запроса

Напомним общую схему выполнения запроса:

1. Создание объекта Запрос и передача ему текста запроса.

2. Установка параметров запроса с помощью метода УстановитьПараметр.

3. Выполнение запроса, получение результата запроса.

4. Получение выборки из результата запроса или выгрузка результата запроса в таблицу значений / дерево значений. Также есть возможность использовать результат запроса в качестве источника данных для сводной таблицы.

5. Обход выборки из результата запроса или обработка таблицы значений/дерева значений.

Ниже приведен пример выполнения простого запроса и получения выборки из результата запроса:

Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.Сотрудники";
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаИзРезультатаЗапроса = РезультатЗапроса.Выбрать();

Тот же самый фрагмент можно записать короче. В приведенном ниже примере используется конструктор объекта Запрос с параметром, через который передается текст запроса. Далее запрос выполняется, и сразу же производится выборка из результата запроса:

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Сотрудники");
ВыборкаИзРезультатаЗапроса = Запрос.Выполнить().Выбрать();

Перед получением выборки можно проверить результат запроса на наличие хотя бы одной записи. Для этого предназначен метод Пустой:

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Сотрудники");
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
    ВыборкаИзРезультатаЗапроса = Результат.Выбрать();
КонецЕсли;

В некоторых случаях до получения выборки необходимо определить, какие сведения содержатся в результате. Для решения этой задачи у объекта РезультатЗапроса есть свойство Колонки, через которое можно обратиться к коллекции колонок результата запроса. Например, выведем имена всех колонок результата запроса с указанием их типа и ширины:

Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник.Сотрудники");
Результат = Запрос.Выполнить();
Для Каждого Колонка ИЗ Результат.Колонки Цикл
    Сообщить("Колонка: " + Колонка.Имя + " типа " + Колонка.Тип +
    " имеет ширину " + Колонка.Ширина);
КонецЦикла;


Выборка из результата запроса

Выборка из результата запроса предназначена для обхода его записей. Можно представить себе выборку как некоторый объект, который содержит указатель на текущую запись в результате запроса и предоставляет программе доступ ко всем полям текущей записи. Обход выборки может быть линейный, иерархический или по группировкам. Возьмем результат простого запроса и продемонстрируем на его примере все варианты обхода выборки:

ВЫБРАТЬ Номенклатура, Количество
ИЗ Документ.РасходнаяНакладная.Состав
УПОРЯДОЧИТЬ ПО Номенклатура
ИТОГИ СУММА(Количество) ПО Номенклатура, Номенклатура Иерархия

Результат запроса показан в следующей таблице:

В этой таблице добавлен столбец №1, которого нет в результате запроса, но который будет использоваться нами в дальнейшем для идентификации записи в результате. Итоговые записи в таблице выделены курсивом, а итоговые записи для уровней иерархии справочника выделены жирным шрифтом.

Линейный обход

Первый и самый простой способ обхода — линейный. При линейном обходе выборка будет выдавать записи в той последовательности, в которой они располагаются в результате запроса. В нашем примере это будут записи с номерами 1, 2, 3, 4, 5 и так далее до записи с номером 20.

Для получения линейной выборки необходимо вызвать метод Выбрать объекта РезультатЗапроса без параметров, либо с параметром ОбходРезультатаЗапроса. Прямой.

СпособВыборки = ОбходРезультатаЗапроса.Прямой;
Выборка = РезультатЗапроса.Выбрать(СпособВыборки);
//или эквивалентная запись
Выборка = РезультатЗапроса.Выбрать();

Для навигации по записям запроса используются три метода:

Следующий

Позволяет перейти к следующей записи результата в соответствии с порядком обхода выборки. При первом вызове этот метод позиционирует выборку на первую запись. Когда будут выбраны все записи, данный метод просигнализирует об этом, вернув значение Ложь.

СледующийПоЗначениюПоля

Позволяет получить следующую запись со значением в заданном поле, отличающимся от значения в этом же поле текущей записи.

НайтиСледующий

Позволяет найти запись с заданными значениями некоторых полей.

Ниже приведен простейший пример обхода выборки с помощью метода Следующий:

Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    //действия с записью
КонецЦикла;

Для получения данных текущей записи нужно обращаться к реквизитам объекта Выборка, имена которых совпадают с именами колонок результата запроса:

Запрос = Новый Запрос("
    | ВЫБРАТЬ Код, Наименование КАК ФИО
    | ИЗ Справочник.Сотрудники");
Выборка = Запрос.Выполнить{).Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить("Код: " + Выборка.Код);
    Сообщить("ФИО: " + Выборка.ФИО);
КонецЦикла;

Метод СледующийПоЗначениюПоля позволяет сгруппироватьзаписи результата по значениям полей, например:

ВЫБРАТЬ Док.Товар. Док.Получатель, Док.Количество
ИЗ Документ.РасходнаяНакладная.Состав Док
УПОРЯДОЧИТЬ ПО Док.Товар.Наименование, Док.Получатель.Наименование

Допустим, в результате запроса мы получили следующие записи:

Организуем линейную выборку из результата запроса и обойдем ее при помощи метода СледующийПоЗначениюПоля:

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.СледующийПоЗначениюПоля("Товар") Цикл
    // здесь мы получим записи с номерами 1, 4, 8, 11
    Пока Выборка.СледующийПоЗначениюПоля("Получатель") Цикл
        // здесь мы сначала получим записи с номерами 1, 2, 3
        // затем 4, 6, 6
        // затем 8, 9, 10
        // затем 11, 12, 13, 14
    КонецЦикла;
КоиецЦикла;

Следует обратить внимание на то, что во внутреннем цикле не была выбрана запись с номером 7, так как в ней такое же значение поля Получатель, как и в предыдущей записи.

Заметим, что если во вложенном цикле получать записи с помощью метода Следующий, то будут выбраны все записи со значением поля, заданным в последнем вызове метода СледующийПоЗначениюПоля:

Выборка = РезультатЗапроса.Выбрать() ;
Пока Выборка.СледующийПоЗначениюПоля("Товар") Цикл
    // здесь мы получим записи с номерами 1, 4, 8, 11
    Пока Выборка.Следующий() Цикп
        // здесь мы сначала получим записи с номерами 1, 2, 3
        // затем 4, 5, 6, 7
        // затем 8, 9, 10
        // затем 11, 12, 13, 14
    КонецЦикла;
КонецЦикла;

Метод НайтиСледующий позволяет позиционироваться на запись с нужными значениями полей, при этом текущая запись не рассматривается. В качестве условия поиска можно указать структуру или значение с именем колонки. Если запись найдена, то возвращается Истина, если таких записей больше не найдено, возвращается Ложь.

Метод НайтиСледующий имеет два вариант вызова:

НайтиСледующий(<Структура поиска>)
НайтиСледующий(<Значение>,<Имя колонки>)

Этот метод используется в следующем примере:

Запрос = Новый Запрос("
    |Выбрать Наименование,
    | ГОД(ДатаПриема) КАК Год,
    | МЕСЯЦ(ДатаПриема) КАК Месяц
    | Из Справочник.Сотрудники");
Выборка = Запрос.Выполнить().Выбрать();
    //1-й вариант применения: поиск по структуре
    //выберем всех сотрудников, принятых в июне 2003 года
СтруктураПоиска = Новый Структура("Год,Месяц",2003,5);
Пока Выборка.НайтиСледующий(СтруктураПоиска) Цикл
    Сообщить("Сотрудник" + Выборка.Наименование);
КонецЦикла;
    //2-й вариант: поиск значения по заданной колонке
    //выберем всех сотрудников, принятых в 2003 году
Пока Выборка.НайтиСледующий(2003, "Год") Цикл
    Сообщить("Сотрудник" + Выборка.Наименование);

КонецЦикла;

Иерархический обход

Рассмотрим другой способ обхода результата запроса — иерархический. При данном варианте обходятся только записи, находящиеся на одном уровне. Для получения иерархической выборки из результата необходимо вызвать метод Выбрать объекта РезультатЗапроса с параметром ОбходРезультатаЗапроса.ПоГруппировкамСИерархией:

СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
Выборка = РезультатЗапроса.Выбрать(СпособВыборки);

Выборка из результата запроса с иерархическим обходом в нашем примере обойдет только записи с номерами 1 и 11, так как только эти две записи находятся на самом верхнем уровне.

Проиллюстрируем это, представив наш результат в виде дерева, где узлами будут итоговые записи, а листьями дерева будут детальные записи. Вот что у нас получится:

Из этого рисунка видно, что именно записи с номерами 1 и 11 находятся на первом уровне дерева, и поэтому только они попадают в первый проход иерархической выборки.

Возникает вопрос, как получить остальные записи результата запроса. Для этого у объекта ВыборкаИзРезультатаЗапроса можно получить еще одну выборку, которая будет обходить подчиненные записи текущей записи выборки. В нашем примере в момент, когда объект Выборка будет позиционирован на запись с номером 1, мы запросим у него иерархическую выборку. Таким образом, мы получим выборку, которая вернет записи с номерами 2, 7. А когда Выборка будет спозиционирована на запись с номером 11, то полученная у нее иерархическая выборка вернет записи с номерами 12, 16. Так реализуется иерархический обход результатов запроса.

Заметим, что у выборки можно получать вложенные выборки любого типа. Так, если бы мы запросили у Выборки, спозиционированной на записи 1, линейную выборку, то с ее помощью мы бы получили записи с номерами со 2-го по 10-й.

Проиллюстрируем описанную методику на примере:

Процедура ВыдатьРекурсивно(Выборка) Далее;

Процедура ВыполнитьЗапрос()
    Запрос = Новый Запрос("
    ВЫБРАТЬ Товар, Количество
    ИЗ Документ.РасходнаяНакладная.Состав
    УПОРЯДОЧИТЬ ПО Товар
    |ИТОГИ СУММА(Количество) ПО Товар, Товар ИЕРАРХИЯ");
    СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
    Выборка = Запрос.Выполнить().Выбрать(СпособВыборки);
    ВыдатьРекурсивно (Выборка) ;
КонецПроцедуры
Процедура ВыдатьРекурсивно(Выборка)
    Пока Выборка.Следующий() Цикл
        //выведем в окно сообщений поля из результата
        Товар = Выборка.Наименование;
        Количество = Выборка.Количество;
        Сообщить("Товар: " + СокрЛП(Товар) +
        "Количество: " + СокрЛП(Количество));
        //продолжим выборку подчиненных записей
        СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
        ВыдатьРекурсивно(Выборка.Выбрать(СпособВыборки));
    КонецЦикла;
КонецПроцедуры

Обход по группировкам

Третий, и последний способ обхода результата — по группировкам. Он сходен с иерархическим обходом, но с одним различием: записи с иерархическими итогами при обходе в нем рассматриваются как детальные записи, а не как узловые. Для получения выборки по группировкам из результата запроса необходимо вызвать метод Выбрать объекта РезультатЗапроса с параметром ОбходРезультатаЗапроса.ПоГруппировкам:

СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкам;
Выборка = РезультатЗапроса.Выбрать(СпособВыборки);

Перебрав такую выборку для нашего примера, мы получим записи с номерами 1, 2, 7, 11, 12, 16, например:

Запрос = Новый Запрос("
    | ВЫБРАТЬ Товар, Количество
    | ИЗ Документ.РасходнаяНакладная.Состав
    | УПОРЯДОЧИТЬ ПО Товар
    | ИТОГИ СУММА(Количество) ПО Товар, Товар ИЕРАРХИЯ");
РезультатЗапроса = Запрос .Выполнить();
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкам;
Выборка = Результатаапроса.Выбрать(СпособВыборки);
Пока Выборка.Следующий() Цикл
    //выведем в окно сообщений поля из результата
    Сообщить("Группа товаров: " + СокрЛП(Выборка.Наименование) +
    "Количество: " + СокрЛП(Выборка.Количество));
    //выберем дочерние записи линейным способом
    ВыборкаДочерних = Выборка.Выбрать();
    Пока ВыборкаДочерних.Следующий() Цикл
        Сообщить(" Товар: " + СокрЛП(Выборка.Наименование) +
        " Количество: " + СокрЛП(Выборка.Количество));
    КонецЦикла;
КонецЦикла;

Другие полезные методы

При работе с выборкой из результата запроса будут полезны следующие методы:

Группировка

Возвращает в виде строки имя группировки текущей записи. Если группировки нет, возвращается пустая строка.

Количество

Возвращает количество записей в выборке.

Сбросить

Отменяет позиционирование. После вызова метода Следующий выборка позиционируется на первую запись.

Уровень

Возвращает уровень текущей записи в иерархии и группировках. Уровень считается от начальной выборки из результата запроса.

ТипЗаписи

Этот метод возвращает тип текущей записи запроса, который является одним из значений системного перечисления ТипЗаписиЗапроса: ДетальнаяЗапись, ИтогПоГруппировке, ИтогПоИерархии, ОбщийИтог.


Выгрузка результата запроса

Результат запроса может быть выгружен в таблицу значений или дерево значений с помощью метода Выгрузить. Затем над ними могут быть произведены другие операции: сортировка, свертка, перебор строк и другие действия (см. главу «Коллекции значений»).

Следующий пример выгружает результат запроса в таблицу значений с прямым порядком обхода строк:

Результат = Запрос.Выполнить();
СпособОбхода = ОбходРезультатаЗапроса.Прямой;
ТабЗнач = Результат.Выгрузить(СпособОбхода);

Если используется иерархический обход результата запроса или обход по группировкам, тогда удобнее выгрузить не в таблицу значений, а в дерево значений, как делается в следующем примере:

Результат = Запрос.Выполнить();
СпособОбхода = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
Дерево = Результат.Выгрузить(СпособОбхода);

Результат запроса может быть представлен в виде сводной таблицы, для чего необходимо установить свойство ИсточникДанных объекта СводнаяТаблица. Подробнее про сводные таблицы рассказывается в главе «Отчеты».


Важные отличия от версии 7.7

  • • В 1C:Предприятии 8.0 значительно переработан механизм запросов. Язык запросов стал похож на стандартный SQL, в некоторых аспектах даже превосходя его.

  • • Поддерживаются вложенные запросы.

  • • Поддерживается объединение нескольких запросов (UNION).

  • • Поддерживается соединение таблиц (JOIN), включая внутреннее (INNER), левое внешнее (LEFT OUTER) и правое внешнее (RIGHT OUTER) соединения.

  • • Есть возможность подсчета общих итогов и итогов по группировкам, для чего предназначено предложение ИТОГИ...ПО (TOTALS...BY).

  • • Параметры запроса нужно устанавливать явно с помощью метода УстановитьПараметр. При выполнении запроса не учитывается контекст модуля.

  • • Значительно изменился конструктор запросов. Теперь он может быть вызван и в режиме «Предприятие».

  • • Введено ключевое слово ИМЕЮЩИЕ (HAVING), предназначенное для фильтрации групп.

  • • Добавлено новое ключевое слово ПОДОБНО (LIKE) для проверки соответствия строки шаблону.

  • • Введены ключевые слова ПЕРВЫЕ (ТОР) и РАЗЛИЧНЫЕ (DISCTINCT).

  • • Есть возможность автоупорядочивания результата запроса.

  • • Добавлено ключевое слово ДЛЯ ИЗМЕНЕНИЯ, предназначенное для блокировки данных, используемых в запросе.

  • • Полям и источникам данных можно назначать псевдонимы с помощью ключевого слова КАК (AS).

  • • В результате запроса могут быть поля, являющиеся вложенными результатами запроса. Такие поля образуются при обращении к табличным частям объектов.

  • • Результат запроса может являться источником данных для сводной таблицы.


Глава 7. Отчеты

Глава 7.

Отчеты

В данной главе под отчетами понимаются любые выходные печатные формы. Это могут быть печатные формы первичных документов, всевозможные реестры и собственно отчеты.

Для формирования печатных форм в 1C:Предприятии 8.0 предназначен табличный документ. С помощью элемента управления ПолеТабличногоДокумента он может быть отображен в экранной форме. Табличный документ также иногда используется для ввода данных в систему, поскольку его ячейки могут содержать значения, изменяемые с помощью элементов управления.

Система 1С:Предприятие 8.0 имеет широкие возможности по формированию печатных форм. Обычно табличный документ формируется на основе макета, то есть шаблона. Построение макета производится в Конфигураторе в специальном табличном редакторе. Разработчик может создавать области, изменять высоту строк и ширину колонок, задавать форматирование ячеек и всего табличного документа, включать в макет рисунки, диаграммы и сводные таблицы. На основе макета средствами встроенного языка формируется готовая печатная форма — табличный документ.

Отметим следующие важные особенности табличного документа 1С:Предприятия 8.0:

  • • Поддерживается механизм расшифровок, когда при щелчке на строке или ячейке отчета формируется более детальный отчет или открывается объект базы данных.

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

  • • У ячеек могут быть примечания, содержащие дополнительную информацию. Ячейка с примечанием имеет маленький трeугольник в правом верхнем углу. При наведении курсора мыши на ячейку примечание показывается во всплывающем окне

  • • В табличном документе может быть расположено поле сводной таблицы, которая позволяет отобразить многомерные данные в виде плоской таблицы с вложенными заголовками.

  • • Можно задать различную ширину колонок в разных строках, что позволяет выводить печатные формы очень сложной структуры.

В большинстве случаев табличный документ предназначен для печати, и система предоставляет широкие возможности по настройке печати документа на принтере Можно задавать колонтитулы, масштабирование, поля от края листа, повторяющиеся на каждой странице («сквозные») строки и колонки, количество копий и другие опции.


Макеты

Макет представляет собой шаблон для формирования печатной формы. Макет тоже является табличным документом. Итоговая печатная форма строится на основе макета, как из строительных блоков. Для этого в макете создаются области, предназначенные для однократного или многократного вывода.

Например, ниже представлен макет для печати расходной накладной:

Обратите внимание, что сначала в табличный документ выводятся горизонтальные области Заголовок и Шапка. Ячейки табличного документа обычно содержат текст или параметры, а также могут содержать одновременно текст и параметры, заключенные в квадратные скобки. В последнем случае у таких ячеек свойство Заполнение должно быть установлено в значение «Шаблон». При формировании печатной формы средствами встроенного языка на место параметров будут подставлены конкретные значения.

Далее несколько раз выводится область Строка для каждого товара, т.е. табличный документ наращивается снизу, хотя в 1С:Предприятии 8.0 можно присоединять области и справа.

Затем один раз выводится область Подвал и формирование печатной формы документа завершено. Теперь ее можно показать на экране, распечатать или сохранить в файл.

Макеты могут быть у многих объектов конфигурации, например, у справочников, документов, отчетов, обработок и т.д. Кроме того, в конфигурации могут быть общие макеты, которые не принадлежат конкретному объекту, а располагаются в ветви «Общие макеты» дерева конфигурации.

Сформированная печатная форма может быть записана в файл интерактивно или с помощью метода Записать. Поддерживаются следующие форматы файлов: MXL, MXL7 (для версии 7.7), HTML, XLS (Microsoft Excel™), TXT. С помощью меню «Файл ->Открыть» или кнопки на панели инструментов можно загрузить табличный документ из файла. Это также можно сделать программно с помощью метода Прочитать.


Области

Областью табличного документа называется группа ячеек, имеющая имя. Обычно области включают в себя одну или несколько строк, колонок или любой прямоугольный диапазон ячеек. К области можно обратиться по координатам или имени.

Именование областей

Редактировать имена областей можно через окно свойств или с помощью панели «Имена», предварительно выделив нужный диапазон ячеек.

Панель «Имена» имеет следующие кнопки:

  • • Отображение именованных строк / колонок,

  • • Отображение именованных ячеек,

  • • Назначить имя,

  • • Убрать имя.

Любая область уже имеет системное имя, например:

  • • R5C3 — ячейка в 5-й строке и 3-й колонке;

  • • R5 — 5-я строка;

  • • С3 — 3-я колонка;

  • • R5C4:R6C5 — диапазон ячеек;

  • • СЗ:С5 — ячейки, входящие с 3-ю по 5-ю колонку;

  • • R2:R6 — ячейки, входящие с 2-ю по 6-ю строки;

  • • Т — табличный документ в целом;

  • • D5 — 5-й рисунок (графический объект).

Разработчик может задать собственное имя для области, например, «Шапка», и использовать его при формировании табличного документа. Для вывода пересечения горизонтальной и вертикальной секции можно использовать конструкцию с вертикальной чертой, например, «Обл = Макет.ПолучитьОбласть("Строка | Колонка")». Второй вариант — задать имя для пересечения и работать с этой областью, как с любой другой.

Общая схема работы

Основные методы формирования печатной формы следующие:

Вывести

Выводит в печатную форму очередной фрагмент табличного документа, добавляя его снизу, начиная с первой колонки.

Присоединить

Присоединяет к печатной форме очередной фрагмент табличного документа справа, начиная со строки, с которой выводился предыдущий фрагмент методом Вывести.

Область

Позволяет получить область как объект типа ОбластьЯчеекТабличногоДокумента.

ПолучитьОбласть

Позволяет получить область как объект типа ТабличныйДокумент.

Обратите внимание на различие методов Область и ПолучитьОбласть:

• Метод Область() предоставляет доступ к части табличного документа. Он возвращает объект ОбластьЯчеекТабличногоДокумента, предназначенный для установки форматирования области ячеек, установки текста, значения, примечания и расшифровки. Этот объект можно передать в методы ВставитьОбласть и УдалитьОбласть.

• Метод ПолучитьОбласть() создает отдельный табличный документ из указанной области. Он возвращает объект ТабличныйДокумент, который можно передать в методы Вывести и Присоединить.

Следующая программа формирует простую печатную форму (без данных в ячейках):

ТабДок = Новый ТабличныйДокумент;
//Получение макета
Макет - Документы.РасходнаяНакладная.ПолучитьМакет("Печать");
//получим область как новый табличный документ (!)
Область = Макет.ПолучитьОбласть("Заголовок");
//выведем область в табличный документ
ТабДок.Вывести(Область);
//Шапка
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
//Состав
Для Каждого СтрСостава Из Состав Цикл
    Область = Макет.ПолучитьОбласть("Строка");
    ТабДок.Вывести(Область);
КонецЦикла;
//Подвал
Область = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(Область);
ТабДок.Показать(); //покажем на экране

А следующий пример формирует более сложный отчет. В нем выводятся горизонтальные и вертикальные области, устанавливаются различные свойства области:

ТабДок = ЭлементыФормы.ПолеТабДок;
ТабДок.Очистить();
Макет = ПолучитьМакет("Основной");
//получим область как объект ТабличныйДокумент
ОбластьТабДок = Макет.ПолучитьОбласть("ЛеваяЧастьШапки");
ТабДок.Вывести(ОбластьТабДок);
Для НомМес = 1 По 12 Цикл
    //получим область как объект ОбластьЯчеекТабличногоДокумента
    //свойства области нужно заполнять до ее вывода в печатную форму
    ОбластьЯчеек = Макет.Область("НазваниеМесяца");
    ОбластьЯчеек.Шрифт = Новый Шрифт(,,Истина); //жирный
    ОбластьЯчеек.Текст = НомМес;
    //получим область как объект ТабличныйДокумент
    ОбластьТабДок = Макет.ПолучитьОбласть("МесяцШапка");
    ТабДок.Присоединить(ОбластьТабДок) ;
КонецЦикла;

К области можно обращаться не только через метод Область, но и через свойство-коллекцию Области объекта ТабличныйДокумент.

Следующие примеры эквивалентны друг другу:

ОбластьЯчеек = Макет.Область("НазваниеМесяца") ;
ОбластьЯчеек = Макет.Области("НазваниеМесяца");
ОбластьЯчеек = Макет.Области.НазваниеМесяца,

Событие Выбор

При двойном щелчке (или нажатии Enter) на ячейке табличного документа или рисунке возникает событие Выбор. Это же событие возникает при одинарном щелчке на гиперссылке. Программист может перехватить это событие с помощью процедуры-обработчика.

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


Параметры

Чтобы вывести в ячейку информацию из базы данных, нужно установить свойство Заполнение в значение «Параметр» или «Шаблон», как показано на следующем рисунке:

Если выбрано значение «Параметр», то затем указывается имя параметра, которое будет доступно в модуле через коллекцию Параметры объекта ТабличныйДокумент.

Если выбрано значение «Шаблон», то имена параметров указываются в самой ячейке в квадратных скобках, как, например, ячейка «Директор» в макете расходной накладной.

Внимание! В квадратных скобках строки-шаблона не может быть выражений на встроенном языке, как это допускалось в версии 7.7. При формировании отчета не учитывается контекст модуля. Текст программы на встроенном языке может быть только в программном модуле.

Рассмотрим, как заполняются параметры у объекта ТабличныйДокумент через его свойство-коллекцию Параметры. Следующий фрагмент демонстрирует задание параметров через это свойство:

//получим область как новый табличный документ (!)
Область = Макет.ПолучитьОбласть("Заголовок");

//укажем параметры области
Область.Параметры.НомерДокумента = Номер;
Область.Параметры.От - Дата;
Область.Параметры.Кому = Контрагент;
ТабДок.Вывести(Область) ;
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));

Область = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрСостава Из Состав Цикл
    Область.Параметры.Заполнить(СтрСостава);
    ТабДок.Вывести(Область);
КонецЦикла;
Область = Макет.ПолучитьОбласть("Подвал");

Область.Параметры.ИтогоКоличество = Состав.Итог("Количество");
Область.Параметры.ИтогоСумма = Состав.Итог("Сумма");
РегОтв = РегистрыСведений.ОтветственныеСотрудники;
Область.Параметры.Директор = РегОтв.ПолучитьПоследнее(Дата).Директор;
ТабДок.Вывести(Область);

Обратите внимание на то, что был применен метод Заполнить, который позволяет в краткой форме присвоить значения всем параметрам. Соответствие устанавливается по именам параметров области и именам свойств переданного объекта.


Форматирование

Система 1С:Предприятие 8.0 предоставляет удобные средства оформления внешнего вида печатной формы. Панель «Форматирование» позволяет управлять шрифтом, цветом текста и фона, выравниванием текста и рамками:

Можно отформатировать одну ячейку или сразу несколько, предварительно выделив их мышью. Если удерживать клавишу Ctrl, то можно выделять несмежные ячейки.

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

Средства встроенного языка позволяют при выводе печатной формы задавать форматирование ячеек программным образом. Это дает возможность форматировать ячейки в соответствии с их содержимым.

Например, ниже выводится отчет по остаткам товаров, а товары с остатком меньше критического уровня выделяются красным цветом:

ТабДок = Новый ТабличныйДокумент;
ТекстЗапроса = "ВЫБРАТЬ
|	 СпрНоменклатура.Наименование,
|	 СпрНоменклатура.ЭтоГруппа,
|	 СпрНоменклатура.Ссылка КАК Ссылка,
|	 РегОстатки.КоличествоОстаток КАК Остаток
|ИЗ
|	 Справочник.Номенклатура КАК СпрНоменклатура
|	 ЛЕВОЕ СОЕДИНЕНИЕ
|	 РегистрНакопления.УчетНоменклатуры.Остатки КАК РегОстатки
|	 ПО СпрНоменклатура.Ссылка = РегОстатки.Номенклатура
|ГДЕ ЭтоГруппа = Ложь
|ИТОГИ СУММА(Остаток) ПО Ссылка ТОЛЬКО ИЕРАРХИЯ";
Запрос = Новый Запрос(ТекстЗапроса);
Макет = ПолучитьМакет("Остатки");

Обл = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Обл);
//зафиксируем шапку для удобного просмотра
ТабДок.ФиксацияСверху = ТабДок.ВысотаТаблицы;
Обл = Макет.Область("Строка");
ОбычныйШрифт = Обл.Шрифт;
ОбычныйЦветТекста = Обл.ЦветТекста;
ОбычныйЦветФона = Обл ЦветФона;
//один раз получим область Строка
Обл = Макет.ПолучитьОбласть("Строка");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Остаток = ?(Выборка.Остаток = NULL, 0, Выборка.Остаток);
    Обл = Макет.Область("Строка");
    Обл.Шрифт = ОбычныйШрифт;
    Обл.ЦветТекста = ОбычныйЦветТекста;
    Обл.ЦветФона = ОбычныйЦветФона;
    Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
        Если Остаток <= 2 Тогда
            Обл.Шрифт = Новый Шрифт(ОбычныйШрифт,,,Истина); //жирный
            Обл.ЦветТекста = Новый Цвет(255,0,0); //красный
        КонецЕсли;
    Иначе
        Обл.Шрифт = Новый Шрифт(ОбычныйШрифт,,,Истина); //жирный
        Обл.ЦветФона = Новый Цвет(240,240,255); //сиреневый
    КонецЕсли;
    //установим параметры полученной ранее области Строка
    Обл.Параметры.Номенклатура = Выборка.Ссылка;
    Обл.Параметры.Остаток = Остаток;
    ТабДок.Вывести(Обл);
КонецЦикла;
Обл = Макет.ПолучитьОбласть("Подвал");
ТабДок.Вывести(Обл);
ТабДок.ОтображатьСетку = Ложь;
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Истина;
ТабДок.Показать();


Расшифровки

Система 1С:Предприятие 8.0 поддерживает механизм расшифровок (drill-down, drill-through), когда пользователь щелкает на строке или ячейке отчета и получает более детальный отчет, если, конечно, это предусмотрено разработчиком. Расшифровки делятся на стандартные и нестандартные.

Стандартные расшифровки обрабатываются системой автоматически и не требуют дополнительных усилий от программиста, например:

  • • значения типа «число», «строка», «дата», «перечисление» будут выданы для просмотра;

  • • для документов будет открыта форма документа;

  • • для элементов справочника будет открыта форма элемента, а если справочник редактируется в списке, то курсор будет установлен на текущем элементе в форме списка.

Для выполнения нестандартной расшифровки предназначено событие ОбработкаРасшифровки.

Внимание! Событие ОбработкаРасшифровки можно обработать только, если табличный документ отображается в форме в элементе управления ПолеТабличногоДокумента, а не открывается в отдельном окне. В модуле приложения (аналог глобального модуля в версии 7.7) больше нет события ОбработкаЯчейкиТаблицы.

Ниже показан отчет, в форме которого располагается элемент управления ПолеТабличногоДокумента на закладке «Таблица»:

Рассмотрим на примере, как организовать расшифровку строки. Допустим, необходимо при щелчке на строке выдавать список расходных накладных по данному товару. Это реализуется следующим образом. В форме располагается элемент управления ПолеТабличногоДокумента с именем «ТаблицаРезультат», в свойствах которого указывается процедура-обработчик события ОбработкаРасшифровки.

Замечание. В некоторых случаях бывает затруднительно выделить поле табличного документа, чтобы обратиться к его свойствам Обычно это делается щелчком мыши на границе элемента управления, но это невозможно, когда граница не видна, например, сливается с границей панели. В этом случае необходимо выделить любую ячейку и нажать клавишу ESC, после чего табличный документ будет выделен Затем нажмите Alt-Enter для редактирования его свойств.

Следующая процедура-обработчик события анализирует расшифровку, и, если это элемент справочника Номенклатура, то вызывается процедура РасшифроватьСтроку, а стандартная обработка расшифровки отключается:

Процедура тпРезультатОбработкаРасшифровки(Элемент, Расшифровка,СтандартнаяОбработка)
    Если ТипЗнч(Расшифровка)=Тип("СправочникСсылка.Номенклатура") Тогда
        СтандартнаяОбработка = Ложь; //отключим стандартную обработку
        НовыйТабДок = формаРасшифровки.ЭлементыФормы.ТабДок;
        РасшифроватьСтроку(НовыйТабДок, Расшифровка);
        ФормаРасшифровки.Открыть()
    КонецЕсли;
КонецПроцедуры

Обработку расшифровок у ячейки можно отключить, если задать свойство ИспользованиеРасшифровки в значение «Без обработки». Это же свойство позволяет распространить расшифровку ячейки на всю строку, если установить его в значение «Строка».


Группировки

В 1С:Предприятии 8.0 появилась возможность группировать данные в отчете. Группировки могут быть горизонтальные и вертикальные, тогда слева и сверху появляются специальные маркеры, позволяющие пользователю разворачивать и сворачивать группы. Нажатием цифр 1234 можно развернуть сразу все группировки данного уровня и свернуть более детальные группировки:

Механизм группировок отличается от механизма расшифровок следующими аспектами:

  • • Расшифровка обычно вызывает формирование нового отчета, открываемого в новом окне, а с помощью группировок можно раскрыть или свернуть текущую строку (колонку) в этом же окне.

  • • Нестандартная расшифровка должна быть обработана программистом в процедуре-обработчике события ОбработкаРасшифровки для элемента управления ПолеТабличногоДокумента, а раскрытие и сворачивание группировок обрабатывается системой автоматически.

  • • Расшифровки работают в режиме «только просмотр», а группировки в любом режиме.

Самый простой способ добавить группировки в отчет — доверить эту задачу системе, тогда от разработчика требуются минимальные усилия: необходимо всего лишь применить методы НачатьАвтоГруппировкуСтрок и ЗакончитьАвтоГруппировкуСтрок, которые включают режим автоматической группировки строк. В этом режиме при вызове методов Вывести и Присоединить указываются дополнительные параметры для группировки:

Вывести(<Таблица>, <Уровень>, <Имя группы>, <Открыта>)

Назначение параметров метода Вывести описано ниже:

Таблица

Выводимый фрагмент табличного документа.

Уровень

Этот параметр используется для автоматической группировки строк табличного документа с помощью методов Начать/ЗакончитьАвтоГруппировкуСтрок и Начать/ЗакончитьАвтоГруппировкуКолонок. Соседние строки с одинаковым уровнем будут отнесены к одной группе.

Имя группы

Имя группы, к которой относятся выводимые строки.

Открыта

Признак того, что выводимая группа будет открыта (развернута).

Следующий пример выводит список товаров с группировками в отчете:

ТабДок.НачатьАвтоГруппировкуСтрок();
Пока Выборка.Следующий();
    ТабДок.Вывести(ОбластьТабДок, Выборка.Уровень(},
    Выборка.Наименование, Ложь);
КонецЦикла;
ТабДок.ЗакончитьАвтоГруппировкуСтрок();

В качестве имени группировки назначается наименование товара. Все группы выводятся сначала свернутыми, но пользователь может развернуть любую группу с помощью маркера.

При использовании группировок будет очень удобно, если установить у ячейки свойство АвтоОтступ в какое-нибудь ненулевое значение, например, 5. Тогда система будет автоматически добавлять заданное количество пробелов слева текста ячейки, основываясь на текущем уровне группировки. В результате отчет будет иметь пригодный внешний вид для отображения иерархии данных.

Для ручного управления группами применяются следующие методы объекта ТабличныйДокумент:

НачатьГруппуСтрок

Начинает новую группу строк. Можно создавать вложенные группы строк.

ЗакончитьГруппуСтрок

Заканчивает последнюю из начатых ранее групп строк.

НачатьГруппуКолонок

Начинает новую группу колонок. Можно создавать вложенные группы колонок.

ЗакончитьГруппуКолонок

Заканчивает последнюю из начатых ранее групп колонок. С помощью свойств ИтогиСнизу и ИтогиСправа разработчик может изменять положение маркера группы (сверху или снизу для строк, слева или справа для колонок). Свойства ЦветТекстаГруппировки и ЦветФонаГруппировки позволяют легко управлять форматированием группировок.


Примечания

Ячейки табличного документа могут иметь примечания, тогда в правом верхнем углу ячейки выводится маленький красный треугольник. При наведении мышки на ячейку примечание показывается во всплывающем окне.

Программная установка примечаний реализуется следующим образом:

Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий();
    ОбластьЯчеек = Макет.Область("Номенклатура");
    ОбластьЯчеек.Примечание.Текст = Номенклатура.Комментарий;
    ОбластьТабДок = Макет.ПолучитьОбласть("Номенклатура ");
    ОбластьТабДок.Параметры.Номенклатура = Номенклатура;
    ТабДок.Вывести(ОбластьТабДок);
КонецЦикла;

Обратите внимание, что свойство Примечание у объекта ОбластьЯчеек является объектом типа Рисунок, а не простой строкой. Через этот объект можно редактировать внешний вид примечания, шрифт и цвет текста, фон, линии и т.д.


Значения ячеек

У областей табличного документа помимо самого текста, видимого на экране, может быть значение, что управляется следующими свойствами:

СодержитЗначение

Признак того, что ячейка содержит значение.

ТипЗначения

Объект ОписаниеТипов, определяющий допустимые типы значений, например, типы «булево» и «число».

Значение

Собственно значение ячейки (области), например, число 120 или значение Истина.

ЭлементУправления

Содержит элемент управления для редактирования значения, например, флажок.

Формат

Можно задать формат представления значения, например, «БЛ=Нет; БИ=Да».

Обычно значения ячеек допускается редактировать с помощью элементов управления, например, с помощью поля ввода, поля выбора, флажка и др. Подробнее про элементы управления в табличном документе рассказывается в документации.


Рисунки

В табличном документе могут располагаться рисунки, к которым относятся следующие объекты:

  • • прямая,

  • • прямоугольник,

  • • эллипс,

  • • диаграмма,

  • • картинка,

  • • текст,

  • • примечание,

  • • OLE-объект,

  • • группа графических объектов.

У объекта ТабличныйДокумент есть свойство-коллекция Рисунки, которое позволяет обращаться к рисункам по имени или индексу, а также добавлять или удалять рисунки «на лету», во время выполнения программы. Элементами коллекции являются объекты типа РисунокТабличногоДокумента. Поле ТипРисунка содержит одно из приведенных выше значений, например, прямоугольник.

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

В следующем примере в табличный документ добавляется рисунок и ему устанавливаются некоторые свойства:

Рис = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
Рис.Верх = 10;
Рис.Лево = 10;
Рис.Ширина = 30;
Рис.Высота = 10;
Рис.ОриентацияТекста = -15; //наклон 15 градусов по часовой стрелке
Рис.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Рис.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
Рис.Шрифт = Новый Шрифт (,,Истина); //жирный
Рис.ЦветТекста = Новый Цвет(0,0,255); //синий
Рис.Текст = "Курс";
Рис.Расшифровка = "ИсторияКурса";
Рис.ГиперСсылка = Истина;

У рисунков типа Текст помимо самого текста, видимого на экране, может быть значение, что регулируется свойствами СодержитЗначение, Значение и ТипЗначения. Работают эти свойства аналогично подобным свойствам объекта ОбластьЯчеекТабличногоДокумента (см. выше).


Сводные таблицы

Система 1С:Предприятие 8.0 содержит новый механизм для анализа данных — сводные таблицы. С их помощью можно легко выводить многомерные данные, например, объем продаж в разрезе контрагентов и наименований номенклатуры.

Значения измерений отображаются в верхней или боковой шапке сводной таблицы, а ячейки области данных содержат сводную информацию на пересечении измерений. Пользователь имеет возможность добавить или удалить измерения и ресурсы, поменять их расположение.

Для создания сводной таблицы нужны минимальные усилия от программиста, поэтому это самый простой путь для анализа данных.

Ниже показана сводная таблица из отчета АнализПродаж, извлекающего данные из регистра Продажи:

В специальном окне «Поля сводной таблицы», которое отображается при активизации сводной таблицы, можно включать и выключать измерения и ресурсы. Если оно не отображается, то щелкните правой кнопкой на ячейке сводной таблицы и в контекстном меню выберите пункт «Отображать поля».

У табличного документа есть свойство-коллекция ВстроенныеТаблицы, которое позволяет обращаться к сводным таблицам, расположенным на нем. Через эту коллекцию можно добавлять и удалять сводные таблицы при выполнении программы.

Самое главное свойство сводной таблицы — это ИсточникДанных, которое имеет тип РезультатЗапроса или ПостроительОтчета (см. ниже). Это свойство определяет, откуда сводная таблица будет черпать данные для отображения. При использовании результата запроса его итоги становятся ресурсами (отображаются в области данных), а группировочные поля, по которым они подсчитываются, становятся измерениями.

Следующий пример выбирает данные из регистра накопления Продажи, подсчитывает общее количество и сумму по каждому контрагенту (с учетом иерархии), номенклатуре (с учетом иерархии), периодам и странам. Результат запроса помещается в сводную таблицу для анализа:

Запрос = Новый Запрос("
|	ВЫБРАТЬ
|	 ПродажиОбороты.Контрагент КАК Контрагент,
|	 ПродажиОбороты.Номенклатура КАК Номенклатура,
|	 ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
|	 ПродажиОбороты.СуммаОборот КАК СуммаОборот
|ИЗ
|	 РегистрНакопления.Продажи.Обороты(ПериодС, ПериодПо,
|	 Месяц,,(Контрагент, Номенклатура))
|КАК ПродажиОбороты
|ИТОГИ СУММА(КоличествоОборот) , СУММА(СуммаОборот) ПО
|	 Контрагент ИЕРАРХИЯ,
|	 Номенклатура ИЕРАРХИЯ,
|	 ПродажиОбороты.Период,
|	 ПродажиОбороты.Номенклатура.СтранаПроисхождения КАК Страна
|	 АВТОУПОРЯДОЧИВАНИЕ") ;
Запрос.УстановитьПараметр("ПериодС", Периоде);
Запрос.УстановитьПараметр("ПериодПо", КонецДня(ПериодПо));
Результат = Запрос.Выполнить();
ПолеТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
СводнаяТаблица = ПолеТабДок.ВстроенныеТаблицы.СводнаяТаблица!;
СводнаяТаблица.ИсточникДанных = Результат;
СводнаяТаблица.ОтображатьПоля = Истина;
Если СводнаяТаблица.Колонки.Количество() = 0 И
    СводнаяТаблица.Строки.Количество() = 0 И
    СводнаяТаблица.Данные.Количество() = 0 Тогда
    СводнаяТаблица.Обновление = Ложь;
    // Зададим начальное расположение измерений на осях
    СводнаяТаблица.Колонки.Добавить("Контрагент");
    СводнаяТаблица.Строки.Добавить("Номенклатура");
    СводнаяТаблица.Данные.Добавить("КоличествоОборот");
    СводнаяТаблица.Данные.Добавить("СуммаОборот");
    СводнаяТаблица.Обновление = Истина;
КонецЕсли;

Сформированная сводная таблица выглядит следующим образом:


Диаграммы

Диаграмма - это элемент управления для графического представления табличных данных, например, результатов отчетов. Диаграммы очень удобны для анализа, так как обеспечивают быстрое и целостное восприятие информации, наглядное представление и сравнение

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

При работе с диаграммами необходимо понимать следующие термины:

• Точка — отметка на оси абсцисс, по которой будут установлены значения для каждой серии. Например, конкретная дата, на которую будут отображены курсы всех валют.

• Серия — последовательность значений по одному измерению, например, курс заданной валюты за несколько дней.

Ниже на рисунке показаны основные составные части диаграммы:

Диаграмма может быть сформирована следующими способами:

1. «Вручную» — разработчик средствами встроенного языка создает новые серии, добавляет точки, устанавливает их значения.

2. На основе таблицы значений или табличного документа (свойство ИсточникДанных).

3 С помощью построителя отчета (см ниже).

1-й способ формирования диаграммы — «ручной»

Ниже показан пример создания диаграммы с двумя сериями и тремя точками. С помощью метода УстановитьЗначение задаются значения точек для каждой серии:

Диаграмма = ЭлементыФормы.Диаграмма;
Диаграмма.Очистить ();
Диаграмма.Обновление = Ложь:
Диаграмма.Серии.Добавить("Серия 1")
Диаграмма.Серии.Добавить{"Серия 2")
Диаграмма.Точки.Добавить("Точка 1")
Диаграмма.Точки.Добавить("Точка 2")
Диаграмма.Точки.Добавить("Точка 3")
Диаграмма.УстановитьЗначение(0,0,5)
Диаграмма.УстановитьЗначение(1,0,2)
Диаграмма.УстановитьЗначение(2,0,8)
Диаграмма.УстановитьЗначение(0,1,10);
Диаграмма.УстановитьЗначение(1,1,15) ;
Диаграмма.УстановитьЗначение(2,1,14);
Диаграмма.Обновление = Истина;

Результат работы программы приведен ниже:

2-й способ формирования диаграммы — на основе источника данных

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

Если источником является таблица значений, ее первая колонка должна содержать имена точек диаграммы. Имена серий диаграммы берутся из заголовков колонок (заголовок первой колонки игнорируется).

Следующая таблица значений может быть использована для формирования диаграммы:

Приведенный ниже фрагмент устанавливает свойство ИсточникДанных для диаграммы:

Диаграмма = ЭлементыФормы.Диаграмма;
Диаграмма.Очистить();
Диаграмма.Обновление = Ложь;
Диаграмма.СерииВСтроках = Ложь;
Диаграмма.ИсточникДанных = ТаблицаДанных;
Диаграмма.Обновление = Истина;

3-й способ формирования диаграммы — с помощью построителя отчета

Последний способ, которым может быть сформирована диаграмма, — это использование объекта ПостроительОтчета, если вызвать его метод Вывести и передать ему диаграмму в качестве первого параметра. Построитель отчета описан ниже.


Построитель отчета

В 1С:Предпритии 8.0 появился новый объект ПостроительОтчета, предназначенный для быстрой разработки сложных, настраиваемых пользователем отчетов.

Построитель отчета использует запрос как основу для формирования отчета. Фактически, запрос — это единственное, что требуется запрограммировать, остальное сделает построитель отчета.

Конечно, разработчик имеет средства влиять на этот процесс, например, задать макет для формирования отчета.

Общая схема

Следующая схема показывает входные и выходные данные для построителя отчета:

Цифрами на схеме обозначены следующие действия:

1. На вход построителя отчета подается исходный текст запроса на расширенном языке запросов. Из этого текста могут быть автоматически сформированы доступные отборы, измерения, условия упорядочивания и доступные поля.

2. Пользователь с помощью табличных полей, расположенных в форме, может настроить текущие условия отбора и сортировки, измерения отчета и выводимые поля.

3. Для хорошего визуального представления отчета на вход подается макет или несколько макетов для каждой области отчета.

4. Используя исходный текст запроса, настройки пользователя и макеты, построитель отчета формирует табличный документ, диаграмму или сводную таблицу.

5. Расшифровки отчета передаются в построитель отчета, он корректирует свой запрос и формирует новый отчет.

6. Результат запроса может быть получен в отдельную переменную.

7. Запрос также может быть получен в переменную.

8. Настройки построителя могут быть сохранены в специальном объекте и затем восстановлены. У объекта НастройкиПостроителяОтчета нет свойств и методов, он нужен только для хранения настроек построителя.

Простой пример

Приведем пример использования построителя отчета для конструирования отчета по регистру оборотов Продажи, имеющего два измерения (Контрагент и Номенклатура) и один ресурс (Сумма).

1. Создайте новый отчет (или внешнюю обработку).

2. Создайте у него реквизит Построитель и укажите тип ПостроительОтчета.

3. В модуле объекта (не в модуле формы) напишите следующий текст запроса:

Построитель.Текст = "
| ВЫБРАТЬ

| ПродажиОбороты.Контрагент КАК Контрагент,
| ПродажиОбороты.СуммаОборот КАК СуммаОборот,
| ПродажиОбороты.Товар КАК Товар
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
| (ИТОГИ СУММА(СуммаОборот) ПО
| Контрагент,
| Товар
| АВТОУПОРЯДОЧИВАНИЕ";
//сформировать автоматически настройки построителя,
//исходя из текста запроса
Построитель.ЗаполнитьНастройки();

4. Создайте форму отчета (обработки).

5. Для кнопки Выполнить создайте процедуру-обработчик события Нажатие. В этой процедуре напишите следующий текст:

Построитель.Выполнить();
Построитель.Вывести();

В результате будет сформирован следующий отчет с группировками.

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

  • • Построитель.Порядок — условия сортировки данных;

  • • Построитель.Отбор — условия отбора (фильтры);

  • • Построитель.ИзмеренияСтроки — измерения отчета по строкам, например, Номенклатура;

  • • Построитель ИзмеренияКолонки — измерения отчета по колонкам, например, Контрагент.Вид;

  • • Построитель.ДоступныеПоля — все поля, доступные для выбора;

  • • Построитель.ВыбранныеПоля — выбранные поля для вывода в отчет.

Ниже приведена простая форма, позволяющая управлять настройками построителя отчета:

Пользователь может сконструировать требуемый ему отчет, указав все необходимые настройки построителя отчета. Остальное сделает система, от разработчика фактически больше ничего не требуется.

Например, сделаем поле Контрагент измерением колонки, а не строки, тогда будет сформирован следующий кросс-отчет:

Настройки построителя

Разработчик может управлять построителем отчетов средствами встроенного языка. Например, он может установить отбор или сортировку, задать параметры формирования запроса, отключить вывод шапки, подвала, детальных записей, задать общий макет для построителя отчета, а также макет для каждой области.

В самом тексте запроса можно явно указать настройки построителя (см. ниже «расширение языка запросов»), но обычно они формируются автоматически после указания текста запроса (свойство Текст), для чего необходимо вызвать метод ЗаполнитьНастройки.

Из доступных настроек построителя пользователь интерактивно указывает только те, которые ему нужны. Но настройки построителя также поддаются изменению средствами встроенного языка через соответствующие свойства:

  • • Текст — исходный текст запроса,

  • • Параметры — коллекция параметров для запроса,

  • • Порядок — объект, содержащий условия сортировки,

  • • Отбор — объект, содержащий условия отбора,

  • • ИзмеренияСтроки — коллекция измерений по строкам,

  • • ИзмеренияКолонки — коллекция измерений по колонкам,

  • • ДоступныеПоля — коллекция всех доступных для выбора полей,

  • • ВыбранныеПоля — коллекция всех выбранных полей для вывода в отчет.

Два метода ПолучитьНастройки и УстановитьНастройки позволяют запомнить или восстановить настройки построителя, используя специальный объект НастройкиПостроителяОтчетов.

Этот объект не имеет ни свойств, ни методов, он предназначен только для хранения настроек построителя.

Форматирование отчета

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

Макет для построителя отчета может содержать следующие области-строки:

  • • ШапкаТаблицы,

  • • Заголовок,

  • • <имя измерения>,

  • • <имя измерения>Иерархия,

  • • Детали<имя измерения>,

  • • ОбщиеИтоги.

Ниже показан пример макета с такими областями:

Именованные области макета автоматически будут использованы для вывода соответствующих областей отчета. Можно задать свой макет для каждой области, используя следующие свойства:

  • • МакетДетальныхЗаписей,

  • • МакетШапкиТаблицы,

  • • МакетЗаголовкаОтчета,

  • • МакетПодвалаТаблицы,

  • • МакетПодвалаОтчета.

Обработка результата

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

Вывести()

Создает и показывает на экране новый табличный документ.

Вывести(ТабДок)

Выводит отчет в переданный табличный документ.

Вывести(Диаграмма, ИмяРесурса)

Выводит результат в переданную диаграмму. Можно указать ресурс для отображения на диаграмме. Если имя ресурса не указано, то выводится первый ресурс.

На основе результата, полученного построителем, можно сформировать сводную таблицу, для чего необходимо установить у нее свойство ИсточникДанных:

СводТаб = ЭлементыФормы.ПолеТабДок.ВстроенныеТаблицы.СводнаяТаблица;
СводТаб.ИсточникДанных = Построитель;
СводТаб.ОтображатьПоля = Истина;

Из построителя можно извлечь результат запроса и сам запрос, с помощью свойства Результат и метода ПолучитьЗапрос:

• Свойство Результат содержит объект типа РезультатЗапроса. Используя этот объект, можно открыть выборку из результата запроса и перебрать ее для своих целей, например, вывести новый отчет.

• Метод ПолучитьЗапрос возвращает объект типа Запрос. В его свойстве Текст содержится текст итогового выполненного запроса, который в общем случае может не совпадать с исходным текстом запроса.

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

Есть возможность сделать так, чтобы построитель отчета в этом случае автоматически корректировал свои настройки, например, добавлял дополнительное условие отбора.

Расширение языка запросов

Обычно настройки построителя формируются автоматически исходя из текста запроса с помощью метода ЗаполнитьНастройки, но их можно указать явно прямо в тексте запроса. Язык запросов системы 1C:Предприятие 8.0 имеет особые расширения синтаксиса, предназначенные специально для построителя отчетов. Такие инструкции оформляются в фигурные скобки {...} и игнорируются при обычном выполнении запроса.

В следующем примере инструкции для построителя отчетов выделены жирным шрифтом:

ВЫБРАТЬ

Номенклатура, Номенклатура.Представление,
Контрагент, Контрагент.Представление,
КоличествоОборот КАК Количество,
СуммаОборот КАК Сумма
{ВЫБРАТЬ Номенклатура.*, Контрагент.*,
КоличествоОборот КАК Количество,
СуммаОборот КАК Сумма}
ИЗ
РегистрНакопления.Продажи.Обороты(
{&ПериодС},
{&ПериодПо},,
{Номенклатура.*, Контрагент.*})
{ИТОГИ ПО
Номенклатура.*, Контрагент.*}
ИТОГИ Сумма(Количество), Сумма(Сумма) ПО ОБЩИЕ

Обратите внимание на параметры «{&ПериодС}» и «{ПериодПо}». Эти конструкции при обычном выполнении запроса игнорируются, а при установке свойства Текст построителя они распознаются как поля для отбора, т.е. пользователь сможет указать для них условия отбора.

Конструкция «{ИТОГИ ПО ...}» распознается как ресурсы для построителя отчета. Указание точки со звездочкой («.*») говорит о том, что в построителе будет доступно не только само поле, но и все его вложенные поля, например, реквизиты справочника.


Важные отличия от версии 7.7

  • • Добавлены новые свойства и методы у объектов для работы с печатными формами. Шаблоны печатных форм теперь называются макетами, а секции — областями.

  • • В ячейке отчета нельзя написать выражения, даже если у нее в свойствах установлен тип «Шаблон». При заполнении ячеек типа «Параметр» и «Шаблон» не используется контекст модуля, как это было в версии 7.7. Значения параметров нужно указывать явно через свойство-коллекцию Параметры у объекта ТабличныйДокумент.

  • • Основные методы для формирования печатной формы следующие: ПолучитьМакет, Вывести, Присоединить, ПопучитьОбласть, Область.

  • • Присваивать имена можно не только областям, состоящим из строк и столбцов, но и любой прямоугольной области.

  • • В табличном документе могут быть горизонтальные или вертикальные группировки, которые обычно применяются для показа промежуточных итогов, например, по группам справочника. Группировки могут быть вложенными. Есть возможность автоматически добавлять отступ к тексту ячейки в соответствии с ее уровнем группировки.

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

  • • У ячеек могут быть строковые примечания, всплывающие при наведении курсора мыши на ячейку.

  • • Кроме текста, видимого на экране, у ячеек и рисунков могут быть значения, что управляется свойствами СодержитЗначение, Значение и ТипЗначения. Для изменения значений ячеек обычно применяются элементы управления.

  • • Строки макета могут иметь разную ширину ячеек.

В табличном документе могут быть сводные таблицы и диаграммы.

В качестве рисунка могут выступать прямые линии, прямоугольники, эллипсы, примечания, текст, картинка, OLE-объект и др. У рисунков и диаграмм, как и у обычных ячеек, могут быть расшифровки.

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

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


Глава 8.

Регистры сведений

Регистры сведений предназначены для хранения информации, развернутой по комбинации измерений. Если требуется хранить историю изменений этой информации, то регистр сведений нужно сделать периодическим.

Тип хранимой информации в ресурсах регистра сведений может быть как один из примитивных типов данных (число, строка, дата, булево), так и ссылка на объект базы данных (элемент справочника, документ, значение перечисления и др.). Это принципиально отличает регистр сведений от регистра накоплений, в ресурсах которого может храниться только числовая информация, поддающаяся суммированию.

Например, можно завести регистр СведенияОСотрудниках с измерением Физлицо и ресурсом Состояние. Этот регистр будет хранить текущее состояние сотрудника, которое будет меняться при проведении документов ПриемНаРаботу и Увольнение. Структура регистра сведений СведенияОСотрудниках такова:

Таблица записей этого регистра сведений будет иметь следующий вид:

Другой пример — регистр ЦеныНоменклатуры, имеющий измерения Номенклатура и ТипЦен, а также ресурс Цена. Этот регистр будет хранить текущие цены на товары, например, розничную и оптовую цену.

Структура регистра сведений ЦеныНоменклатуры приведена ниже:

Становится понятно, что регистр сведений хранит информацию именно по комбинации измерений. Если измерений всего два, то это можно отобразить в виде следующей кросс-таблицы:

Необходимо учитывать одно важное свойство регистра сведений: каждая запись однозначно определяется комбинацией измерений.

Если в регистр добавить запись с точно такими же измерениями, как уже существующая, то новая запись перезапишет прежнюю, или будет выдано сообщение об ошибке, в зависимости от варианта записи.

Внимание! В регистре сведений не может существовать две записи с одинаковым набором измерений, периодом (для периодических регистров) и регистратором (для регистров с периодичностью по позиции регистратора). Это принципиально отличает регистр сведений от регистра накоплений, в котором такая ситуация является вполне нормальной (например, два прихода одного товара на один и тот же склад).

Для наглядного представления регистров сведений с тремя измерениями, подошел бы куб или таблица с вложенными группировками. Примером такого регистра может служить регистр сведений МестаРаботыСотрудников с измерениями Сотрудник, Организация, Подразделение и ресурсами Должность, ДатаПриема.

Структура регистра сведений МестаРаботыСотрудников такова:

Таблица записей этого регистра сведений будет выглядеть следующим образом:

Такая структура регистра сведений предполагает, что сотрудник может работать в одной организации в разных подразделениях, но он не может занимать разные должности внутри подразделения одной и той же организации. Если требуется хранить и такие сведения, то нужно ресурс Должность сделать измерением.

Некоторые измерения регистра сведений можно назначить ведущими, что возможно только для измерений, которые являются ссылками на объекты базы данных. Это нужно сделать, если записи регистра не имеют смысла без данного объекта. Тогда удаление объекта базы данных приведет к автоматическому удалению записей регистра сведений, ссылающихся на этот объект. Например, записи о курсе валюты не имеют смысла, если сама валюта была удалена.

Реквизиты регистра сведений

При создании регистра сведений, кроме измерений и ресурсов, можно определить реквизиты регистра. Их можно представить как дополнительные колонки в таблице записей регистра. Реквизиты содержат сопроводительную информацию для каждой записи регистра.

Например, в регистр сведений КурсыВалют можно добавить реквизит Источник, который будет показывать, откуда была получена информация о курсе валюты. Разработчик может использовать реквизиты для отбора нужных записей при обходе выборки или при использовании запроса.

Следующий пример выбирает все записи регистра, у которых реквизит равен определенному значению:

Выборка = РегистрыСведений.КурсыВалют.Выбрать();
Пока Выборка.Следующий() Цикл
    Если Выборка.Источник = ЗаданныйИсточник Тогда
    //
    КонецЕсли;
КонецЦикла;

Режим записи

При редактировании свойств регистра в Конфигураторе можно указать режим записи: «Независимый» и «Подчинение регистратору», что определяет, как будут вноситься записи в регистр: вручную или документами.

Под регистратором понимается документ, которому принадлежат движения по этому регистру. Обычно при проведении документа формируются движения по регистру, но это необязательно. Движения могут быть сформированы из любого места программы, лишь бы они были привязаны к документу-регистратору.


Периодические регистры сведений

В базе данных часто требуется хранить не только текущие сведения, а «помнить» историю изменения значений, например, нужно знать курсы валют на каждую дату, историю изменения должности сотрудника для отчета Карьера, историю цен на товары и т.д.

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

Для периодического реквизита при создании указывается периодичность из следующих возможных значений:

• в пределах секунды,

• в пределах дня,

• в пределах месяца,

• в пределах квартала,

• в пределах года,

• по позиции регистратора (доступен, если режим записи у регистра — «Подчинение регистратору»).

Будьте внимательны при установке периодичности. Это напрямую влияет на возможность извлечения данных средствами встроенного языка, так как нельзя будет получить значение с периодичностью меньшей, чем установленная.

Самый простой пример периодического регистра сведений — КурсыВалют. Этот регистр сведений хранит курсы всех валют на каждый день.

Структура регистра приведена на следующем рисунке:

Таблица записей этого регистра выглядит так:

С помощью метода ПолучитьПоследнее можно получить значение курса валюты, действовавшее на определенную дату. Если в регистре сведений записи на эту дату не окажется, то будет возвращено значение на ближайшую предыдущую дату. Например, для валюты USD на дату 02.01.2002 не был введен курс, тогда будет браться курс на ближайшую предыдущую дату, т.е. на 01.01.2002.

Сделаем регистр сведений ЦеныНоменклатуры периодическим, чтобы развернуть во времени информацию о ценах на товары с периодичностью «День»:

Таблица записей этого регистра будет такова:


Взаимосвязь объектов

Для работы с регистром сведений средствами встроенного языка применяются следующие объекты:

РегистрыСведенийМенеджер

Предоставляет доступ к объектам РегистрСведенийМенеджер через свои свойства. Свойство глобального контекста РегистрыСведений является объектом именно этого типа.

РегистрСведенийМенеджер

Операции над регистром сведений, получение выборки, создание новых наборов записей, доступ к формам и макетам регистра сведений.

РегистрСведенийНаборЗаписей

Операции над несколькими записями, их одновременное считывание и запись в базу данных.

РегистрСведенийЗапись

Доступ к одной записи набора регистра сведений. Объект возвращается методами других объектов, например, методом Добавить объекта РегистрСведенийНаборЗаписей.

РегистрСведенийМенеджерЗаписи

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

РегистрСведенийВыборка

Обеспечивает обход записей регистра сведений (перебор).

РегистрСведенийСписок

Обеспечивает управление списком записей регистра сведений в форме в элементе управления ТабличноеПоле.

РегистрСведенийКлючЗаписи

Этот объект нужен для идентификации записи. Он используется для позиционирования в списке на конкретной записи регистра.

Объекты для работы с регистрами сведений взаимосвязаны друг с другом. Из одних объектов с помощью свойств и методов можно получить другие объекты.

Графически эту взаимосвязь можно представить следующим образом:

Далее более подробно описаны типичные действия над регистром сведений с помощью этих объектов.

Менеджер регистров сведений

Объект РегистрыСведенийМенеджер через свои свойства предоставляет доступ к объектам РегистрСведенийМенеджер. Свойство глобального контекста РегистрыСведений является объектом именно этого типа, например:

РегКурсы = РегистрыСведений.КурсыВалют;
ОтвСотр = РегистрыСведений.ОтветственныеСотрудники;

Объект РегистрыСведенийМенеджер является коллекцией, и для него доступен обход элементов с помощью конструкции «Для Каждого».

Менеджер регистра сведений

Объект РегистрСведенийМенеджер предоставляет доступ к действиям с конкретным регистром. Этот объект позволяет открыть нужную выборку с помощью методов Выбрать и ВыбратьПоРегистратору, создать новый набор записей, создать менеджер записи и ключ записи, через него можно получить форму и макет регистра сведений.

Примеры:

РегКурсы = РегистрыСведений.КурсыВалют;
Выборка = РегКурсы.Выбрать();
МенеджерЗаписи = РегКурсы.СоздатьМенеджерЗаписиО;
Набор = РегКурсы.СоздатьНаборЗаписей();
ФормаСписка = РегКурсы.ПолучитьФормуСписка();
ОсновнойМакет = РегКурсы.ПолучитьМакет("Основной");

Объект РегистрСведенийМенеджер позволяет обращаться к «итогам» регистра. Под «итогами» непериодического регистра сведений понимаются значения ресурсов по заданным измерениям, а для периодических регистров сведений можно получить первое и последнее значение по указанным измерениям, а также срез первых и срез последних записей.

Для обращения к «итогам» регистра сведений применяются методы Получить, ПолучитьПервое и ПолучитьПоследнее, СрезПервых и СрезПоследних, а также запросы (см. главу Запросы). При получении среза первых и среза последних записей, как правило, не указывается одно или несколько измерений.

Метод Получить имеет два варианта синтаксиса:

• Для непериодических регистров сведений:

Получить(<структура>)

Структура должна содержать ключи, соответствующие именам измерений регистра (в произвольном порядке). В качестве значений структуры передаются значения измерений, по которым следует осуществлять отбор.

• Для периодических регистров сведений:

Получить(<Период>, <структура>) где Период — это дата или момент времени, на который требуется получить значения ресурсов.

Метод Получить возвращает структуру, ключи которой совпадают с именами ресурсов, например:

РегКурсы = РегистрыСведений.КурсыВалют;
Отбор = Новый Структура("Валюта",ВыбВалюта);
СтруктураРесурсы = РегКурсы.Получить(ВыбДата, Отбор);
Сообщить(СтруктураРесурсы.Курс);
Сообщить(СтруктураРесурсы.Кратность);

Если записи с такой комбинацией измерений и периода (для периодических регистров) не найдено, то в элементах структуры будут пустые значения.

Следующие методы применимы только для периодического регистра сведений:

• ПолучитьПервое,

• ПолучитьПоследнее,

• СрезПервых,

• СрезПоследних.

Метод ПолучитьПоследнее имеет следующий синтаксис:

ПолучитьПоследнее (<Конец периода>, <структура>)

Если он не находит запись в регистре по данной комбинации измерений точно на заданный период, то возвращается ближайшая более ранняя запись, например:

РегКурсы = РегистрыСведений.КурсыВалют;
Отбор = Новый Структура("Валюта",ВыбВалюта);
СтруктураРесурсы = РегКурсы.ПолучитьПоследнее(ВыбДата, Отбор);
Сообщить(СтруктураРесурсы.Курс);
Сообщить(СтруктураРесурсы.Кратность);

Метод ПолучитьПервое действует аналогично методу ПолучитьПоследнее, за исключением того, что он получает наиболее ранние значения ресурсов по отношению к заданной дате или моменту времени.

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

РегКурсы = РегистрыСведений.КурсыВалют;
КурсыВалютНаДату = РегКурсы.СрезПоследних(ВыбДата);

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

Например, следующая программа получает последние актуальные цены по товарам заданного конкурента:

РегЦены = РегистрыСведений.ЦеныКонкурентов;
Отбор = Новый Структура("Конкурент", ВыбКонкурент);
тзЦеныКонкурента = РегЦены.СрезПоследних(ВыбДата,Отбор);

Метод СрезПервых действует аналогично методу СрезПоследних, за исключением того, что он выбирает срез наиболее ранних записей по отношению к заданной дате или моменту времени.

Для извлечения данных из регистров сведений могут также применяться запросы, описанные в конце этой главы.

Набор записей регистра сведений

Набор записей позволяет оперировать сразу несколькими записями регистра. Набор записей можно целиком прочитать из базы данных, добавить в него записи или изменить их, целиком записать в базу данных. Это основной способ добавления и редактирования записей регистра сведений.

У документов есть свойство Движения, которое предоставляет доступ к наборам записей этого документа по каждому регистру. Как правило, при проведении документов сначала добавляются записи в набор, а затем набор записывается в базу данных. Можно создать новый набор записей из объекта РегистрСведенийМенеджер, если вызвать его метод СоздатьНаборЗаписей. Пока отбор не установлен, набор записей будет распространяться на весь регистр.

Пример:

//создадим новый пустой набор записей, действующий на весь регистр
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

//установим отбор по дате и валюте
//если этого не сделать, то весь регистр
//будет переписан новым набором
Набор.Отбор.Валюта.Значение = ВыбВалюта;
Набор.Отбор.Период.Значение = ВыбДата;
Набор.Отбор.Валюта.Использование = Истина;
Набор.Отбор.Период.Использование = Истина;

//добавим запись в набор (не в базу данных)
НовЗапись = Набор.Добавить();
НовЗапись.валюта = ВыбВалюта;
НовЗапись.Период = ВыбДата;
НовЗапись.Курс = НовыйКурс;

//запишем набор в базу данных
//записи по заданному отбору будут переписаны
Набор.Записать(Истина);

Внимание! Если отбор в наборе записей не установлен, то такой набор перепишет весь регистр. Чтобы этого не произошло, необходимо установить отбор по измерениям регистра, а для периодических регистров дополнительно — по полю Период, если же регистр имеет периодичность «По позиции регистратора», то еще и по полю Регистратор. При записи набора с параметром Истина сначала удаляются все записи с заданным отбором, а затем на их место записываются новые.

Через набор записей можно обращаться к уже существующим записям регистра сведений. Для этого нужно установить свойство Отбор и прочитать записи из базы данных. Свойство Отбор является объектом типа Отбор, свойства которого совпадают с именами измерений регистра сведений и являются объектами типа ЭлементОтбора.

Например:

//создадим новый пустой набор записей
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

//установим условие отбора по дате
Набор.Отбор.Период.Значение = ВыбДата;
Набор.Отбор.Период.Использование = Истина;

//прочитаем записи из базы данных
Набор.Прочитать();
Если НЕ Набор.Выбран () Тогда
    Сообщить("Набор не был прочитан");
КонецЕсли;

//1-й вариант обхода записей набора
Для Каждого запись Из Набор Цикл
    Сообщить(СокрЛП(запись.Валюта) + " " + СокрЛП(запись.Курс));
КонецЦикла;

//2-й вариант обхода записей набора
//индексация записей в наборе начинается с 0
Для н = 0 по Набор.Количество()-1 Цикл

    запись = Набор[н];
    Сообщить(СокрЛП(запись.Валюта) + " " + СокрЛП(запись.Курс));
КонецЦикла;

Записи набора можно выгружать в таблицу значений с помощью метода Выгрузить или, наоборот, загружать записи в набор из таблицы значений с помощью метода Загрузить:

Набор.Прочитать();
тзЗаписи = Набор.Выгрузить();
Набор.Загрузить(тзЗаписи);
Набор.Записать();

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

Можно выгружать в массив и загружать из массива только одну колонку набора записей, для чего предназначены методы ВыгрузитьКолонку и ЗагрузитьКолонку. Выгружаются и загружаются записи, имеющие тот же индекс, что и элементы массива (индексация записей набора и элементов массива начинается с 0).

МассивКурсов = Набор.ВыгрузитьКолонку("Курс");
Набор.ЗагрузитьКолонку(МассивКурсов,"Курс");

Для удаления записей из набора существует два метода: Удалить и Очистить. Первый метод удаляет запись с заданным индексом, хотя в качестве параметра можно передавать и саму запись (объект типа РегистрСведенийЗапись). Второй метод полностью очищает набор, удаляя все записи. Обратите внимание, что записи удаляются из набора, а не из регистра сведений.

Модуль набора записей

У набора записей регистра есть собственный модуль, который открывается из окна редактирования свойств регистра. Можно считать, что модуль набора записей является аналогом модуля любого другого прикладного объекта, например, модуля справочника или модуля документа.

В модуле набора записей регистра могут располагаться процедуры-обработчики событий ПередЗаписью и ПриЗаписи:

ПередЗаписью

Это событие возникает перед записью набора регистра сведений. В процедуре-обработчике можно проверить набор записей на наличие ошибок и отказаться от записи.

ПриЗаписи

Данное событие возникает после записи набора в информационную базу, но до окончания транзакции. В обработчике события также можно отказаться от записи набора.

Выборка из регистра сведений

Объект РегистрСведенийВыборка предназначен для динамического обхода записей регистра сведений. При этом записи считываются из базы данных порциями по мере выборки. Такая схема рационально использует память и позволяет перебрать множество записей регистра, например:

Выборка = РегистрыСведений.КурсыВалют.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(СокрЛГН Выборка.Валюта) + " " +
    СокрЛП(Выборка.Период) + " " +
    СокрЛТКВыборка.Курс) ) ;
КонецЦикла;

Выборку можно ограничить только нужными записями, используя параметры метода Выбрать.

Синтаксис метода Выбрать следующий:

• Для непериодического регистра сведений:

Выбрать (<Отбор>, <Порядок>)

• Для периодического регистра сведений:

Выбрать(<Начало интервала>, <Конец интервала>, <Отбор>, <Порядок>) Параметр Отбор — это структура только с одним элементом, которая задает фильтр по полю. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю. В качестве полей для отбора могут задаваться измерения, для которых в Конфигураторе задан признак индексирования или которые являются ведущими.

Параметры Начало интервала и Конец интервала позволяют задать границы интервала и могут иметь тип «дата», МоментВремени или Граница.

Приведем пример выборки записей периодического регистра сведений за определенный период по заданной валюте:

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

Менеджер записи регистра сведений

Для операций над одной записью регистра сведений применяется объект РегистрСведенийМенеджерЗаписи. Этот объект существует только у независимого регистра сведений, т.е. не подчиненного регистратору.

Например, следующая программа удаляет безвозвратно все записи из регистра сведений КурсыВалютРасчетаЗаргшаты:

Выборка = РегистрыСведений. КурсыВалютРасчетаЗарплаты.Выбрать();
Пока Выборка.Следующий() Цикл
    МенеджерЗаписи = Выборка.ПолучитьМенеджерЗаписи();
    МенеджерЗаписи.Удалить();
КонецЦикла;


Регистр сведений и формы

У регистра сведений могут быть формы для просмотра записей регистра и редактирования конкретной записи. Аналогично справочникам, редактировать запись можно как в списке, так и в диалоге. Обратите внимание, что форма записи используется только для независимого регистра сведений, т.е. не подчиненного регистратору.

Для вывода записей регистра сведений необходимо в форме разместить табличное поле и задать ему свойство ТипЗначения в значение «РегистрСведенийСписок.КурсыВалют».

Обычно редактирование записей вручную производится только для регистров, не подчиненных документу-регистратору, но в

1С:Предприятии 8.0 есть возможность интерактивно редактировать движения документа, для чего обычно создается еще одна закладка «Движения» в форме документа.


Запросы к регистрам сведений

Запросы рекомендуется применять как основное средство извлечения данных из регистров сведений, за исключением некоторых особых ситуаций, когда это значительно усложняет работу программы или требуется экономно использовать память.

В системе 1С:Предприятие 8.0 для обращения к регистрам с помощью запросов используются специальные таблицы-источники данных. Эти таблицы-источники специфичны для каждого вида регистров и делятся на основную и виртуальные:

Основная таблица

Предоставляет доступ ко всем записям регистра.

Виртуальные таблицы

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

Основная таблица регистра сведений

Продемонстрируем, как с помощью запросов можно получать информацию из регистра КурсыВалют, который имеет одно ведущее измерение Валюта, два ресурса — Курс и Кратность и реквизит Источник, показывающий, откуда взялась информация о курсе.

Этот регистр является периодическим с периодом День, значит, в регистре будет храниться история изменения курсов валют за каждый день.

Самый простой случай — получение всех записей регистра КурсыВалют:

ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют

Ниже приведен результат этого запроса:

Данный запрос просто выбирает все записи регистра сведений, не производя никакую дополнительную их обработку. Чтобы получить записи за определенный период или по конкретной валюте, необходимо добавить в запрос условие ГДЕ.

Допустим, нам нужны записи за первый квартал по валюте «EUR», тогда для решения этой задачи нам понадобится следующий запрос:

ВВДРАТЬ * ИЗ РегистрСведений.КурсыВалют
ГДЕ Валюта = &ВыбВалюта И Период МЕЖДУ &НачДата И &КонДата

Результат запроса будет такой:

Чтобы систематизировать знания об основной таблице регистра сведений, приведем список всех полей, которые она предоставляет:

<Имя измерения>

Набор полей, содержащий значения измерений регистра. Имена полей соответствуют именам измерений.

<Имя реквизита>

Набор полей, содержащий значения реквизитов регистра.

<Имя ресурса>

Набор полей, который содержит значения ресурсов регистра.

Активность

Содержит признак активности записи. Записи, для которых значение данного свойства установлено в Ложь, не будут учитываться при получении «первых» или «последних» записей регистра, а также при получении сведений на определенный момент времени.

МоментВремени

Содержит момент времени записи регистра.

НомерСтроки

Содержит номер строки, определяемый как порядковый номер записи в наборе записей.

Период

Содержит период, к которому относится запись регистра. Используется только для периодических регистров.

Регистратор

Содержит ссылку на документ-регистратор движения.

Приведем пример обращения к одному из регистров, записываемых регистраторами (документами).

Возьмем регистр СведенияОСотрудниках и рассмотрим его структуру:

Следующий запрос покажет только нужные поля из этого регистра:

ВЫБРАТЬ Период, Организация,
Физлицо, Должность, Состояние
ИЗ РегистрСведений.СведенияОСотрудниках

Результат запроса показан на следующем рисунке:

Таблица получения среза последних записей

Если мы вернемся к регистру сведений КурсыВалют и проанализируем, для чего обычно он используется, то выясним, что, как правило, требуется узнать последние актуальные курсы валют на рабочую дату или, в общем случае, на произвольную дату. Причем чаще требуется узнать курс какой-то одной валюты.

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

Дата

Указывается дата или момент времени, на которые будут получены сведения. Если параметр не задан, будут выбираться наиболее поздние записи.

Условие

Указывается условие на языке запросов. Оно будет использовано для ограничения состава записей, среди которых будут выбираться наиболее поздние. Условие будет применяться к исходным записям, а не к уже отобранным.

Следующий запрос получает последние актуальные курсы всех валют на заданную дату (или на момент времени):

ВЫБРАТЬ Валюта, Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ВыбДата);

Чтобы получить курс конкретной валюты, можно указать условие получения таблицы среза последних записей:

ВЫБРАТЬ Период, Валюта, Курс
ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&ВыбДата,
Валюта=&ВыбВалюта);

Таблица получения среза первых записей

Виртуальная таблица получения среза первых записей полностью аналогична по структуре и параметрам таблице для среза последних. Например, следующий запрос покажет первый введенный в систему курс для заданной валюты:

ВЫБРАТЬ Период, Валюта, Курс
ИЗ РегистрСведений.КурсыВалют.СрезПервых(&ВыбДата,
Валюта=&ВыбВалюта);


Важные отличия от версии 7.7

  • • Введен новый объект «Регистр сведений», предназначенный для хранения информации практически любого типа, развернутой по комбинации измерений. Для хранения истории изменения этой информации регистр сведений делается периодическим.

  • • Больше нет периодических реквизитов справочников и периодических констант. Вместо них предлагается использовать периодические регистры сведений.

  • • Движения по регистрам могут быть даже у непроведенного документа. Признак проведенности означает, что обработка документа пользователем завершена. За соответствием признака проведенности и актуальности движений документа должен следить разработчик.

  • • Даты движений одного документа могут различаться

  • • Движения документа записываются не по одному, а наборами.

  • • Для документа указывается, по каким именно регистрам он может делать движения.

  • • У регистров могут быть формы и макеты. Например, у регистров сведений может быть форма списка, форма набора записей и форма одной записи. Записи из регистра могут быть показаны на любой форме, в том числе в журнале документов по текущему документу или на закладке «Движения» в форме документа.

  • • У регистров есть модуль набора записей, который может содержать процедуры-обработчики событий ПередЗаписью и ПриЗаписи.


Глава 9. Регистры накоплений

Глава 9.

Регистры накопления

Регистры накопления предназначены для хранения информации, развернутой по комбинации измерений и поддающейся суммированию. Это является важным отличием от регистров сведений, рассмотренных в предыдущей главе.

Другим принципиальным отличием регистров накопления от регистров сведений является то, что две полностью идентичные записи для регистра накопления — вполне нормальное явление. Их ресурсы будут просуммированны, т.е. накоплены, для чего, собственно, и предназначены регистры накопления.

Предположим, что регистр Остатки должен содержать информацию о количестве и стоимости каждого товара на каждом складе.

В идеологии системы 1С:Предприятие 8.0 итоги регистра такого вида представляют собой прямоугольную систему координат, на одной оси которой находятся склады, на другой — товары, а на пересечении конкретного склада и конкретного товара находятся цифры количества товара и стоимости товара:

Этот регистр будет хранить остатки товаров на каждом складе.

При проведении документов ПриходнаяНакладная и Расходная накладная в этот регистр будут добавляться записи о приходе или расходе, что, естественно, повлияет на итоги регистра.

Внимание! Тип записи (приход или расход) определяется свойством ВидДвижения. Но если сделать движение типа «приход» с отрицательными ресурсами, то итоги регистра, конечно, уменьшатся. Это может быть использовано для операций сторнирования.

Под итогами понимается сводная информация, выдаваемая регистром накопления. Это могут быть ответы на следующие вопросы:

• остаток конкретного товара на конкретном складе,

• остаток конкретного товара на всех складах,

• стоимость всех товаров на конкретном складе.

Итоги регистра могут быть получены как на текущий момент времени, так и на любую другую дату или момент времени, а если это регистр оборотов, то за любой период. Как мы увидим ниже, это определяется параметрами методов Остатки и Обороты или параметрами виртуальных таблиц при использовании запросов.

Список записей регистра накопления может выглядеть следующим образом:

При создании регистра накопления, кроме измерений и ресурсов, можно определить реквизиты регистра. Их можно представить как дополнительные колонки в таблице записей регистра. Реквизиты содержат сопроводительную информацию для каждой записи. Например, в регистр накопления Остатки можно добавить реквизит Комментарий, который будет сопровождать каждую запись о движении товара.

Разработчик может использовать реквизиты для отбора нужных записей при обходе выборки или при использовании запроса.

Следующий пример перебирает все записи регистра, у которых реквизит равен определенному значению:

Выборка = РегистрыНакопления.Остатки.ВыбратьО;
Пока Выборка.Следующий() Цикл
Если СокрЛЩВыборка.Комментарий) = ЗаданнаяСтрока Тогда
КонецЕсли;
КонецЦикла;

Регистры остатки и регистры оборотов

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

Разница между ними понятна из их названия и заключается в характере хранимой информации: из регистров остатков можно быстро получить информацию о состоянии средств на момент времени, а из регистров оборотов — данные за период.

Если из регистра нужно быстро получать остаток чего-либо на текущий момент, тогда нужно завести регистр остатков. Если из регистра нужно быстро получать обороты чего-либо за период, тогда нужно создать оборотный регистр.

Регистры остатков

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

Регистры оборотов

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

Теперь, при совершении хозяйственных операций, необходимо будет добавлять запись не только в регистр Взаиморасчеты, но и в регистр ОбъемЗакупок. В этот регистр при совершении клиентом каждой покупки будет заноситься информация о сумме покупки. В результате в регистре будет постоянно накапливаться информация об общем объеме закупок клиента.

Но оборотный регистр дает не только ускорение получения данных за период. При добавлении еще одного измерения Товар, он сможет предоставлять принципиально новую информацию — обороты в разрезе товаров и контрагентов. Например, можно будет легко узнать, сколько конкретный контрагент закупил за период данного товара. Без оборотного регистра получение такой информации было бы очень затруднительно.

Активность записей

Активность записей регистра означает, что они будут использованы при подсчете итогов. Если записи сделать неактивными, то на итоги регистра накопления они влиять не будут. Позже можно включить активность записей, тогда они сразу повлияют на итоги регистра. При переборе записей регистра неактивные записи регистра также включаются в выборку.


Взаимосвязь объектов

Для работы с регистром накопления средствами встроенного языка применяются следующие объекты:

РегистрыНакопленияМенеджер

Предоставляет доступ к объектам РегистрНакопленияМенеджер через свои свойства. Свойство глобального контекста РегистрыНакопления является объектом именно этого типа.

РегистрНакопленияМенеджер

Операции над регистром накопления, получение выборки, создание новых наборов записей, доступ к формам и макетам регистра накопления.

РегистрНакопленияНаборЗаписей

Обеспечивает операции над несколькими записями, их одновременное считывание и запись в базу данных.

РегистрНакопленияЗапись

Обеспечивает доступ к одной записи набора регистра накопления. Этот объект возвращается методами других объектов, например, методом Добавить у объекта РегистрНакопленияНаборЗаписей.

РегистрНакопленияВыборка

С помощью этого объекта можно организовать обход записей регистра накопления (перебор).

РегистрНакопленияСписок

Обеспечивает управление списком записей регистра накопления в форме в элементе управления ТабличноеПоле.

РегистрНакопленияКлючЗаписи

Этот объект нужен для идентификации записи в списке. Он используется для позиционирования в списке на конкретной записи регистра.

Объекты для работы с регистрами накопления взаимосвязаны друг с другом. Из одних объектов с помощью свойств и методов можно получить другие объекты. Графически эту взаимосвязь можно представить следующим образом:

Далее более подробно описаны типичные действия над регистром накопления с помощью этих объектов.

Менеджер регистров накопления

Объект РегистрыНакопленияМенеджер через свои свойства предоставляет доступ к объектам РегистрНакопленияМенеджер. Свойство глобального контекста РегистрыНакопления является объектом именно этого типа, например:

РегОстатки = РегистрыНакопления.ОстаткиТоваров;
РегПродажи = РегистрыНакопления.Продажи;

Менеджер регистра накопления

Объект РегистрНакопленияМенеджер предоставляет доступ к действиям с конкретным регистром. Этот объект позволяет открыть нужную выборку с помощью методов Выбрать и ВыбратьПоРегистратору, создать новый набор записей, получить форму и макет регистра накопления.

Примеры:

РегОстатки = РегистрыНакопления.Остатки;
Выборка = РегОстатки.Выбрать();
МенеджерЗаписи = РегОстатки.СоздатьМенеджерЗаписи{);
Набор = РегОстатки.СоздатьНаборЗаписей();
ФормаСписка = РегОстатки.ПолучитьФормуСписка();
ОсновнойМакет = РегОстатки.ПолучитьМакет("Основной");

Объект РегистрНакопленияМенеджер позволяет обращаться к итогам регистра. Под итогами регистра накопления понимаются сумма значений ресурсов по заданным измерениям. Для обращения к итогами обычно применяются методы Обороты и Остатки, а также запросы. При получении итогов можно не указывать одно или несколько измерений, тогда будут получены сводные итоги по ресурсам с учетом только указанных измерений.

Метод Остатки применим только для регистра остатков и не применим для регистра оборотов. Метод Обороты применим как для регистра оборотов, так и для регистра остатков.

Метод Остатки имеет следующий синтаксис:

Остатки(<Момент времени>, <Отбор>, <Измеренмя>, <Ресурсы>)

Ниже описаны параметры метода Остатки:

Момент времени

Параметр может содержать дату, момент времени или объект типа Граница. Он указывает, на какой момент времени нужно получить остатки регистра.

Отбор

Структура должна содержать ключи, соответствующие именам измерений регистра (в произвольном порядке). В качестве значений структуры передаются значения измерений, по которым следует осуществлять отбор.

Измерения

Содержит список измерений через запятую, для которых надо разворачивать обороты. Если параметр не указан, то остатки будут сформированы по всем измерениям.

Ресурсы

Содержит список ресурсов, для которых надо получить остатки. Если не указано, то будут рассчитаны остатки по всем ресурсам. Метод Остатки возвращает таблицу значений, содержащую колонки с измерениями, указанными в параметре Измерения, и колонки с ресурсами, указанными в параметре Ресурсы.

Следующий пример извлекает из регистра СтоимостнойУчетНоменклатуры количество и стоимость выбранного товара:

РегМенеджер = РегистрыНакопления.СтоимостнойУчетНоменклатуры;
Отбор = Новый Структура("Номенклатура",ВыбТовар);
тзОстатки = РегМенеджер.Остатки(,Отбор);
Если тзОстатки.Количество() > 0 Тогда
    КоличествоТовара = тзОстатки[0].Количество;
    СтоимостьТовара = тзОстатки[0].Сумма;
КонецЕсли;

Метод Обороты имеет следующий синтаксис:

Обороты(<Начало периода>, <Конец периода>,
<Отбор>, <Измерения>, <Ресурсы>)

Параметры Начало периода и Конец периода могут содержать дату, момент времени или объект типа Граница. Они указывают, за какой период нужно получить обороты. Остальные параметры аналогичны таким же параметрам метода Остатки. Метод Обороты также возвращает таблицу значений, содержащую колонки с измерениями, указанными в параметре Измерения. Если производится обращение к регистру остатков, то названия колонок для ресурсов формируются следующим образом «<Имя ресурса>Приход» и «<Имя ресурса>Расход». При обращении к регистру оборотов названия колонок совпадают с именами ресурсов, как показано в следующем примере:

//обращение к регистру остатков
Отбор = Новый Структура("Номенклатура",ВыбТовар);
тзОбороты = РегистрыНакопления.УчетНоменклатуры.Обороты(,,Отбор);
Если тзОбороты.Количество() > 0 Тогда
    ПриходТовара = тзОбороты[0] .КоличествоПриход;
    РасходТовара = тзОбороты[0].КоличествоРасход;
КонецЕсли;

//обращение к регистру оборотов
Отбор = Новый Структура("Номенклатура",ВыбТовар);
тзОбороты = РегистрыНакопления.Продажи.Обороты(,,Отбор);
Если тзОбороты.Количество() > 0 Тогда
    ОборотТовара = тзОбороты[0].Сумма;
КонецЕсли;

Менеджер регистра накопления позволяет пересчитывать итоги и устанавливать границу периода, по которую итоги будут считаться рассчитанными. Для этого предназначены следующие методы:

ПересчитатьИтоги

Позволяет осуществить полный пересчет итогов регистра накопления.

ПолучитьПериодРассчитанныхИтогов

Возвращает дату, по которую рассчитаны итоги регистра накопления.

УстановитьПериодРассчитанныхИтогов

Устанавливает месяц, на который рассчитывается итоги. Обратите внимание, что доступ к итогам регистра возможен всегда. Граница рассчитанных итогов влияет лишь на производительность получения итогов по данному регистру. Актуальность итогов регистров можно также установить интерактивно, используя пункт меню «Операции -> Управление итогами»:

Набор записей регистра накопления

Набор записей позволяет оперировать сразу несколькими записями регистра. Набор записей можно целиком прочитать из базы данных, добавить в него записи или изменить их, целиком записать в базу данных. Важно понять, что это единственно возможный способ добавления и изменения записей регистра накопления.

У документов есть атрибут Движения, который предоставляет доступ к наборам записей этого документа по каждому регистру, поэтому при проведении документов сначала добавляются записи в набор, а затем набор записывается в базу данных.

Можно создать новый набор записей из объекта РегистрНакопленияМенеджер, если вызвать его метод СоздатьНаборЗаписей, например:

Набор = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Значение = ВыбДок;
Движ = Набор.Добавить();
Движ.Регистратор = ВыбЦок;
Движ.Номенклатура = ВыбТовар;
Движ.Контрагент = ВыбКонтрагент;
Движ.Период = РабочаяДата;
Движ.Количество = Количество;
Движ.Сумма = Сумма;
Набор.Записать(Ложь); //добавить к набору записей по документу

Внимание! При записи набора методом Записать с параметром Истина сначала удаляются все записи с заданным отбором, а затем на их место записываются новые. Если передать параметр Ложь, то запись будет добавлена к уже существующим. Напомним, что, в отличие от регистра сведений, для регистра накопления две записи с одинаковыми полями — вполне нормальная ситуация.

Через набор записей можно обращаться к уже существующим записям регистра накопления. Для этого нужно установить свойство Отбор и прочитать записи из базы данных. Свойство Отбор является объектом типа Отбор, свойства которого совпадают с именами измерений регистра и являются объектами типа ЭлементОтбора.

Например:

Набор = РегистрыНакопления. Продажи. СоздатьНаборЗаписей () ;
Набор.Отбор.Регистратор.Значение = ВыбДок;
Набор.Прочитать();
Для Каждого движ Из Набор Цикл
    Сообщить(движ.Сумма);
КонецЦикла;

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

Набор.Прочитать() ;
тзЗаписи = Набор.Выгрузить{);
Набор.Загрузить(тзЗаписи);
Набор.Записать();

Можно выгружать в массив и загружать из массива только одну колонку набора записей, для чего предназначены методы ВыгрузитьКолонку и ЗагрузитьКолонку:

МассивОстатков = Набор.ВыгрузитьКолонку("Количество");
Набор.ЗагрузитьКолонку(МассивОстатков,"Количество");

Выгружаются и загружаются записи, имеющие тот же индекс, что и элементы массива (индексация записей набора и элементов массива начинается с 0).

Для удаления записей из набора существует два метода Удалить и Очистить. Первый метод удаляет запись с заданным индексом, но в качестве параметра можно передавать и саму запись (объект типа РегистрНакопленияЗапись). Второй метод полностью очищает набор, удаляя все записи. Обратите внимание, что записи удаляются из набора, а не из регистра накопления. Для чтения записей или итогов регистра, кроме методов Выбрать, Остатки и Обороты, могут быть использованы запросы, о чем рассказано ниже в этой главе. О самом механизме запросов вы можете прочитать в главе «Запросы».

Модуль набора записей

У набора записей регистра накопления есть собственный модуль, который открывается из окна редактирования свойств регистра. Можно считать, что модуль набора записей является аналогом модуля любого другого прикладного объекта, например, модуля справочника или модуля документа. В модуле набора записей регистра накопления могут располагаться процедуры-обработчики событий ПередЗаписью и ПриЗаписи. Их назначение точно такое же, как у модуля набора записей регистра сведений, описанного в предыдущей главе.

Выборка из регистра накопления

Объект РегистрНакопленияВыборка предназначен для динамического обхода записей регистра. При этом записи считываются из базы данных порциями по мере выборки. Такая схема рационально использует память и позволяет перебрать множество записей регистра, например:

Выборка = РегистрыНакопления.Остатки.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(СокрЛП(Выборка.Товар) + " " +
    СокрЛП(Выборка.Склад) + " " +
    СокрЛП(Выборка.Количество));
КонецЦикла;

Выборку можно ограничить только нужными записями, используя параметры метода Выбрать. Синтаксис метода Выбрать следующий:

Выбрать (<Начало интервала>, <Конец интервала>, <Отбор>, <Порядок>) ,

Назначение параметров метода Выбрать таково:

Начало интервала, Конец интервала

Позволяют задать границы интервала и могут иметь тип «дата», МоментВремени или Граница.

Отбор

Структура только с одним элементом, которая задает фильтр по полю. Ключ структуры описывает имя поля, а значение структуры — значение отбора по этому полю.

Приведем пример выборки записей регистра накопления за определенный период по заданному товару:

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


Запросы к регистрам накопления

Основное предназначение регистра накопления — это быстрое получение остатков на любой момент времени или оборотов за заданный период. Для решения этих задач регистр накопления предоставляет три виртуальные таблицы Остатки, Обороты и комбинированную таблицу ОстаткиИОбороты.

Сведения о применимости таблиц-источников для каждого типа регистра приведены в следующей таблице («+» обозначает применимость, «-» обозначает неприменимость)

Основная таблица регистра накопления

Основная таблица регистра накопления существует для обоих типов регистров (остатков и оборотов) и предоставляет следующие ПОЛЯ.

<Имя измерения>

Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений.

<Имя реквизита>

Набор полей содержит значения реквизитов регистра

<Имя ресурса>

Набор полей содержит значения ресурсов регистра

Активность

Содержит признак активности записи, т.е говорит о том, учитываются ли записи при получение итогов регистра ВидДвижения Значение системного перечисления ВидДвиженияНакопления, которое определяет вид движения записи — приход или расход

Регистратор

Содержит ссылку на документ-регистратор движения.

Период

Содержит период (дату) записи регистра.

МоментВремени

Содержит момент времени записи регистра

НомерСтроки

Содержит номер строки, определяемый как порядковый номер записи в наборе по данному регистратору. Следующий простой запрос выбирает несколько столбцов из оборотного регистра накопления Продажи:

ВЫБРАТЬ Период, Регистратор, Номенклатура, Количество, Сумма
ИЗ РегистрНакопления.Продажи

Результат запроса показан ниже:

Таблица получения остатков

Таблица получения остатков существует только у регистра остатков и предоставляет в распоряжение разработчику следующие пол-

<Имя измерения>

Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений.

<Имя ресурса>Остаток

Набор полей содержит остатки ресурсов регистра. Имена полей соответствуют именам ресурсов с добавлением слова Остаток.

Следующий запрос показывает остатки по регистру УчетНоменклатуры:

"ВЫРАТЬ * ИЗ РегистрНакопяения.УчетНоменклатуры.Остатки

В результате получим следующие записи:

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

Для этого у таблицы получения остатков имеются следующие параметры:

Период

Указывается дата или момент времени, на который рассчитываются остатки. Если параметр не задан, итоги рассчитываются по самую последнюю запись.

Условие

Указывается условие на языке запросов, которое будет использовано для ограничения состава записей, по которым будут выбираться итоги. Если параметр не задан, анализируются все активные записи регистра. Например, следующий запрос получает остатки конкретного товара на заданную дату на каждом складе:

ВЫБРАТЬ *
ИЗ РегистрНакопления.УчетНоменклатуры.Остатки(&ВыбДата,
Номенклатура=&ВыбТовар)

Результат запроса показан ниже:

Таблица получения оборотов

Таблица получения оборотов существует у регистра остатков и регистра оборотов. Эта таблица включает следующие поля:

<Имя измерения>

Набор полей содержит значения измерений регистра. Имена полей соответствуют именам измерений.

<Имя ресурса>Оборот

Набор полей содержит обороты по ресурсам регистра. Имена полей соответствуют именам ресурсов с добавлением слова Оборот. Для оборотных регистров оборот подсчитывается как сумма всех движений. Для регистров остатков оборот подсчитывается как сумма всех движений Приход со знаком + (плюс) и Расход со знаком - (минус).

<Имя ресурса>Приход

Набор полей содержит суммы всех движений типа «приход» по ресурсам регистра. Имена полей соответствуют именам ресурсов с добавлением слова Приход. Это поле существует только для регистров остатков.

<Имя ресурса>Расход

Набор полей содержит суммы всех движений типа «расход» по ресурсам регистра. Имена полей соответствуют именам ресурсов с добавлением слова Расход. Это поле существует только для регистров остатков.

Период

Содержит начальную дату и время периода, к которому относится оборот регистра. Существует в случае, если только используется разворот по периодам, т.е. параметр Периодичность имеет какое-либо значение, например, Год, Квартал, Запись и т.д.

Регистратор

Содержит ссылку на документ-регистратор движения. Существует только в случае, если параметр Периодичность имеет значение Регистратор или Запись.

НомерСтроки

Содержит номер строки, определяемый как порядковый номер записи в наборе записей. Это поле существует, если только параметр Периодичность имеет значение Запись.

Следующий простой запрос показывает все поля из таблицы Обороты регистра Продажи:

ВЫБРАТЬ * ИЗ РегистрНакопления.Продажи.Обороты

Результат запроса следующий:

Для регистра остатков УчетНоменклатуры картина будет немного другая:

ВЫРАТЬ * ИЗ РегистрНакопления.УчетНоменклатуры.Обороты

Результат запроса содержит следующие колонки:

Напомним, что для регистра остатков колонка <ИмяРесурса>Оборот рассчитывается как разность между колонками <ИмяРесурса>Приход и <ИмяРесурса>Расход.

Таблица получения оборотов для регистра накопления имеет следующие параметры вызова:

Начало периода

Указывается начало периода расчета итогов.

Конец периода

Указывается конец периода расчета итогов.

Периодичность

Указывается дополнительный разворот итогов по периодичности. Задается один из следующих вариантов: Период (не разворачивать), Регистратор, День, Неделя, Декада, Месяц, Квартал, Полугодие, Год.

Условие

Указывается условие на языке запросов. Условие может оперировать полями регистра накопления. Оно будет использовано для ограничения состава записей, по которым будут выбираться обороты. То есть условие будет применяться к исходным записям, а не к уже отобранным. Если параметр не задан, анализируются все активные записи регистра.

Например, следующий запрос показывает месячные обороты конкретного товара по каждому складу за заданный период:

ВЫБРАТЬ * ИЗ РегистрНакопления.УчетНоменклатуры.Обороты(
&НачДата,
&КонДата,
Месяц,
Номенклатура=&ВыбТовар)

Таблица получения остатков и оборотов

В языке запросов системы 1С:Предприятие 8.0 существует возможность получения комбинированной информации по остаткам и оборотам. Для этого предназначена таблица-источник ОстаткиИОбороты, которая существует у регистра остатков и регистра оборотов.

Таблица ОстаткиИОбороты предоставляет следующие поля:

• <Имя измерения>,

• <Имя ресурса>НачальныйОстаток,

• <Имя ресурса>КонечныйОстаток,

• <Имя ресурса>Оборот,

• <Имя ресурса>Приход,

• <Имя ресурса>Расход,

• Период (поле существует только, если в параметрах указана периодичность, не равная Период),

• Регистратор (если периодичность Регистратор или Запись),

• НомерСтроки (если периодичность Запись)

При вызове данной таблицы есть возможность указать следующие параметры:

• Начало периода,

• Конец периода,

• Периодичность,

• Метод дополнения,

• Условие.

Нуждается в пояснении параметр «Метод дополнения». Он задает один из следующих вариантов:

Движения

В этом случае будут выданы те периоды, в которых были движения.

ДвиженияИГраницыПериода (по умолчанию)

В этом случае выбираются периоды, в которых были движения, а также периоды на начало и конец заданного интервала.

Пример обращения к этой таблице приведен ниже.

ВЫБРАТЬ
Номенклатура, Склад, Период,
ВЫРАЗИТЬ(КоличествоНачальныйОстаток КАК ЧИСЛО(15,3)) НачОстаток,
ВЫРАЗИТЬ(КоличествоПриход КАК ЧИСЛО(15,3)) Приход,
ВЫРАЗИТЬ(КоличествоРасход КАК ЧИСЛО{15,3)) Расход,
ВЫРАЗИТЬ(КоличествоКонечныйОстаток КАК ЧИСЛО(15,3)) КонОстаток
ИЗ РегистрНакопления УчетНоменклатуры.ОстаткиИОбороты(
НачДата, &КонДата, Месяц, , Номенклатура=&ВыбТовар)
ИТОГИ
Сумма(НачОстаток),
Сумма(Приход),
Сумма(Расход),
Сумма(КонОстаток) ПО ОБЩИЕ

Этот запрос показывает остатки и обороты для конкретной номенклатуры по всем складам с разворотом по месяцам. Дополнительно подсчитываются общие итоги, что потребовало приведения данных к числовому типу с помощью конструкции ВЫРАЗИТЬ.

Результат запроса показан ниже:


Регистр накопления и формы

У регистра накопления могут быть формы для просмотра всех записей регистра или набора записей У регистра накопления нет формы одной записи регистра. Форма списка записей регистра в режиме «Предприятие» может выглядеть следующим образом (на примере регистра оборотов Продажи).

Для вывода записей регистра в форме необходимо разместить табличное поле и задать ему свойство ТипЗначения

В 1С:Предприятии 8.0 есть возможность редактировать вручную движения документа, для чего обычно создается еще одна закладка «Движения» в форме документа.

Чтобы добиться этого эффекта, нужно для табличного поля задать свойство ТипЗначения в значение «РегистрНакопленияНаборЗаписеи УчетНоменклатуры» Это происходит, когда вы устанавливаете свойство Данные в значение «Движения УчетНоменклатуры».


Важные отличия от версии 7.7

  • • Объект «Регистр накопления» по назначению аналогичен объекту «Регистр» из версии 7.7, но имеет некоторые отличия.

  • • Для получения итогов регистра накопления используются методы Обороты и Остатки. Также могут быть использованы запросы.

  • • Для документа можно указать, по каким именно регистрам он может делать движения.

  • • Дата движений документа может не совпадать с датой документа.

  • • У регистров накопления могут быть формы и макеты. Например, у регистров накопления может быть форма списка и форма набора записей.

  • • Записи из регистра могут быть показаны в любой форме, в том числе в журнале документов по текущему документу или на закладке «Движения» в форме документа.

  • • У регистров накопления есть модуль набора записей, который может содержать процедуры-обработчики событий ПередЗаписью и ПриЗаписи.


Глава 10.

Бухгалтерский учет

В этой главе кратко описаны механизмы бухгалтерского учета, реализованные в 1C:Предприятии 8.0(cm*.).

К объектам, с помощью которых реализуется бухгалтерский учет, относятся следующие:

  • • планы счетов,

  • • планы видов характеристик (для ведения аналитического учета по субконто),

  • • регистры бухгалтерии (с поддержкой и без поддержки корреспонденции).

Эти же механизмы могут быть использованы для реализации не только стандартного бухгалтерского учета, принятого на национальном уровне, но и любой другой схемы учета и планирования на предприятии, например, «западного» учета, управленческого учета, финансового планирования, бюджетирования и т.д. Причем несколько схем учета и планирования можно вести в одной информационной базе параллельно, и они нисколько не будут мешать друг другу. Наоборот, это будет способствовать более четкому управлению и более глубокому анализу деятельности организации.

* На момент выхода версии 1С:Предприятия 8.0.3 (31.07.2003) эти механизмы включены в поставку в целях бета-тестирования.


Планы счетов и регистры

Планы счетов и регистры бухгалтерии

Средства 1С:Предприятия 8.0 позволяют вести учет в одной базе сразу нескольких юридических лиц, получать бухгалтерские итоги по каждой фирме и консолидированные сведения по холдингу.

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

Например, ниже показана структура регистра бухгалтерии Управленческий:

По сравнению с версией 7.7, измерения регистра бухгалтерии являются аналогами «разделителя учета». В прежней версии у плана счетов задавался разделитель учета, который мог быть только один. В версии 8.0 были введены измерения регистра бухгалтерии, которых может быть несколько.

При определении структуры регистра бухгалтерии создаются ресурсы, которые будут отражать числовую информацию, например, сумму проводки, количество, валютную сумму и т.д. Состав ресурсов определяется разработчиком.

В версии 7.7 состав ресурсов был ограничен тремя полями: сумма, валютная сумма (если по счету велся валютный учет), количество (если по счету велся количественный учет). В версии 8.0 состав ресурсов регистра бухгалтерии полностью определяется разработчиком.

Каждый регистр бухгалтерии связан только с одним планом счетов. Но это не запрещает иметь сразу несколько регистров бухгалтерии, привязанных к одному плану счетов.

В плане счетов указываются признаки учета, который затем могут быть использованы при редактировании свойств измерений и ресурсов регистра бухгалтерии. Они имеют тип булево, т.е. могут принимать два значения: Истина или Ложь. Например, признак учета Количественный указан в свойствах ресурса Количество. Это означает, что ресурс Количество будет иметь смысл только для тех счетов, для которых установлен признак Количественный.

Аналогичная ситуация с признаком учета Валютный и ресурсом ВалютнаяСумма. Этот ресурс будет иметь смысл, только если по счету ведется валютный учет (т.е. признак учета Валютный установлен в значение Истина).

При задании структуры плана счетов можно указать так называемые признаки учета субконто. Признак учета по субконто показывает, ведется ли учет данного вида в разрезе данного субконто на данном счете. Например, с помощью признака «Количественный» мы можем указать, будет ли вестись количественный учет в разрезе материалов на 10 счете. Если мы укажем, что количественный учет не ведется, то мы не сможем получить количественный остаток или оборот по конкретному материалу или группе материалов на 10 счете. Количественные показатели будут доступны только для счета в целом. При этом суммовой учет в разрезе субконто Материалы будут вестись, и, соотвественно, можно будет получить суммовые остатки или обороты по конкретному материалу. Кроме измерений и ресурсов у регистра бухгалтерии могут быть реквизиты. В них содержится дополнительная информация, сопровождающая каждую запись регистра бухгалтерии (проводку).

Например, могут быть заведены реквизиты Комментарий и КодЖурнала. Впоследствии эти реквизиты можно использовать для поиска и отбора записей регистра бухгалтерии.

Графически взаимосвязь объектов для реализации бухгалтерского учета показана на следующей схеме:

План видов характеристик указывается в свойствах плана счетов как источник видов субконто. Обычно в конфигурации создается план видов характеристик с именем ВидыСубконто.

Следующая структура регистра бухгалтерии позволяет реализовать так называемый «трехвалютный учет», при котором для каждой проводки хранится:

  • • сумма в национальной валюте (например, рубли),

  • • сумма в валюте операции (которая может быть любой, например, рубли, доллары США, евро)

  • • сумма в корпоративной валюте, предназначенной для управленческого учета (например, евро).

Для поддержки «трехвалютного учета» в 1С:Предприятии 8.0 может быть сделано следующее:

  • • для хранения суммы в национальной валюте создается балансовый ресурс Сумма;

  • • для хранения суммы в валюте операции создается небалансовое измерение Валюта и небалансовый ресурс ВалютнаяСумма;

  • • для хранения суммы в корпоративной валюте добавляется балансовый ресурс КорпСумма.

Субсчета

Любой счет в плане счетов может иметь субсчета. Это отличается от версии 7.7, где при создании счета спрашивалось, будет ли счет иметь субсчета и, в зависимости от ответа, он создавался группой или обычным счетом. Теперь любой счет может иметь субсчета, причем количество уровней их иерархии не ограничено.

В новой версии возможны проводки по родительским счетам. Даже если у счета есть субсчета, то по нему могут делаться проводки, например, допускается проводка Дт20 Кт76, хотя у счетов 20 и 76 могут быть субсчета.

Маска кода счета никак не связана с иерархией счетов. Это означает, что у счета 20 могут быть субсчета «Общехоз» или, например, субсчет 25, однако это может привести к путанице, поэтому рекомендуется назначать код счета в соответствии с уровнем иерархии.

Предопределенные счета

Разработчик может завести счета в плане счетов еще на этапе создания приложения. Такие счета называются предопределенными, и для них недоступны некоторые операции в режиме «Предприятие», например, такой счет нельзя удалить. Любой предопределенный счет имеет имя, по которому к нему будет производиться обращение в программных модулях. Например, счет 60 может иметь имя «Поставщики».

Ниже показано окно для редактирования предопределенных счетов:

Внимание! В прежней версии 7.7 обращение к счетам часто производилось по коду с помощью функции СчетПоКоду. В новой версии к предопределенным счетам рекомендуется обращаться по имени счета. Это даст возможность бухгалтеру изменить код счета без нарушения работы программы.

Корреспонденция

В традиционном для стран СНГ бухгалтерском учете для балансовых счетов поддерживается корреспонденция. Это означает, что каждая проводка имеет дебет и кредит, причем сумма проводки по дебету равна сумме по кредиту, например, проводка Дт20 Кт70 на сумму 1000 руб.

Для забалансовых счетов корреспонденция не поддерживается, т.е. поддержка баланса не контролируется. Для некоторых моделей управленческого или западного учета корреспонденция не используется.

В 1C:Предприятии 8.0 есть два типа регистров бухгалтерии:

  • • с поддержкой корреспонденции (обязательно указывается дебет и кредит каждой проводки),

  • • без поддержки корреспонденции (у каждой проводки есть вид движения — дебет или кредит).

Измерения и ресурсы в регистре бухгалтерии могут быть балансовыми или небалансовыми. По балансовым измерениям и ресурсам подсчитываются общие итоги (баланс) и поддерживается принцип двойной записи. А для небалансовых измерений и ресурсов реализовано раздельное хранение данных по дебету и кредиту, например, ВалютаДт и ВалютаКт (небалансовое измерение Валюта), ВалСуммаДт и ВалСуммаКт (небалансовый ресурс ВалСумма). Такой принцип хранения увеличивает гибкость автоматизированной системы для отражения хозяйственных операций при учете и планировании.


Виды субконто

Для реализации аналитического учета по субконто (не по субсчетам) используется новый прикладной объект «План видов характеристик». Этот объект описывает возможные характеристики, в разрезе которых требуется вести аналитический учет, например, Контрагенты, Договоры и т.д.

Основное свойство у плана видов характеристик — это «Тип значения характеристик», которое указывает на объекты конфигурации, используемые в качестве субконто, например, СправочникСсылка.Номенклатура, СправочникСсылка.Склады, ДокументСсылка.Договор, ПеречислениеСсылка.ВидыБюджетов и т.д.

Составной тип данных указывается в следующем окне:

Для плана видов характеристик, используемого в качестве видов субконто плана счетов, не рекомендуется использовать примитивные типы. Это может существенно сказаться на производительности при записи движений регистра бухгалтерии. Рекомендуется использовать только ссылочные типы данных.

Предопределенные виды субконто

Аналогично предопределенным счетам, в плане видов характеристик еще на этапе разработки обычно указываются предопределенные виды характеристик (виды субконто), например, Контрагенты, Склады и т.д.

Ниже показано окно для редактирования предопределенных видов характеристик:

При редактировании предопределенного счета в Конфигураторе можно выбрать виды субконто только из предопределенных видов характеристик. В режиме «Предприятие» пользователь может добавить новые виды субконто и прикрепить их к определенному счету (предопределенному или нет), но он не может отменить у счета ведение учета в разрезе предопределенного вида субконто. Например, в режиме «Предприятие» у счета 41 нельзя удалить субконто Номенклатура, так как оно является предопределенным.


Запросы к регистрам бухгалтерии

Внимание! Перед чтением этого раздела рекомендуется прочитать главу «Запросы».

Извлечение информации из регистров бухгалтерии обычно производится с помощью запросов. Для этого система 1C:Предприятие 8.0 предоставляет в распоряжение разработчику несколько таблиц-источников данных для запроса. К ним относятся:

Основная таблица записей

Доступ к записям регистра бухгалтерии (проводкам). Доступна вся информация о проводке, кроме субконто.

ДвиженияССубконто

Доступ к записям регистра бухгалтерии с учетом субконто. Является расширением предыдущей таблицы.

ЗначенияСубконто

Доступ к значениям субконто. Обычно эта таблица соединяется в запросе с какой-нибудь другой таблицей.

Остатки

Получение остатков по счетам, измерениям и субконто.

Обороты

Получение оборотов по счетам и между счетами, а также по измерениям и субконто.

ОстаткиИОбороты

Получение начальных и конечных остатков, а также оборотов за период по счетам, измерениям и субконто.

ОборотыДтКт

Эта таблица существует только для регистров бухгалтерии с поддержкой корреспонденции. Она предназначена для получения дебетовых и кредитовых оборотов между счетами, измерениями и субконто.

Каждая таблица-источник предоставляет свой набор полей. Некоторые таблицы имеют параметры, которые позволяют наложить ограничение на выборку, а также задать периодичность.

Разберем на примерах, как извлекать из регистра бухгалтерии требуемую информацию. Реализуем некоторые стандартные бухгалтерские отчеты с помощью запросов.

Структура регистра бухгалтерии

Ниже в примерах будет использован регистр бухгалтерии Основной, поддерживающий корреспонденцию и имеющий следующую структуру:

Движения без субконто

Самой простой тип запросов — получение детальных записей регистра. Для этого используется основная таблица-источник регистра бухгалтерии.

Обратите внимание, что для небалансовых измерений и ресурсов, а также для счета существуют поля с добавлением «Дт» и «Кт», например, ВалютаДт:

ВЫБРАТЬ
Период, 				//дата и время записи
Регистратор, НомерСтроки,	//документ и номер строки
Организация, 			//балансовое измерение Организация
СчетДт, СчетКт, 			//счета дебета и кредита
Сумма, 				//балансовый ресурс Сумма
ВалютаДт, ВалютаКт, 		//небалансовое измерение Валюта
ВалютнаяСуммаДт, ВалютнаяСуммаКт, //небалансовый ресурс
КоличествоДт, КоличествоКт, 	//небалансовый ресурс Количество
ВалютнаяСумма
ЖО 					//реквизит записи ЖО
ИЗ РегистрБухгалтерии.Основной

Результат запроса представлен ниже:

Заметьте, что эта таблица не предоставляет информацию о субконто. Для этого предназначена следующая таблица.

Движения с указанием субконто

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

Это реализуется в следующем запросе:

ВЫБРАТЬ
Период, 			//дата и время записи
Организация, 		//балансовое измерение Организация
СчетДт, СчетКт,		//счета дебета и кредита
Сумма, 			//балансовый ресурс Сумма
ВидСубконтоДт1, СубконтоДт1,//вид и значение субконто 1 по дебету
СубконтоДт2, 		//субконто 2 по дебету
СубконтоКт1 , СубконтоКт2, //субконто 1 и 2 по кредиту
КоличествоДт КолДт, КоличествоКт КолКт, //небалансовый ресурс
Количество
ЖО 				//реквизит записи ЖО
ИЗ РегистрБухгалтерии.Основной.ДвиженияССубконто

Результат запроса представлен ниже:

Остатки по счетам

Абсолютно необходимая информация для бухгалтера — остатки по счетам. Сформируем отчет, который будет показывать остатки по счетам для каждой организации и консолидированный остаток по счету. Для этого нам понадобится следующий запрос:

ВЫБРАТЬ
ОсновнойОстатки.Организация КАК Организация,
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
УПОРЯДОЧИТЬ ПО
ОсновнойОстатки.Счет.Код
ИТОГИ СУММА(СуммаОстаток) ПО
Организация,
Счет

Результат запроса представлен в виде сводной таблицы:

Валютные остатки по счетам

Так как в нашем регистре есть измерение Валюта, то возможно получить остатки по каждой валюте в разрезе счетов и организаций. Это можно сделать следующим запросом:

ВЫБРАТЬ
ОсновнойОстатки.Организация КАК Организация,
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК Остаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
УПОРЯДОЧИТЬ ПО
ОсновнойОстатки.Счет.Код
ИТОГИ СУММА(Остаток) ПО
Организация,
Счет,
Валюта

Результат запроса показан ниже в виде сводной таблицы:

Обороты по счетам

Сформируем отчет, который покажет дебетовые и кредитовые обороты по счетам в разрезе организаций. Это можно сделать с использованием таблицы Обороты, задействуй поле Счет и измерение Организация.

Следующий запрос это демонстрирует:

ВЫБРАТЬ
ОсновнойОбороты.Счет КАК Счет,
ОсновнойОбороты.Организация КАК Организация,
ОсновнойОбороты.СуммаОборотДт КАК ОборотДт,
ОсновнойОбороты.СуммаОборотКт КАК ОборотКт
ИЗ
РегистрБухгалтерии.Основной.Обороты КАК ОсновнойОбороты
УПОРЯДОЧИТЬ ПО Счет.Код
ИТОГИ СУММА(ОборотДт), СУММА(ОборотКт) ПО
Счет,
Организация

Результат представлен в следующей сводной таблице:

Обороты между счетами

Отчет, показывающий обороты между счетами, можно сформировать на основе таблицы Обороты, используя поля Счет и КорСчет:

ВЫБРАТЬ
ОсновнойОбороты.Счет КАК Счет,
ОсновнойОбороты.КорСчет КАК КорСчет,
ОсновнойОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрБухгалтерии.Основной.Обороты КАК ОсновнойОбороты
УПОРЯДОЧИТЬ ПО
Счет.Код, КорСчет.Код
ИТОГИ СУММА(СуммаОборот) ПО
Счет,
КорСчет

Результат запроса приведен ниже:

Таблица Обороты также предоставляет поля Субконто и КорСубконто для того, чтобы получать обороты по субконто или между субконто.

Параметры виртуальной таблицы Обороты позволяют указывать начало и конец периода, периодичность, условия по счетам и субконто.

Оборотно-сальдовая ведомость

Оборотно-сальдовая ведомость показывает остатки на начало и конец периода и обороты за период. Ее можно легко сформировать, используя виртуальную таблицу ОстаткиИОбороты:

ВЫБРАТЬ
Счет КАК Счет,
СуммаНачальныйОстатокДт КАК НачОстДт,
СуммаНачальныйОстатокКт КАК НачОстКт,
СуммаОборотДт КАК ОборотДт,
СуммаОборотКт КАК ОборотКт,
СуммаКонечныйОстатокДт КАК КонОстДт,
СуммаКонечныйОстатокКт КАК КонОстКт
ИЗ
РегистрБухгалтерии.Основной.ОстаткиИОбороты(ШачДата, &КонДата)
УПОРЯДОЧИТЬ ПО
Счет.Код
ИТОГИ СУММА(НачОстДт), СУММА(НачОстКт),
СУММА(ОборотДт), СУММА(ОборотКт),
СУММА(КонОстДт), СУММА(КонОстКт)
ПО Счет

Обратите внимание на параметры виртуальной таблицы НачДата и КонДата. Они задают определенный период, за который формируется оборотно-сальдовая ведомость.

Результат представлен в виде сводной таблицы:

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


Важные отличия от версии 7.7

  • • Структура регистра бухгалтерии настраивается разработчиком. Он определяет, какие будут храниться ресурсы (например, Сумма и ВалСумма) и по каким измерениям (например, Организация и Подразделение).

  • • У регистра бухгалтерии может быть несколько измерений (разделителей учета). Это позволяет вести учет и планирование, например, в разрезе юридических лиц и подразделений компании одновременно.

  • • Регистров бухгалтерии может быть несколько. Каждый регистр привязан к определенному плану счетов. У регистра может быть несколько форм списка и форм набора записей.

  • • Запросы к бухгалтерским итогам выполняются через общий механизм запросов. Виртуальные таблицы регистра бухгалтерии поддерживают получение остатков и оборотов по счетам, субконто и в других разрезах.

  • • Больше нет системного документа «Операция», но подобный документ можно легко создать самостоятельно.

  • • Аналитический учет по субконто реализован через новый объект «План видов характеристик».

  • • Дата движений документа (проводок) может не совпадать с датой документа.


Глава 11.

Сложные периодические расчеты

Система 1С:Предприятие 8.0 содержит специальный механизм для реализации сложных периодических расчетов(cm * ). Наиболее типичным примером использования данного механизма является расчет заработной платы.

Как известно, автоматизация расчета зарплаты является одной из наиболее сложных прикладных задач. При этом практически во всех системах автоматизации из-за различий в законодательствах для каждой страны создается уникальный модуль расчета зарплаты.

Механизм сложных периодических расчетов 1С:Предприятия 8.0 представляет собой универсальный инструментарий, существенно упрощающий реализацию таких сложных расчетных задач, как заработная плата.

Этот же механизм может использоваться для автоматизации любых других расчетов, где присутствуют следующие аспекты:

  • • периодичность (день, неделя, месяц, год),

  • • сложность (необходимость хранения промежуточных результатов расчета, взаимное влияние записей, вытеснение по времени, перерасчеты одних записей при изменении других и т.д.).

В новой версии 1С:Предприятия для реализации сложных периодических расчетов предназначены следующие объекты:

  • • планы видов расчета,

  • • регистры расчета.

Кроме вышеперечисленных, активно применяются и другие объекты конфигурации:

  • • В справочниках хранятся объекты, которые используются в качестве разрезов периодических расчетов, например, физические лица, подразделения организации, должности сотрудников и т.д.

  • • Регистры сведений могут хранить любую информацию, развернутую по нескольким измерениям. Кроме того, они могут быть периодическими, тогда информация дополнительно разворачивается во времени. При помощи регистров сведений реализуются графики учета времени (аналог календарей в версии 7.7). Например, при расчете зарплаты это будут графики работы сотрудников предприятия.

  • • Документы предназначены для ввода записей в регистры расчета. Например, документы Отпуск, Премия.

  • • Отчеты используются для вывода детальной и сводной информации, например, отчеты РасчетныеЛистки, Свод.

Так как в версии 8.0 все объекты конфигурации входят в стандартную поставку, то в прикладных решениях вполне возможно активно использовать регистры расчета совместно с регистрами накопления, планами счетов и регистрами бухгалтерии.

* На момент выхода версии 1C:Предприятия 8.03 (31.07.2003) эти механизмы включены в поставку в целях бета-тестирования.


Планы видов расчета

Сложные расчеты обычно состоят из нескольких актов расчета, или промежуточных результатов, имеющих самостоятельную ценность и обязательных для хранения.

Например, зарплата сотрудника включает следующие промежуточные расчеты:

  • • расчет основных начислений (оклад, тариф),

  • • расчет отклонений (отпуск, больничный),

  • • расчет дополнительных начислений (премии, доплаты, дивиденды),

  • • расчет налогов и других удержаний (НДФЛ, алименты),

  • • другие расчеты (взносы в фонды, накопительная и страховая часть пенсии),

  • • расчет итоговой суммы к выдаче.

При расчете зарплаты сотрудников нельзя ограничиться расчетом итоговой суммой к выдаче, поскольку многие промежуточные результаты расчета подлежат обязательному сохранению и используются для отчетности в государственные органы. Для реализации таких промежуточных результатов в 1C:Предприятии 8.0 предназначены виды расчета, сгруппированные в планы видов расчета.

Каждый план видов расчета описывает схему взаимодействия записей регистра расчета и позволяет задать правила, по которым будут производиться расчеты записей, их взаимное расположение во времени и правила их перерасчета.

Планов видов расчета может быть несколько. Распределение видов расчета по планам не является произвольным, так как у плана есть некоторые общие характеристики, которые будут действовать на все входящие в него виды расчетов. Например, поддержка взаимного вытеснения по периоду действия характерна для основных начислений и отклонений (оклад, отпуск) и не характерна для налогов и удержаний (НДФЛ, алименты).

Внимание! Виды расчета в версии 8.0 не являются объектами конфигурации, как это было в 7.7. Они хранятся в планах видов расчета, т.е. являются объектами данных, а не метаданных.

Предопределенные виды расчета

В плане видов расчетов еще на этапе разработки прикладного решения могут быть заведены предопределенные виды расчетов.

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

Здесь прослеживается аналогия с планами счетов и предопределенными счетами. Фактически, с помощью предопределенных видов расчета на этапе разработки конфигурации задается схема расчета для конкретной предметной области.

Взаимосвязь видов расчета

Для каждого вида расчета в следующем окне указываются базовые, ведущие и вытесняющие его виды расчетов:

Ниже приведено описание этих взаимосвязей между видами расчета:

Базовые — это такие виды расчета, результаты которых используются при расчете данного вида расчета. Например, сумма по окладу используется при расчете доплаты к окладу, а основные начисления являются базовыми для расчета НДФЛ.

Ведущие — это виды расчета, при изменении результатов которых нужно пересчитать данный вид расчета. Например, при изменении оплаты по окладу «задним числом» необходимо пересчитать оплату отпуска, поскольку при расчете отпускных используется средняя зарплата сотрудника за предыдущие месяцы. Список ведущих видов расчета может не совпадать со списком базовых.

Вытесняющие — это виды расчета, период действия которых не должен пересекаться с периодом данного вида расчета. Вытесняющие виды расчета имеют больший приоритет вытеснения, поэтому они вытесняют по времени данный вид расчета. Например, оплата отпуска вытесняет оплату по окладу, а оплата по больничному вытесняет оплату отпуска и оплату по окладу.

При вытеснении записи с определенным периодом действия ее фактический период действия может измениться, т.е. уменьшится или разделится на несколько интервалов. Например, запись об отпуске с 10 по 20 число месяца вытесняет запись об окладе, у которой период действия — весь месяц. Тогда фактический период действия записи об окладе будет состоять из двух интервалов: с 1 по 9 число и с 21 по конец месяца.


Регистры расчета

Регистры расчета предназначены для хранения записей расчета (промежуточных и итоговых результатов). Формы регистра позволяют просматривать записи расчетов.

Например, ниже на рисунке приведена форма регистра ОсновныеНачисления:

Как видно, в этом регистре для каждого физического лица хранятся результаты расчета основных начислений (по окладу, отпуску) и т.д. Двойной щелчок на записи открывает документ-регистратор, который ввел эту запись в регистр расчета.

Каждый регистр расчета основан на определенном плане видов расчета. При редактировании регистра расчета указываются и другие его характеристики, например, периодичность расчетов, поддержка механизма получения базы, поддержка периода действия (для механизма вытеснения), графики, по которым будут контролироваться периоды действия, и т.д.

Структура регистра расчета определяет, какая именно информация и в каких разрезах будет храниться в регистре. Разработчик указывает измерения, ресурсы и реквизиты регистра:

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

Ресурсы — результаты расчета, например, ресурс Начислено для регистра ОсновныеНачисления, ресурс Удержано для регистра Налоги и т.д. Ресурсы могут быть только числового типа.

Реквизиты — дополнительная характеристика записи расчета. Реквизиты могут быть почти любого сохраняемого в базе данных типа. Например, реквизиты Дни и Часы для регистра ОсновныеНачисления, реквизит ДокументОсг для регистра Удержания.

Ниже на рисунке показана структура регистра расчета НачисленияСотрудников:

Графики

Если у регистра установлен флажок «Период действия», то можно заполнить свойства «График», «Значение графика» и «Дата графика». Фактически график представляет собой непериодический регистр сведений, описывающий распределение во времени исходных данных для расчета. Например, это может быть график работы организации с разбивкой по рабочим дням и часам, график продолжительности рабочих смен, расписание лекционных часов и т.д.

Ниже приведен пример регистра сведений, который служит графиком работы водителей:

Внимание! Регистр сведений, используемый в качестве графика, не должен быть периодическим. Вместо этого у него заводится измерение типа «дата».

Перерасчеты

Система позволяет автоматически отслеживать записи, требующие перерасчета. Такая ситуация может возникнуть, когда их результаты каким-то образом связаны с другими видами расчета, а те были изменены (удалены или добавлены новые записи).

Например, при изменении начислений сотрудника нужно пересчитать налоги. Тогда для вида расчета «НДФЛ» начисления будут являться ведущими видами расчета, что настраивается в плане видов расчета на закладке «Ведущие».

Допустим, у нас есть регистры расчета ОсновныеНачисления, Премии и Удержания. Налоги рассчитываются после всех начислений и премий, так как используют их результаты.

Для автоматического отслеживания актуальности записей о налогах по каждому сотруднику необходимо у регистра Удержания создать перерасчет с измерением Физлицо. В качестве данных базовых регистров назначается измерение Физлицо из регистра ОсновныеНачисления и регистра Премии.

Ниже на примере показана схема работы перерасчета:

В каждом регистре выделены измененные записи. Следовательно, связанные с ними записи в регистре Удержания стали неактуальными, т.е. требуют пересчета, что отражается в таблице пересчета.

Таким образом, перерасчет — это таблица, сохраняющая значения измерений, по которым требуется перерасчет. Кроме измерений, в этой таблице хранятся виды расчетов и ссылки на документы-регистраторы. С помощью таблицы перерасчета можно определить, какие записи стали неактуальными и требуют перерасчета (или по крайней мере более пристального внимания).

Запросы к регистрам расчета

Запросы к данным регистра расчета позволяют извлечь информацию о произведенных расчетах. В запросах можно обращаться к следующим таблицам-источникам:

  • • основная таблица записей регистра расчета,

  • • таблица фактического периода действия,

  • • таблица перерасчета.

С помощью средств механизма запросов можно группировать результаты расчета в необходимых разрезах, подсчитывать итоги, отбирать только нужные записи расчета. Это позволяет сформировать весь спектр необходимых отчетов, например, РасчетныеЛистки, ЛицевыеСчета, ВедомостьВыплатыЗарплаты и т.д.

Механизм запросов был подробно описан в главе «Запросы».Список полей таблиц-источников регистров расчета приведен в документации.


Важные отличия от версии 7.7

  • • Введен новый объект «План видов расчета» — отдаленный аналог видов расчета в 7.7. Виды расчета теперь являются объектами данных, а не метаданных.

  • • В плане видов расчета могут быть предопределенные виды расчета. В режиме «Предприятие» пользователь может завести собственные виды расчета и настроить их характеристики.

  • • Вместо исключенных групп расчета предлагается использовать встроенные механизмы плана видов расчета и регистров расчета. Для объединения видов расчета в группы можно использовать и другие объекты, например, реквизиты видов расчета, или создать справочник.

  • • Введен новый объект «Регистр расчета» — отдаленный аналог журнала расчетов в 7.7. Регистр расчета имеет измерения, ресурсы и реквизиты, настраиваемые разработчиком.

  • • Вместо календарей для реализации графиков работы теперь используются регистры сведений.

  • • Изменился механизм перерасчетов, для чего применяется подчиненный объект регистра расчета — перерасчет.


Глава 12.

Взаимодействие с другими системами

Система 1С:Предприятие 8.0 имеет широкие возможности по интеграции с другими системами. Она содержит целый набор средств и механизмов для взаимодействия и обмена данными.

К таким средствам относятся:

  • • Обмен данными через файлы. Это могут быть текстовые или dbf-файлы, а также XML-документы. Табличный документ 1С:Предприятия 8.0 может быть сохранен в формате Microsoft Excel™.

  • • Взаимодействие через СОМ-соединение для обеспечения быстрого и надежного программного доступа к 1С:Предприятию 8.0.

  • • Взаимодействие через механизм Automation, при котором 1С:Предприятие 8.0 может выступать в качестве клиента и сервера, т.е. как управляемое и как управляющее приложение.

  • • Поддержка интернет-технологий: работа с электронной почтой (e-mail), операции с файлами по протоколами HTTP, HTTPS,FTP.

  • • Технология внешних компонент, позволяющая подключать dll-библиотеки, разработанные специально для 1С:Предприятия.

  • • Размещение в форме элементов управления ActiveX.

Все эти средства позволяют строить комплексные решения с участием 1С:Предприятия 8.0.


Текстовые файлы

Объект «ТекстовыйДокумент»

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

При работе с текстовым документом можно манипулировать его строками, для чего предназначены следующие методы:

ДобавитьСтроку

Добавляет строку в конец текстового документа.

ЗаменитьСтроку

Заменяет строку с указанным номером на переданную.

ВставитьСтроку

Вставляет в текстовый документ строку с указанным номером.

Удалить Строку

Удаляет из текстового документа строку с указанным номером.

КоличествоСтрок

Получает количество строк в тексте.

ПолучитьСтроку

Получает строку текстового документа по номеру.

Следующий пример демонстрирует применение этих методов:

Текст = Новый ТекстовыйДокумент;
Текст.Прочитать("catalog.txt", КодировкаТекста.МЖ!);
Текст.ЗаменитьСтроку(52, "Установка оборудования " + Стоимость);
Текст.ВставитьСтроку(53, "Замена оборудования... ");
Текст.УдалитьСтроку(10);
Текст.ДобавитьСтроку("Конец файла");
Для н = 1 По Текст.КоличествоСтрок() Цикл
    стр = Текст.ПолучитьСтроку(н);
    сообщить(стр);
КонецЦикла;
Текст.Записать("catalog2.txt",КодировкаТекста.ANSI);
Текст.ТолькоПросмотр = Истина;
Текст.Показать();

Можно прочитать весь текстовый документ в строковую переменную или, наоборот, в текстовый документ записать значение строковой переменной. Для этого предназначены методы ПолучитьТекст и УстановитьТекст. Текст, содержащийся в текстовом документе до исполнения метода УстановитьТекст, удаляется:

стр = ТекстДок.ПолучитьТекст();
ТекстДок.УстановитьТекст(стр);

Метод Очистить позволяет полностью очистить текстовый документ (удалить все строки). С помощью метода Показать текстовый документ можно отобразить на экране. Если установить свойство ТолькоПросмотр в значение Истина, то пользователь не сможет изменить текстовый документ.

Последовательный доступ к тексту

При работе с большими текстовыми файлами бывает необходимо применить последовательный доступ, при котором весь файл не загружается в память и в один момент времени производится обработка только фрагмента файла. После чтения/записи очередного фрагмента к нему нельзя уже вернуться (в памяти его больше нет), поэтому такой доступ называется последовательным.

Текст обычно хранится в кодировке UNICODE, но объекты ЧтениеТекста и ЗаписьТекста умеют работать и с другими кодировками.

Объект «ЗаписьТекста»

Объект ЗаписьТекста предназначен для последовательной записи текстовых файлов. Приведенный ниже фрагмент запишет небольшой текстовый файл:

Файл = Новый
ЗаписьТекста("с:\test.txt".КодировкаТекста.ANSI.Символы.ПС);
Файл.Записать("Строка1");
Файл.ЗаписатьСтроку("Строка2");
Файл.Записать("Строка3");
Файл.3акрыть();

В результате работы программы получится следующий текстовый файл:

Строка1Строка2

Строка3

Объект «ЧтениеТекста»

Объект ЧтениеТекста предназначен для последовательного чтения текстовых файлов. Следующий фрагмент прочитает ранее записанный файл:

Файл = Новый
ЧтениеТекста("с:\test.txt",КодировкаТекста.ANSI,Символы.ПС);
Строка1 = Файл.Прочитать(7);
Строка2 = Файл.ПрочитатьСтроку();
Строка3 = Файл.Прочитать();
Файл.Закрыть() ;


XBase (работа с DBF-файлами)

Система 1C:Предприятие 8.0 позволяет создавать, читать и записывать DBF-файлы. Возможности по работе с DBF-файлами мало изменились по сравнению с версией 7.7, но немного изменилась техника работы с полями и индексами: теперь они создаются через соответствующие свойства-коллекции.

Запись DBF-файла

Следующий фрагмент программы создает DBF-файл с тремя полями и выгружает в него справочник Сотрудники:

ФайлВВР = Новый XBase;
ФайлВВР.Поля.Добавить("Name","S",100);
ФайлВВР.Поля.Добавить("Вер","S",5 0) ;
ФайлОВР.Поля.Добавить("Sum","N",10,2);
ФайлВВР.Кодировка = КодировкаХВаве.ОЕМ; //кодировка BOS
ФайлВВР.СоздатьФайл("с:\staff.dbf");
Сотрудники = Справочники.Сотрудники.Выбрать();
Пока Сотрудники.Следующий() Цикл
    ФайлВВР.Добавить();
    ФайлВВР.Name = Сотрудники.Наименование;
    ФайлВВР.Вер = Сотрудники.Подразделение;
    ФайлВВР.Sum = Сотрудники.Оклад;
    ФайлВВР.Записать();
КонецЦикла;
ФайлВВР.ЗакрытьФайл();

Чтение DBF-файла

Чтение DBF-файла производится еще проще:

ФайлВВР = Новый XBase;
ФайлВВР.ОткрытьФайл("с:\staff.dbf",.Истина); //только для чтения
ФайлВВР.Первая();
Пока НЕ ФайлВВР.ВКонце() Цикл
    НовСотр = Справочники.Сотрудники.СоздатьЭлемент();
    НовСотр.Наименование = ФайлВВР.Name;
    НовСотр.Подразделение = ФайлВВР.Вер;
    НовСотр.Оклад = ФайлВВР.Sum;
    НовСотр.Записать() ;
    ФайлВВР.Следующая();
КонецЦикла,
ФайлВВР.ЗакрытьФайл();

Удаленные записи

Файлы DBF устроены таким образом, что удаление записи не приводит к физическому удалению записи из файла. Запись просто помечается на удаление и пропускается при переборе. Таким образом, размер файла остается прежним.

Чтобы физически удалить все помеченные на удаление записи, нужно применить метод Сжать. Средства встроенного языка позволяют работать с записями, помеченными на удаление, перебирать их и даже отменять пометку на удаление.

Индексы

Для упорядочивания содержимого DBF-файла и поиска в нем по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам.

Индексы хранятся в индексном файле, причем один индексный файл может содержать сразу несколько индексов. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы этого файла.


ХМL-документы

Система 1С:Предприятие 8.0 имеет средства для работы с XML-документами. Для их использования на компьютере должен быть установлен «Microsoft XML Core Services 4.0» или выше.

Стоит отметить, что в 1C:Предприятии 8.0 возможна работа с XML-документами большого объема, так как реализуется принцип последовательного чтения и записи XML-документов.

Запись XML

Следующий фрагмент создает простой XML-документ и записывает его в файл. Иерархический отступ конструкций языка показывает вложенность XML-элементов друг в друга:

Файл = Новый ЗаписьХМL;
Файл.ОткрытьФайл(ПутьКФайлу);
Файл.ЗаписатьОбъявлениеХМL();
Файл.ЗаписатьНачалоЭлемента("goods");
Файл.ЗаписатьНачалоЭлемента("good");
Файл.ЗаписатьНачалоЭлемента("name");
Файл.ЗаписатьТекст("Ботинки");
Файл.ЗаписатьКонецЭлемента();
Файл.ЗаписатьНачалоЭлемента("price");
Файл.ЗаписатьТекст(ХМLСтрока(600));
Файл.ЗаписатьКонецЭлемента();
Файл.ЗаписатьКонецЭлемента();
Файл.ЗаписатьНачалоЭлемента("good");
Файл.3 аписатьНачалоЭлемента("name");
Файл.ЗаписатьТекст("Сапоги");
Файл.ЗаписатьКонецЭлемента();
Файл.ЗаписатьНачалоЭлемента("price");
Файл.ЗаписатьТекст(ХМLСтрока(1000)) ;
Файл.ЗаписатьКонецЭлемента();
Файл.ЗаписатьКонецЭлемента();
Файл.ЗаписатьКонецЭлемента() ;

В результате работы программы получился следующий XML-документ:

<?xml version="1.0"?>
    <goods>
        <good>
            <пате>Ботинки</пате>
            <рпсе>600</рпсе>
        </good>
        <good>
            <пате>Сапоги</пате>
            <price>1000</price>
        </good>

    </goods>

Чтение XML

Чтение XML-документов производится через объект ЧтениеХМLс помощью метода Прочитать:

Чт = Новый ЧтениеХМL;
Чт.ОткрытьФайл(ПутьКФайлу);
Пока Чт.Прочитать() Цикл
    Рез = "ТипУзла=" + Чт.ТипУзла;
    Рез = Рез + " Имя='" + Чт.Имя;
    Рез = Рез + "' ЛокальноеИмя='" + Чт.ЛокальноеИмя;
    Рез = Рез + "' Префикс5'" + Чт.Префикс;
    Рез = Рез + "' Значение'" + Чт.Значение;
    Рез = Рез + "' " ;

    Сообщить(Рез) ;
КонецЦикла

Дополнительно система 1С:Предприятие 8.0 поддерживает преобразование с помощью XSL. Язык XSL или extensible Stylesheet Language — это язык описания стилей отображения для XML-документов. Он позволяет описать способ отображения документов для различных носителей, будь то окно веб-обозревателя или устройство печати. Данные в формате XML форматируются с помощью таблицы стилей в формате XSL, в результате создается отображение данных в соответствии с заданными стилями.

Полный список объектов, их свойств и методов для работы с XML-документами приведен в документации.


Интернет-технологии

Интернет-соединение

С помощью объекта ИнтернетСоединение можно устанавливать и разрывать соединение с провайдером через коммутируемые линии (модем). После установления соединения можно отправлять и принимать почту, обращаться к сайтам (веб-серверам) по протоколам HTTP/HTTPS и к FTP-серверам.

Для операций через эти протоколы можно также использовать процедуры и функции глобального контекста для работы с файлами, например, КопироватьФайл.

Поле HTML-документа

Элемент управления ПолеНТМLДокумента позволяет отобразить HTML-страницу. Это могут быть как локальные страницы, так и страницы из Интернета:

У данного элемента управления есть метод Перейти, который позволяет указать адрес страницы (URL) или HTML-макет, хранящийся в конфигурации.

Следующий фрагмент демонстрирует, как можно указать адрес сайта (веб-сервера) для данного элемента управления:

ЭлементыФормы.ПолеНТМLДокумента.Перейти("http://www.lc.ru");

Электронная почта (e-mail)

Для работы с электронной почтой в 1C:Предприятии 8.0 существуют следующие объекты:

  • • Почта,

  • • ПочтовоеСообщение,

  • • ПочтовыйАдрес,

  • • ПочтовоеВложение.

Полный список свойств и методов каждого объекта приведен в документации, а здесь мы покажем общую схему взаимосвязей между этими объектами:

Объект Почта имеет методы Выбрать и Послать. Первый метод возвращает массив объектов ПочтовоеСообщение, а второй метод принимает объект ПочтовоеСообщение в качестве параметра.

В объекте ПочтовоеСообщение поле Отправитель имеет тип ПочтовыйАдрес, а поля Получатели, Копии и СлепыеКопии являются коллекциями объектов ПочтовыйАдрес. Поле Вложения также является коллекцией объектов типа ПочтовоеВложение.

Следующий пример создает электронное письмо, присоединяет к нему два файла и отправляет его сразу двум адресатам:

Письмо = Новый ПочтовоеСообщение;
Письмо.Тема = "Тест";
Письмо.Текст = "Это тестовое письмо!";
Письмо.Получатели.Добавить("myboss@company.ru");
Письмо.Получатели.Добавить("myfriend@company.ru");
Письмо.Вложения.Добавить("с:\test.txt");
Мелодия = Новый ДвоичныеДанные("с:\opera.mp3");
Письмо.Вложения.Добавить(Мелодия,"Опера.mр3");
Почта = Новый Почта;
Почта.Послать(Письмо)

Работа с FTP

Система 1С:Предприятие 8.0 имеет средства для работы с файлами по протоколу FTP. Можно подключаться к FTP-серверам, скачивать и закачивать файлы, переименовывать их, обращаться к их свойствам, создавать каталоги и т.д.

Ниже показан простой пример, в котором устанавливается соединение с FTP-сервером, скачивается один файл, а на его место помещается другой:

FTP = Новый FТРСоединение("ftp://ftp.mysite.ru",21,"login","password");
РТР.УстановитьТекущийКаталог("htdocs");
FTP.Получить("index.htm", "с:\old\index.htm");
FTP.Записать("с:\new\index.htm", "index.htm");


Работа с операционной системой

Система 1С:Предприятие 8.0, как и версия 7.7, позволяет выполнять команды операционной системы через командный интерпретатор и запускать внешние приложения. Для этого предназначены процедуры ЗапуститьПриложение и КомандаСистемы:

ЗапуститьПриложение

Выполняет запуск внешнего приложения либо открытие файла с использованием связанного с ним приложения.

КомандаСистемы

Вызывает на исполнение команду операционной системы, как если бы она была введена в командной строке. После загрузки приложения управление возвращается в 1С:Предприятие 8.0, и исполнение модуля продолжается.


СОМ-соединение

В новой версии 1С:Предприятия введен механизм СОМ-соединения для быстрого и надежного доступа к системе 1C:Предприятие 8.0 из других программ.

Следующий фрагмент на языке VB.Net устанавливает СОМ-соединение с 1С:Предприятием 8.0, создает массив из 6 элементов (индексация начинается с 0), а также получает значение системного перечисления:

//внимание! фрагмент на языке VB.Net
Module Modulel
Sub Main()
    Dim cc As Object 'это будет Corn-connector
    Dim con As Object
    Dim o,o2 As Object
    Dim e As Object
    Dim str As String
    Try
        cc = CreateObject("V8.COMConnector")

        con = cc .Connect ("File=c :/lcv8/mdcom;Usr=r\naBHbiii")

        о = con NewObject("Массив", 5)
        o.Set(0 "Item 0")
        o.Set(1 "Item 1")
        o.Set(2 "Item 2")
        o.Set(3 "Item 3")
        o.Set(4 "Item 4")
        o.Set(5 "Item 5")
        Dim с As Integer = o.Count()
        For Each e In о
            Console.WriteLine(e.ToString())
        Next
        o2 = con.ДопустимаяДлина.Переменная
        str = con.ValueStr(o2)
        Dim s As String = str
    Catch ex As Exception
        Console.WriteLine(ex)
    End Try
    con = Nothing
    cc = Nothing
    System.GC.Collect()
End Sub
End Module

Обратите внимание, что при таком варианте подключения к 1С:Предприятию 8.0 полностью отсутствует пользовательский интерфейс.

Важным моментом является то, что при установлении СОМ-соединения вместо модуля приложения используется модуль внешнего соединения. При этом в вызывающем приложении доступен для использования глобальный контекст 1С:Предприятия 8.0, включая переменные, процедуры и функции, объявленные в модуле внешнего соединения с ключевым словом Экспорт. Некоторые объекты не доступны в режиме внешнего соединения, о чем подробно написано в документации.

Аутентификация пользователя при СОМ-соединении может производиться через параметры строки соединения или средствами Windows. В любом случае у пользователя должно быть право «Внешнее соединение» (см. роли).


Механизм Automation

Механизм Automation реализует обращение к 1C:Предприятию 8.0 из внешних приложений, написанных на других языках, и обратный механизм, т.е. обращение к внешним приложениям из 1С:Предприятия 8.0.

Например, ниже показан фрагмент на языке Visual Basic, осуществляющий запуск клиентской сессии 1С:Предприятия 8.0 через Automation:

Dim v8 As Object
Set v8=CreateObject("V8.Application")
v8.Connect("File=""c:\InfoBases\Trade"";Usr=""Director"";")
v8.Visible = True

Таким же образом один экземпляр 1С:Предприятия 8.0 может обращаться к другому через механизм Automation. Это позволяет организовать обмен данными между информационными базами и реализовать другие решения:

Процедура Загрузить()
V8 = Новый СОМОбъект("V8.Application");
Попытка
    Открыта = V8.Connect("File= + Путь + ';
    Usr= + Пользователь + """; ") ;
Исключение
    Предупреждение ("Ошибка открытия информационной базы");
    Возврат;
КонецПопытки;
Импорт = V8.NewObject("Справочник.Контрагенты");
Импорт.Выбрать();
Пока Импорт.Следующий() Цикл
    Если Не Импорт.ЭтоГруппа Тогда
        Сообщить(Импорт.Наименование);
    КонецЕсли;
КонецЦикла;
КонецПроцедуры


Технология внешних компонент

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

Замечание. Внешние компоненты для версии 8.0 почти полностью совместимы с внешними компонентами для версии 7.7, поэтому никаких изменений в них делать не нужно, кроме компонент, открывающих окна внутри главного окна 1С:Предприятия — такая возможность теперь не поддерживается.

Приведенный ниже пример подключает внешнюю компоненту Math.dll', содержащую различные математические функции, и использует из нее генератор псевдослучайных чисел:

ЗагрузитьВнешнююКомпоненту("Math.dll");
МФ = Новый("Addln.Math");
//Для инициализации датчика случайных чисел используется процедура
MO.SRAND(1000); //параметр может быть от 0 до 32767
Для н = 1 По 10 Цикл
    Сообщить(МФ.RAND()); //случайное число в промежутке от 0 до 32767
КонецЦикла;


Важные отличия от версии 7.7

  • • Функциональность внешней компоненты v7plus.dll включена в стандартную поставку в виде объектов для работы с электронной почтой (e-mail), с файлами по протоколам HTTP, HTTPS, FTP, XML-документами и др.

  • • Введен новый элемент управления «Поле HTML-документа».

  • • В форме могут располагаться элементы управления ActiveX.

  • • Введен механизм СОМ-соединения для быстрого и надежного доступа к системе 1С:Предприятие 8.0 из других программ.

С.А. Митичкин

Разработка в системе 1C: Пред приятие 8.0

Подписано в печать 07.08.2003. Формат 60x90 Vie

Бумага офсетная. Гарнитура «Петербург». Печать офсетная.

Объем 25,81 п.л. Тираж 5 000 экз. Заказ Я-778

Издательство ООО «1С-Паблишинг»

123056 Москва, а/я 64, ул. Селезневская, 21

По вопросам приобретения книги обращайтесь в фирму «1C»,

к 1С:Франчайзи и в книжные магазины.

Фирма «1C»

123056 Москва, а/я 64, Селезневская ул., 21

Тел.: (095) 737-92-57, факс: (095) 281-44-07

e-mail: lc@lc.ru

URL:http://www. lc.ru

По вопросам оптовых закупок учебных и методических пособий

по программным продуктам фирмы «1C» обращайтесь

в ООО «1С-Паблишинг»: 123056 Москва, ул. Селезневская, 21

Тел.: (095) 281-02-21, факс: (095) 281-44-07

e-mail: publishing@lc.ru

Отпечатано с оригиналов фирмы «1С-Паблишинг»

Казанский производственный комбинат программных средств

420 044 Казань, ул. Ямашева, 36