Вы находитесь на странице: 1из 331

Электронная библиотека “Либрус” ( http://librus.

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

Основной целью проекта является ознакомление читателей с многообразием


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

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

Авторам и издательствам
Если Вы заинтересованы в рекламе и продвижении Ваших книг на бескрайних
сетевых просторах мы с удовольствием включим их в наш каталог.
М.Г. Радченко

1С:Предприятие 8.0

Практическое пособие
разработчика
Примеры и типовые приемы

Москва
OOO «1С-Паблишинг»
2004
012.011.56:004.42
9 P15
ОГЛАВЛЕНИЕ
о Максим Григорьевич
Предприятие 8.0. Практическое пособие разработчика.
Введение .............................................................
меры и типовые приемы, M.:, OOO «1С-Паблишинг», 2004. -
с: ил. ISBN 5-9521-0091-0 Как читать книгу ...................................................
Книга представляет собой пособие, позволяющее быстро освоить приемы
аботки и модификации прикладных решений на платформе Часть I. Быстрая разработка прикладных решен
редприятия 8.0.
На примере создания реального прикладного решения показана структура Глава 1. Первое знакомство................................................................
ичных объектов системы, их назначение и методика использования. Что я делаю? ...................................................................................
еденные процедуры на встроенном языке, в том числе с применением языка
Система 1С:Предприятие................................................................
Первое знакомство ..........................................................................
осов, снабжены подробными комментариями. Дерево конфигурации......................................................................
Материал рассчитан как на начинающих разработчиков, не знакомых с Объекты конфигурации...................................................................
емой 1С:Предприятие, так и на тех, кто уже создает или сопровождает Как работать с деревом конфигурации и как создать объект........
ожения на этой платформе. Чтонового мыузнали ......................................................................
Книга может быть использована и как практическое руководство, и как Глава2. Справочник ............................................................................
авочное пособие. Заключительные главы содержат указатель приемов Объектконфигурации Справочник.................................................
аботки, упомянутых в книге, со ссылками на соответствующие разделы. Создание справочникаКлиенты......................................................
ме этого, книга содержит перечень вопросов, которые возникают при Создание справочникаСотрудники ................................................
ении системы 1С:Предприятие 8.0 у разработчиков, имеющих опыт работы с Создание справочникаНоменклатура .............................................
ией 7.7, и ответы на них, ссылающиеся на материал книги. Создание справочника Склады ........................................................
Основная конфигурация и конфигурация базы данных .................
Рассматриваемое в книге прикладное решение учитывает накопленный опыт
Палитра свойств ................................................................................
работки в системе 1С:Предприятие 8.0 и демонстрирует многие новые
можности и механизмы, предоставляемые версией 8.0.7.
Что нового мы узнали .......................................................................
ГлаваЗ. Документ .................................................................................
ОбъектконфигурацииДокумент ......................................................
Оперативное и неоперативное проведение......................................
Право тиражирования и Типообразующиеобъекты ................................................................
распространения книги принадлежит СозданиедокументаПриходнаяНакладная......................................
фирме "1С-Паблишинг". Создание документа ОказаниеУслуги..............................................
Что нового мыузнали ........................................................................
Полное или частичное копирование Глава 4. Регистр накопления .................................................................
материалов книги без письменного Зачем нужен регистр накопления? ....................................................
разрешения фирмы "1С-Паблишинг" Объект конфигурации Регистр накопления......................................
Создание регистра накопления ОстаткиМатериалов .......................
запрещается. Создание движенийдокумента ПриходнаяНакладная.....................
%01546"021298
Создание движений документа ОказаниеУслуги .............................
Что нового мы узнали.........................................................................
© OOO " 1С-Паблишинг", 2004 Глава5. Отчет .........................................................................................
21-0091-0
Объект конфигурации Отчет .............................................................
Создание отчета Материалы ..............................................................
Что нового мы узнали .........................................................................
Главаб. Макет .................................................................................................. 103 Отчет Универсальный2 ........................
Объект конфигурации Макет ...................................................................... 104 216
Использование построителя отчета в конструкторе выходной
Создание макета документа ОказаниеУслуги ............................................ 105
Что нового мы узнали...................................................................................109 формы ...................................................................................................... 225
Глава7. Редактирование макетов и форм .......................................................110 Что нового мы узнали ................................................................................... 230
Редактирование макетадокументаОказаниеУслуги.................................. 110 Глава 6. Оптимизация процедуры проведения документа
Редактирование формы документа ОказаниеУслуги ................................. 114 ОказаниеУслуги ..........................................................................................232
Что нового мы узнали .................................................................................. 116 Особенности использования ссылочных данных ........................................233
Оптимизация документа ОказаниеУслуги...................................................238
Что нового мы узнали....................................................................................251
Часть II. Использование основных объектов Глава 7. План видов характеристик................................................................. 252
конфигурации .......................................................... 117 Постановказадачи ........................................................................................ 253
Глава 1. Периодический регистр сведений..................................................... 118 Объект конфигурац,ии План UIви
_________ дов^upanlb^nL;inK
^UU характеристик....................................................
..................................... ,....... 254
254
Зачем нужен периодический регистр сведений?........................................ 119 Логическая связь объектов ........................................................................... 257
TX^T~VHJt*f*Vnn r>nrr

Объект конфигурации регистр сведений.................................................... 120 Реализациярешения...................................................................................... 259


Создание периодического регистра сведений Цены...................................122 Что нового мыузнали.................................................................................... 289
Создание функцииРозничнаяЦена() ...........................................................124
Автоматическое заполнение цены в документе
ОказаниеУслуги ..................................................................................... 126
Что нового мы узнали .................................................................................. 129 Глава 8. Бухгалтерскийучет.............................................................................290
Глава2. Перечисление ..................................................................................... 130 Объект конфигурации План видов характеристик......................................291
Объект конфигурации Перечисление ..........................................................131 Объектконфигурации План счетов ..............................................................295
Реорганизация справочника Номенклатура ................................................132 Объект конфигурации Регистр бухгалтерии................................................301
Изменение процедуры проведения документа ОказаниеУслуги...............134 Использованиерегистрабухгалтерии ......................................................... 303
Что нового мы узнали .................................................................................. 137 Что нового мы узнали ................................................................................... 316
Глава 3. Проведение документа по нескольким регистрам........................... 138 Глава 9. План видов расчета, регистр расчета................................................. 317
Зачем нужно проведение документа по нескольким Зачем нужен план видов расчета и регистр расчета.................................... 318
регистрам? .............................................................................................. 139 Объект конфигурации План видов расчета ................................................. 322
Создание регистра СтоимостьМатериалов..................................................140 Создание плана видов расчета ОсновныеНачисления ................................325
Изменение процедуры проведения документа Объект конфигурации Регистр расчета........................................................327
ПриходнаяНакладная .............................................................................141 Создание регистра расчета Начисления .......................................................335
Изменение процедуры проведения документа ОказаниеУслуги............... 145 Что нового мы узнали....................................................................................339
Что нового мы узнали .................................................................................. 151 Глава 10. Использование регистра расчета ..................................................... 340
Создание документа НачисленияСотрудникам .......................................... 341
Глава 4. Оборотный регистр накопления ....................................................... 152 Иллюстрация механизмов вытеснения и зависимости от базы.................. 345
Зачем нужно создавать еще один регистр ...................................................153 Создание процедуры расчета записей регистра Начисления ..................... 349
Создание оборотного регистра накопления Продажи ................................154 Создание отчета НачисленияСотрудникам ................................................. 357
Изменение процедуры проведения документа Выполнение перерасчетазаписей регистрарасчета ................................... 359
ОказаниеУслуги ..................................................................................... 157 Графическое представление начислений .....................................................364
Что нового мы узнали .................................................................................. 161 Что нового мыузнали....................................................................................371
Глава 5. Создание отчетов ............................................................................... 162 Глава 11. Подсистема........................................................................................372
Работас запросами....................................................................................... 163 Зачем нужны подсистемы? ...........................................................................373
Отчет РеестрДокументовОказаниеУслуги ..................................................166 Создание подсистем ...................................................................................... 374
Отчет Рейтинг услуг.....................................................................................173 Что нового мыузнали ................................................................................... 377
ОтчетВыручкаМастеров..............................................................................183 Глава 12. Интерфейс, роль, список пользователей ......................................... 378
ОтчетПереченьУслуг................................................................................... 191 Объект конфигурации Роль .......................................................................... 379
ОтчетРейтингКлиентов ............................................................................... 196 Объектконфигурации Интерфейс ................................................................ 384
Универсальныйотчет................................................................................... 208 Администрированиеработыпользователей ................................................389
Что нового мы узнали ................................................
...................... 392
....................... jw
Глава 13. Обменданными.................................................................................393
Общие сведения об обмене данными ...........................................................394
Универсальный механизм обмена данными ............................................... 400

ЧтО Hr>Rnrn мч «™™


Константы ......................................................................................
анизм распределенных информационных баз ..................................... 426 Справочники..................................................................................
нового мы узнали.................................................................................. 443 Документы .....................................................................................
14. Анализ и прогнозирование данных ................................................ 444 Перечисления.................................................................................
щие сведения об анализе и прогнозировании данных ...........................445 Планы видовхарактеристик .........................................................
лизданных ..............................................................................................451 Планы счетов .................................................................................
дель прогноза...........................................................................................470 Планы видов расчета.....................................................................
троитель отчета анализа данных ........................................................... 473 Регистры сведений ........................................................................
нового мы узнали .................................................................................. 476 Регистры накопления ....................................................................
15. Создание документа ввода начальных остатков ............................ 477 Регистры бухгалтерии ...................................................................
16. Легким движением брюки превращаются...................................... 485 Регистрырасчета............................................................................
Планыобмена.................................................................................
III. Специальные приемы разработки .............. 486
Часть V. Приложения...........................................
1. Общие приемы....................................................................................487
ганизацияподборов .................................................................................488 Глава 1. Вопросы при переходе с версии 7.7....................................
од на основании ....................................................................................... 493 Версия 7.7 - версия 8.0 ..................................................................
ъекты, введенные на основании.............................................................. 497 Общие вопросы ...........................................................................
а 2. Формы ................................................................................................ 501 Права ............................................................................................
нные и элементы управления .................................................................. 502 Системные константы, процедуры и функции ..........................
язанныесписки ........................................................................................ 512
менение источника данных табличного поля .........................................516 Глобальный модуль.....................................................................
менение данных табличного поля путем установки типа Контекст формы...........................................................................
значения...................................................................................................520 Справочник...................................................................................
ычисляемые колонки в списках.................................................................524 Перечисление ...............................................................................
формление строк табличного поля ...........................................................527 Документ ......................................................................................
Списокзначений ..........................................................................
IV. Краткий справочникразработчика ..............529 Таблица (табличныйдокумент) ...................................................
тандарты именования переменных, процедур и объектов Запрос............................................................................................
конфигурации......................................................................................... 530 Версия8.0.........................................................................................
емного о конфигурациях........................................................................... 535
бъекты, объекты, объекты .........................................................................537 Общие вопросы ...................................: .......................................
правочники идокументы...........................................................................539 Интерфейсные объекты................................................................
онятиемоментавремени............................................................................540 Прикладныеобъекты....................................................................
онцепция оперативного и неоперативного проведения Глава 2. Приемы разработки, перечисленные в книге ......................
документов.............................................................................................. 541 Встроенный язык .............................................................................
еханизм основныхформ ........................................................................... 542 Глобальный контекст .......................................................................
кно редактирования объекта конфигурации и палитра Общие объекты.................................................................................
свойств .................................................................................................... 544 Универсальные коллекции значений ..............................................
бработчики событий.................................................................................. 546 Интерфейсные объекты....................................................................
обытия, связанные с формой .....................................................................547 Работасзапросами ...........................................................................
пособы работы с коллекцией .....................................................................550 Прикладные объекты .......................................................................
иды объектов встроенного языка, предназначенные для
работы с данными прикладных объектов конфигурации.....................551
пособы доступа к данным.......................................................................... 553
эш объектов ................................................................................................ 554
иртуальныетаблицы запросов .................................................................. 559
Манипулирование данными объектов ........................................................ 561
Введение второстепенного, когда вся информация о новых возможностях
«свалена в одну кучу». Поэтому специальные замечания мы будем
делать в тех местах, где это поможет вам яснее понять преимущества
разработки на новой платформе.
На кого рассчитана эта книга Не исключено, что вы уже начали разрабатывать приложения на
Нужна ли мне эта книга? Такой вопрос возникает у каждого платформе 1С:Предприятие 8.0. И в этом случае книга будет полезна
человека, который в первый раз переворачивает титульный лист в вам, потому что она содержит большое количество практических
надежде найти простой ответ. примеров использования тех или иных объектов. Причем, эта
Возможно, вы никогда ранее не работали с программами информация дается как по ходу изложения, так и в виде списка ссылок
1С:Предприятие и вам интересно узнать, что это такое? Может быть, в конце книги. Такая структура книги позволяет использовать ее и как
вы слышали, что есть такая система и хотите понять, какие справочник - для быстрого поиска нужной информации, и как учебник
возможности она имеет? Насколько она сложна в освоении и - для объяснения механизмов использования и демонстрации
конкретных примеров.
использовании? Какой уровень подготовки требуется, чтобы можно
было самостоятельно создать программу, способную решать реальные На каком примере построена книга
жизненные задачи?
В качестве примера, на котором мы расскажем о методах
Тогда эта книга для вас. В основу всего материала, содержащегося
разработки в 1С:Предприятии 8.0, мы решили взять небольшую фирму
в книге, положен пример из жизни, на котором мы покажем вам все - OOO «На все руки мастер», - которая оказывает услуги по ремонту
основные приемы разработки в среде 1С:Предприятие 8.0. Мы начнем различной бытовой техники. И наша задача будет состоять в том,
наше изложение с простых вещей и постепенно будем рассматривать чтобы к концу книги практически полностью автоматизировать ее
все более сложные. По ходу рассказа мы не будем отвлекаться на работу при помощи 1С:Предприятия 8.0.
огромное множество деталей и подробностей 1С:Предприятия 8.0, Почему был выбран именно такой пример?
которые, возможно, вы никогда не будете использовать. Мы проведем С одной стороны, область оказания услуг хорошо знакома
вас строго тем простым путем, который поможет понять основу и не большинству из нас. Так или иначе, но с разнообразными услугами мы
затеряться в мелочах. К середине изложения вы вдруг обнаружите, что сталкиваемся постоянно. Это и ремонт разнообразной бытовой
можете самостоятельно создавать приложения, а к концу книги вы техники, обслуживание автомобиля, стирка и химчистка,
почувствуете себя настоящим «асом», создавшим реальное жизненное парикмахерские и косметические услуги и многое другое.
прикладное решение. С другой стороны, деятельность ремонтной фирмы хорошо
Может быть, вы уже знакомы с программами 1С:Предприятие? подходит для демонстрации возможностей 1С:Предприятия 8.0. Здесь
Возможно, у вас есть опыт разработки приложений в предыдущей есть разнообразные услуги, оказываемые клиентам, снабжение фирмы
версии 1С:Предприятие 7.7 и вы хотите узнать, какие возможности необходимыми материалами и их расход при оказании услуг. Работа
может предоставить версия 8.0? такого предприятия позволяет рассмотреть учет персонала и расчет
Тогда эта книга тоже для вас. По мере изложения материала мы заработной платы сотрудников. Есть возможность
будем делать специальные замечания для тех, кто ранее работал с проиллюстрировать ведение бухгалтерского учета. Это разнообразие
видов деятельности позволяет довольно широко показать возможности
версией 7.7. Эти замечания вряд ли будут полезны тем, кто совсем не формирования различных отчетов и итоговых данных на основе
знаком с платформой 1С:Предприятие, но для тех, кто собрался или имеющейся информации.
собирается переходить на версию 8.0, они дадут много полезной
информации. Очевидно, что новая версия содержит в себе больше
возможностей, но очень сложно понять и отделить главное от
• Как практическое пособие
Как читать книгу Можно выборочно читать отдельные главы книги, посвященные
различным объектам конфигурации и механизмам платформы. Такой
способ изучения подходит тем, кто уже знаком с основами разработки
на новой платформе.
• Как учебное пособие
Можно последовательно читать книгу, одновременно воспроизводя
излагаемые действия на компьютере. Такой способ позволит вам • Как справочник типовых приемов разработки.
постепенно, от простых вещей к более сложным, изучить структуру Глава «Приемы разработки, перечисленные в книге» содержит
механизмов новой платформы и приемы программирования на список типовых приемов работы с объектами и механизмами
встроенном языке. платформы, проиллюстрированных в книге. Если вас интересует ответ
на конкретный вопрос: как в 8.0 сделать то-то - по ссылке можно
перейти к разделу книги, где рассмотрен аналогичный пример.
• Как «шпаргалку»
Книгу можно использовать для получения кратких простейших
подсказок по использованию конструкций встроенного языка. В части
«Краткий справочник разработчика» в отдельных главах содержатся
схемы связи различных объектов языка, снабженные короткими
осмысленными примерами. Если вы не знакомы со встроенным
языком, достаточно взглянуть на несколько примеров, и вы сможете
написать текст небольшого модуля.

• Как ответы на вопросы


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

• Как справочное пособие


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

12 13
трая разработка прикладных решений
Первое знакомство

Что я делаю? Система 1С:Предприятие

А
что же я делаю?! Такой вопрос периодически возникает у

С
всех, кто сталкивался или просто интересовался истема 1С:Предприятие является универсальной системой
разработками на Ю.Предприятии. автоматизации экономической и организационной
«Пишу программу», - вот наиболее частый ответ. «На чем?» - «на деятельности предприятия. Поскольку такая деятельность
может быть довольно разнообразной, система
1С». «На чем вы работаете?» - «на 1С». «На чем это написано?» - «на
1С:Предприятие имеет возможность «приспосабливаться» к
1С». «Требуется бухгалтер со знанием 1С», «требуется программист
особенностям конкретной области деятельности, в которой она
1С на неполный рабочий день...» и т.д.
используется. Для обозначения такой способности используется
Такие фразы можно встретить постоянно, и вам они наверняка термин конфигурируемость, то есть возможность настройки системы
хорошо знакомы. Для человека непосвященного в них нет ничего на особенности конкретного предприятия и класса решаемых задач.
особенного, однако тех, кто имеет представление о разработке на Это достигается тем, что 1С:Предприятие - это не просто
Ю.Предприятии, такие вопросы зачастую могут поставить в тупик, программа, существующая в виде набора неизменяемых файлов, а
потому что в этих фразах термином «1С» обозначаются совершенно совокупность различных программных инструментов, с которыми
разные предметы, а термин «программа» и вовсе сбивает с толку... работают разработчики и пользователи. Логически всю систему можно
Для успешного освоения этой книги важно понимать основы разделить на две большие части, которые тесно взаимодействуют друг
построения системы 1С:Предприятие, и тогда на вопрос: «а чем вы с другом: конфигурацию и платформу, которая управляет работой
занимаетесь?», вы уже не ответите уныло: «учусь писать программы конфигурации.
на 1С», а с легким чувством превосходства сможете произнести: «я Для того чтобы легче понять взаимодействие этих частей системы,
изучаю методы разработки прикладных решений на основе платформы сравним ее с проигрывателем компакт-дисков. Как вы хорошо знаете,
1С:Предприятия 8.0»! проигрыватель служит для того чтобы слушать музыку. «На вкус и
Чтобы было понятно, что именно мы будем создавать с вами на цвет товарищей нет», поэтому существует множество разнообразных
протяжении этой книги, объясним сначала, что представляет собой компакт-дисков, на которых записаны музыкальные произведения на
система 1С:Предприятие вообще. любой вкус. И для того, чтобы прослушать какую либо композицию,
нужно вставить компакт-диск в проигрыватель, и проигрыватель
воспроизведет записанное на нем музыкальное произведение. Более
того, современный проигрыватель компакт-дисков даже позволит вам
записать собственную подборку музыкальных произведений, т.е.
создать новый компакт-диск.
Сам по себе проигрыватель совершенно бесполезен без компакт-
диска, точно так же, как компакт-диск не может сам по себе принести
нам никакой пользы (кроме как стать подставкой под чашку кофе ©),
если у нас нет проигрывателя.
Возвращаясь к системе 1С:Предприятие, можно сказать, что
платформа является своеобразным «проигрывателем», а конфигурация
- «компакт-диском». Платформа обеспечивает работу конфигурации и
позволяет вносить в нее изменения или создавать собственную
конфигурацию.

15
трая разработка прикладных решений Первое знакомство

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

17
ютрая разработка прикладных решений Первое знакомство

Также у вас не должно возникнуть трудностей при запуске системы


использование типовой конфигурации представляется и создании пустой информационной базы.
нецелесообразным.
Будьте внимательны! Для выполнения примера, содержащегося в
Обратите внимание, как мы в одном абзаце перешли от книге, нам потребуется информационная база с ПУСТОЙ
«прикладного решения» к «конфигурации». Ничего не поделаешь - конфигурацией, а не база, созданная из шаблона:
для пользователя понятнее так, а для разработчика - по-другому.
Таким образом, если вернуться к сравнению с проигрывателем
компакт-дисков, мы можем изменять по своему вкусу мелодии, Создадим информационную базу с пустой
которые были ранее записаны на компакт-диске, и даже создавать конфигурацией
диски со своими собственными музыкальными произведениями,
причем нам не потребуются какие-либо музыкальные инструменты,
все необходимое для создания мелодий есть в нашем проигрывателе
компакт-дисков.
Для того чтобы обеспечить такие возможности, система
1С:Предприятие имеет различные режимы работы: 1С:Предприятие и
Конфигуратор.
Режим 1С:Предприятие является основным и служит для работы
пользователей системы. В этом режиме пользователи вносят данные,
обрабатывают их и получают выходные результаты.
Режим конфигуратора используется разработчиками и
администраторами баз данных. Именно этот режим и предоставляет
инструменты, необходимые для модификации существующей или
создания новой конфигурации.
Поскольку задача нашей книги состоит в том, чтобы научить вас $СДля тех, ктоработал с версией 7.7
создавать собственные конфигурации и изменять существующие, При запуске 1С:Предприятия 8.0 вы неувидите привычного выбора
дальнейшее повествование будет, в основном, посвящено работе с 1С:Предприятие - Конфигуратор - Отладчик - Монитор. Отладчик
системой в режиме конфигуратора. И лишь иногда, чтобы проверить и монитор пользователей теперь включены в состав конфигуратора.
результаты нашей работы, мы будем запускать систему в режиме
1С:Предприятие. Изучение этой книги предполагает, что у вас уже
установлена на компьютере система 1С:Предприятие 8.0. Если это не
так, то сейчас самое время это сделать, так как дальнейшее изложение
будет непосредственно описывать последовательность работы с
программой.
При установке системы 1С:Предприятие у вас не должно
возникнуть никаких трудностей. Процесс установки подробно описан
в брошюре «Руководство по установке и запуску», входящей в
комплектдокументации системы 1С:Предприятие 8.0.

19
18
лстрая разработка прикладных решений Первое знакомство

м
Первое знакомство Дерево конфигурации

И так, запустим 1С:Предприятие в режиме конфигуратора.


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

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


если мы пока еще ничего не создавали? Дело в том, что для облегчения
работы разработчика «все, из чего состоит конфигурация» собрано в
несколько отдельных групп, и сейчас дерево и показывает вам эти
группы.
Если вы походите по дереву и понажимаете на ©, то увидите, что
ни в одной группе ничего нет. Исключение составит лишь группа
Общие | Языки, в которой вы обнаружите «нечто» под названием
«Русский». Этот «русский» платформа создала для вас сама, поскольку
в данном случае конфигуратор использует русскоязычный интерфейс.
Хотелось бы уже начать что-нибудь делать, но прежде следует
определиться с терминами. Вы наверняка уже заметили, что, говоря о
содержимом конфигурации, мы сознательно избегали использования
каких либо терминов. Но теперь настало время, когда можно
определиться с терминологией и рассказать про...

20 21
гетрая разработка прикладных решений
Первое знакомство

Объекты конфигурации To же и с объектами конфигурации. Мы можем создавать только

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

12
острая разработка прикладных решений Первое знакомство

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

П
сотрудников, справочник номенклатуры или товаров. В конфигурации режде чем мы приступим к созданию первых объектов
тоже есть специальные объекты вида «Справочник», которые конфигурации, следует объяснить некоторые приемы работы с
позволяют разработчику создавать компьютерные аналоги таких конфигуратором.
списков. Для того чтобы открыть и закрыть конфигурацию следует
использовать пункты меню:
тех, кто работал с версией 7.7 Конфигурация | Открыть конфигурацию, и
В версии 8.0 объектная модель платформы былаунифщирована и Конфигурация | Закрыть конфигурацию.
расширена. Теперь, например, элемент справочника может иметь
табличную часть. Поскольку объекты унифицированы, табличная После того, как конфигурация открыта, ее состав появляется в окне
часть справочника и табличная часть документа описывается дерева конфигурации. Это окно вы можете закрыть, как любое другое
аналогичными объектами конфигурации. Соответственно работа с окно Windows, при этом конфигурация останется открытой (т.е.
табличной частью документа аналогична работе с табличной доступной для редактирования). Чтобы снова отобразить на экране
частью справочника. окно дерева конфигурации следует воспользоваться командой меню
Конфигурация | Окно конфигурации.
Как мы уже говорили, на основе объектов конфигурации Создать новый объект конфигурации можно несколькими
платформа создает в базе данных информационные структуры, в способами, и вы всегда можете использовать тот способ, который вам
которых будут храниться данные. В литературе, как правило, объект понятнее и удобнее.
конфигурации и соответствующую ему информационную структуру Первый способ. Необходимо установить курсор на тот вид объектов
принято называть одинаково. Например, если в конфигурации конфигурации, который вас интересует, и в командной панели окна
существует объект справочник «Сотрудники», то информационную конфигурации нажать кнопку Действия | Добавить.
структуру, созданную платформой на основе этого объекта
конфигурации, также называют справочником «Сотрудники».
Мы отойдем от такого «размытого» стиля изложения и в тех
местах, где речь будет идти о конфигурации, мы будем использовать
явное уточнение - объект конфигурации Справочник «Сотрудники».
Там же, где речь пойдет о базе данных, мы будем говорить просто:
справочник «Сотрудники».

25
страя разработка прикладных решений
Первое знакомство

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


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

что такое конфигурируемость системы 1С:Предприятие


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

27
Справочник

Глава 2. Справочник Объект конфигурации Справочник

О
бъект конфигурации Справочник является прикладным
В этой главе мы познакомимся с объектом конфигурации
объектом и предназначен для описания списков данных.
Справочник. Вы узнаете, для чего используется этот объект, какова его
Объект конфигурации Справочник используется для того,
структура и какими основными свойствами он обладает. На
чтобы на его основе платформа создала в базе данных
практических примерах вы научитесь создавать справочники, информационную структуру, в которой будет храниться, например,
описывать наиболее важные элементы их структуры и заполнять их список сотрудников, перечень товаров, список клиентов или
данными. поставщиков.
Кроме этого вы узнаете еще об одном объекте конфигурации - Характерной особенностью объекта конфигурации Справочник
Форма. является то, что пользователь в процессе работы может
В заключение, в конце главы, будет сделано небольшое самостоятельно добавлять новые элементы в справочник. Например,
отступление, касающееся механизма внесения изменений в пользователь может добавить в справочник новых сотрудников,
конфигурацию и использования одного из инструментов разработчика создать новый товар или внести нового клиента.
- палитры свойств.
Для тех,ктоработал с версией 7.7
Элементы справочника могут иметь теперь несколько табличных
частей и несколько форм (форма элемента, списка, выбора и т.д.).
Глубина иерархии справочников может быть произвольной.
Иерархия может строиться не только no принципу иерархии групп,
но и no принципу иерархии элементов (когда элемент справочника
подчинен непосредственно другому элементу).
Теперь нет понятия периодических реквизитов справочников. Для
хранения каких-либо данных (в том числе значений реквизитов
справочников),развернутых во времени, теперь следует использовать
новые объекты конфигурации - регистры сведений, поддерживающие
периодическое сохранение значений своих ресурсов.
В конфигураторе можно задать набор предопределенных
элементов справочника.

Каждый элемент справочника, как правило, содержит некоторую


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

29
Справочник
рая разработка прикладных решений

Порой встречаются ситуации, когда необходимо, чтобы в


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

31
рая разработка прикладных решений
Справочник

может существовать и самостоятельно. На основании описания,


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

Т
программный объект Форма, с которым и будет работать еперь, когда мы немного познакомились с возможностями
пользователь. объекта конфигурации Справочник, создадим несколько таких
объектов, чтобы описать справочники, которые будут
использоваться в нашей базе данных.
Узнай больше!
О структуре объектов встроенного языка, предназначенных для Так как наше OOO «На все руки мастер» оказывает услуги по
ремонту бытовой техники, очевидно, что для ведения учета нам
работы со справочниками можно прочитать в главе «Справочники»
потребуется задать некоторую списочную информацию.
на странице 570.
Для начала нам понадобится список сотрудников предприятия,
которые будут оказывать услуги. Затем нам будет нужен список
клиентов, с которыми работает наше 000. После этого нам
понадобится перечень услуг, которые может оказывать наше
предприятие, и список материалов, которые могут быть
израсходованы. Кроме этого нам потребуется список складов, на
которых могут находиться материалы 000 «На все руки мастер».
Начнем с простых вещей - списка сотрудников и списка клиентов.
Откроем в конфигураторе нашу учебную конфигурацию и создадим
новый объект конфигурации Справочник.
Наша задача будет состоять в том, чтобы создать справочник, в
котором будут храниться наименования наших клиентов.
После того, как вы нажмете «Добавить», система откроет окно
редактирования объекта конфигурации.
Это средство, которое создано в помощь разработчику. Оно
создано специально для сложных объектов конфигурации и позволяет
путем выполнения последовательных действий быстро создавать такие
объекты. Для того чтобы придерживаться правильной
последовательности действий, в нижней части окна имеются кнопки
«Далее» и «Назад». Кнопка «Далее» позволяет задавать свойства
объекта в нужной последовательности (чтобы ничего не пропустить и
не проскочить вперед, где потребуются данные, которые должны были
быть введены ранее). Кнопка «Назад» позволяет вернуться на
несколько шагов назад, если вы обнаружили, что ранее ввели не все
или ошибочные данные.

33
трая разработка прикладных решений
Справочник

Поэтому на синоним практически нет никаких ограничений, и его


*" Узнай больше! можно задавать в привычном для человека виде.
Про особенности использования окна редактирования объекта
конфигурации и палитры свойств можно прочитать в главе «Окно
редактирования объекта конфигурации и палитра свойств» на Зададим имя и синоним справочника
странице 544.

Зададим имя справочника - «Клиенты». Имя является основным


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

«" Узнай больше!


О правилах именования объектов конфигурации можно прочитать
в главе «Стандарты именования переменных, процедур и объектов
конфигурации» на странице 530. Все подряд свойства объекта конфигурации Справочник мы пока
настраивать не будем, нас вполне удовлетворят те значения, которые
На основании имени платформа автоматически создаст синоним - система предлагает для них по умолчанию. Поэтому три раза нажмем
«Клиенты». Свойство «Синоним» также есть у любого объекта «Далее» и окажемся на закладке «Данные».
конфигурации. Оно предназначено для хранения «альтернативного» Здесь для нас представляют интерес длина кода и длина
наименования объекта конфигурации, которое будет использовано в наименования. Длина кода - важное свойство справочника. Как
элементах интерфейса нашей программы - то есть будет показано правило, код справочника используется для идентификации элементов
пользователю. справочника и содержит уникальные для каждого элемента
справочника значения. Платформа может сама контролировать
уникальность кодов и поддерживать автоматическую нумерацию
элементов справочника.
Уникальность кодов платформа может отслеживать сама, поэтому
от длины кода будет зависеть количество элементов, которые могут
содержаться в справочнике. Длина кода 5 символов - это от 0 до
99999, то есть сто тысяч элементов. Для нашего небольшого OOO «На
все руки мастер» этого вполне достаточно.

35
трая разработка прикладных решений Справочник

Перейдем к длине наименования. 25 символов для нас явно мало, Для большего порядка предлагается пользоваться вариантами: 25
увеличим длину наименования до 50. символов для «небольших» справочников. 50 символов для тех
справочников, которым 25 символов мало. 100 символов для тех
справочников, которым 50 символовмало.
Согласимся с длиной кода и зададим
длину наименования
Теперь давайте посмотрим, что создаст система на основе того
объекта конфигурации Справочник, который мы добавили. Выполним
пункт меню Отладка | Начать отладку. На появившийся вопрос:

ответим «Да» и в следующем окне нажмем «Принять»:

Все остальные свойства объекта конфигурации Справочник мы


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

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

37
фая разработка прикладных решений Справочник

Выполним пункт меню Операции | Справочники... и выберем Пока наш справочник «Клиенты» пуст, поэтому добавим в него
справочник «Клиенты». несколько элементов (добавить новый элемент в справочник можно
при помощи пункта меню Действия I Добавить, соответствующей
иконки или клавишей «Insert»).
Выполним Операции I Справочники... и
выберем справочник «Клиенты»
Добавим новые элементы в справочник
при помощи меню или иконки

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


следующим образом."

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

39
грая разработка прикладных решений Справочник

Создадим реквизиты табличной части «ТрудоваяДеятельность»:


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

С
правочник «Сотрудники» будет устроен несколько сложнее, чем • «Организация» - тип Строка, длина 100,
справочник «Клиенты». Дело в том, что в нем мы будем хранить • «НачалоРаботы» - тип Дата, состав даты - «Дата»,
не только фамилию, имя и отчество сотрудника, но и • «ОкончаниеРаботы» - тип Дата состав даты - «Дата»,
информацию о его прошлой трудовой деятельности. Эта • «Должность» - тип Строка, длина 100:
информация однородна по своей структуре (организация, начало,
окончание работы, занимаемая должность), но количество
предыдущих мест работы у разных сотрудников может быть Создадим реквизиты табличной части справочника...
различным. Поэтому для хранения такой информации мы будем
использовать табличную часть справочника.
Вернемся в конфигуратор и создадим новый объект конфигурации
Справочник. Назовем его «Сотрудники».
Наша задача будет состоять в том, чтобы создать справочник,
имеющий табличную часть.
На закладке «Данные» зададим длину наименования справочника
равной 50 символам и добавим в справочник новую табличную часть с
именем «ТрудоваяДеятельность»:
Добавим в справочник «Сотрудники» новую табличную часть и зададим ее имя...

Для реквизитов «НачалоРаботы» и «ОкончаниеРаботы» мы


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

" Узнай больше!


Согласно стандартам фирмы «1С» рекомендуется использовать
следующие значения для реквизитов объектов конфигурации:
Числовой тип:
Реквизиты «флаг» - тип данных Булево. Реквизиты
«сумма» - длина 15, точность 2. Реквизиты
«количество» - длина 15, точность 3. Реквизиты
«коэффициент» - длина 10, точность 3.

41
трая разработка прикладных решений Справочник

Реквизиты «курс» - длина 10, точность 4. Создание справочника «Сотрудники» завершено - теперь можно
Реквизиты «процент» -длина 5, точность 2. запустить 1С:Предприятие в режиме отладки и заполнить справочник.
Выполните пункт меню Отладка | Продолжить отладку, на
Строковый тип: вопрос системы:
Допустимая длина должна быть в большинстве случаев
переменной.
Неограниченная длина должна назначаться, если реквизит часто
может быть не заполнен, или количество символов больше 100 (т. к.
строки неограниченной длины хранятся порциями, а пустые строки
совсем не занимают места).

Теперь нам следует выбрать вариант редактирования справочника.


ответьте «Да», на последующие вопросы ответьте так же, как и
Очевидно, что редактирование в списке нам уже не подойдет, ранее.
поскольку в списке мы не сможем редактировать табличную часть
справочника и вводить информацию о трудовой деятельности. В появившемся окне программы откройте справочник
Поэтому в справочнике «Сотрудники» мы выберем вариант «Сотрудники» и убедитесь, что установлен режим редактирования
справочника в диалоге (меню Действия | Редактировать в диалоге
редактирования справочника обоими способами - как в списке, так и в
или аналогичная иконка в командной панели).
диалоге. Для этого перейдем на закладку «Формы» и установим
соответствующий переключатель: Создайте сотрудников Гусакова Николая Дмитриевича, Делового
Ивана Сергеевича и Симонова Валерия Михайловича, как показано на
рисунках. Обратите внимание, что строки табличной части
Зададим вариант редактирования справочника . справочника можно сортировать по содержимому любой из колонок,
или располагать в произвольном порядке, используя иконки
командной панели:

43
фая разработка прикладных решений Справочник

Создание справочника Номенклатура

С
правочник «Номенклатура» будет содержать информацию об
Можно управлять порядком расположения строк услугах, которые оказывает OOO «На все руки мастер», и о тех
табличной части... материалах, которые при этом могут быть использованы.
Этот справочник не будет сложным, единственная
особенность, которой он будет обладать - это наличие иерархической
структуры. Для того чтобы справочником было удобно пользоваться,
мы сгруппируем услуги в одну группу, а материалы - в другую.
Кроме этого, поскольку OOO «На все руки мастер» оказывает самые
разные услуги, они также будут логически собраны в несколько групп.
To же самое можно сказать и про материалы.
Наша задача будет состоять в создании иерархического
справочника. Создадим новый объект конфигурации Справочник и
назовем его «Номенклатура». Перейдем на закладку «Иерархия» и
установим флаг «Иерархический справочник».

Сделаем справочник иерархическим...

Теперь мы можем приступить к созданию следующего справочника


хНоменклатура».

На закладке «Данные» зададим длину наименования справочника


равной 100 символам.

45
:трая разработка прикладных решений Справочник

Теперь запустим 1С:Предприятие в режиме отладки и заполним • «Ремонт импортного телевизора»


справочник «Номенклатура». В процессе заполнения справочника мы
покажем, как создавать группы справочника и переносить элементы из и услуги по установке стиральных машин:
одной группы в другую. • «Подключение воды»,
Создадим две группы в корне справочника: «Материалы» и • «Подключение электричества»:
«Услуги» (меню Действия | Новая группа):

В группе «Материалы» создадим пять элементов:

• «Строчный трансформатор Samsung», Теперь разнесем услуги по двум смысловым группам: услуги по
• «Строчный трансформатор GoldStar», ремонту телевизоров и услуги по установке стиральных машин. Для
• «Транзистор Philips 2N2369», этого в группе «Услуги» создадим еще две группы: «Телевизоры» и
• «Шланг резиновый», «Стиральные машины»:
• «Кабель электрический»:

В группе «Услуги» тоже создадим несколько элементов - услуги по


ремонту телевизоров:

• «Диагностика»,
• «Ремонт отечественного телевизора»,

47
:трая разработка прикладных решений
Справочник

Для того чтобы переместить услуги в соответствующие группы, в


окне списка установим курсор на ту услугу, которую мы хотим Создание справочника Склады

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

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


Аналогичным образом переместите в группу «Телевизоры» услуги еще и имя предопределенного элемента справочника. В дальнейшем,
«Ремонт отечественного телевизора» и «Ремонт импортного когда мы будем использовать средства встроенного языка, мы сможем
телевизора». Услуги «Подключение воды» и «Подключение обратиться к этому элементу справочника, используя имя, которое
электричества» переместите в группу «Стиральные машины». присвоили ему в конфигураторе.
Затем в группе материалы создайте две группы: «Радиодетали» и
«Прочее». В группу «Прочее» поместите «Кабель электрический» и
«Шланг резиновый». Остальные материалы переместите в группу
«Радиодетали».

49
трая разработка прикладных решений Справочник

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

Таким образом, теперь мы можем обозначить две характерные


особенности предопределенных элементов:

• на предопределенные элементы могут опираться алгоритмы


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

51
:трая разработка прикладных решений Справочник

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


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

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

Когда разработчик работает с основной конфигурацией, система


&~ Узнай больше! всегда подсказывает ему, отличается ли его вариант основной
О том, сколько и каких конфигураций существует в конфигурации от того, который сохранен, и отличается ли
информационной базе можно прочитать в главе «Немного о сохраненный вариант основной конфигурации от конфигурации базы
конфигурациях» на странице 535. данных.
Если разработчик редактирует основную конфигурацию и
Основную конфигурацию можно редактировать, конфигурацию
редактируемый вариант основной конфигурации отличается от того,
базы данных редактировать нельзя, можно только произвести который сохранен, в заголовке окна дерева конфигурации появляется
обновление конфигурации базы данных на основе основной признак модифицированности конфигурации (*):
конфигурации.
Такое внутреннее устройство позволяет вносить изменения в
конфигурацию, не прерывая работы пользователей (поскольку
изменения вносятся в основную конфигурацию). Затем, когда
разработчик будет уверен в том, что все изменения, которые он внес,
верны, можно будет быстро произвести обновление конфигурации

53
[страя разработка прикладных решений
Справочник

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

Для сохранения основной конфигурации следует воспользоваться


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

55
[страя разработка прикладных решений Справочник

В этом состоянии, при наведении курсора мыши на любое другое


Палитра свойств окно, палитра свойств будет сворачиваться на дополнительную панель

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

«Открепим» палитру свойств.


[страя разработка прикладных решений
Справочник

Q как запустить 1С:Предприятие в режиме отладки


Что нового мы узнали Q зачем нужна основная конфигурация и конфигурация
базы данных
П как изменить конфигурацию базы данных ] как связаны
- для чего предназначен объект конфигурации Справочник
объекты конфигурации и объекты базы
- каковы характерные особенности справочника
данных
- для чего используются реквизиты и табличные части
справочника - зачем нужны иерархические Q зачем нужна палитра свойств П что такое

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

родитель - зачем нужны подчиненные справочники и


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

Глава 3. Документ Объект конфигурации Документ

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

КДля тех, кто работал с версией 7.7


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

61
60
Быстрая разработка прикладных решений Документ

У последовательностей могут быть измерения, за счет чего при Для «визуализации>: документа существует несколько основных
восстановлении последовательностей будут перепроводиться только форм:
me документы, которые изменили состояние регистров no данному
значению измерения. Конфигуратор База данных
Объект конфигурации Документ Документ
Основная форма Форма документа
Основная форма списка Форма списка документов одного вида
Основная форма для выбора Форма для выбора из списка документов одного
Узнай больше! вида
0 том, какая существует разница в названии справочников и
документов можно прочитать в главе «Справочники и документы»
на странице 539. Узнай больше!
О структуре объектов встроенного языка, предназначенных для
Каждый документ, как правило, содержит информацию, которая работы с документами можно прочитать в главе «Документы» на
более подробно описывает этот документ. Например, каждый странице 577.
документ «ПриходнаяНакладная» может содержать информацию о
поставщике товаров, складе, на который приходуется товар и т.д.
Набор такой информации является одинаковым для всех документов
одного, вида и для описания такого набора используются реквизиты
объекта конфигурации Документ, являющиеся подчиненными
объектами конфигурации. Большинство реквизитов объекта
конфигурации Документ разработчик создает самостоятельно, однако
у каждого объекта конфигурации Документ существуют два поля «по
умолчанию»: дата и номер документа. Поскольку тип данных дата
содержит дату и время с точностью до секунды, то этот реквизит и
определяет, в основном, положение документа на оси времени.

Узнай больше!
О том, что такое МоментВремени можно прочитать в главе
«Понятие момента времени» на странице 540.

Кроме этого, каждый документ содержит, как правило, некоторый


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

63
Быстрая разработка прикладных решений Документ

предложено провести документ неоперативно (т.е. с сохранением


Оперативное и неоперативное проведение существующей даты и времени документа).

Ф акт проведения документа и необходимость поддержания


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

65
Быстрая разработка прикладных решений Документ

Типообразующие объекты Создание документа ПриходнаяНакладная

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

66 67
Быстрая разработка прикладных решений
Документ

После этого добавим табличную часть с именем «Материалы» и Пока в нашей базе данных нет ни одного документа «Приходная
создадим у нее четыре реквизита: накладная», поэтому создадим новый документ (создать новый
документ можно при помощи пункта меню Действия | Добавить,
• «Материал» с типом СправочникСсылка.Номенклатура,
соответствующей иконки или клавишей «Insert»).
• «Количество» с типом Число, длиной 15, точностью 3,
неотрицательное,
• «Цена» с типом Число, длиной 15, точностью 2, Добавим новый документ при помощи
неотрицательное, меню или иконки
• «Сумма» с типом Число, длиной 15, точностью 2,
неотрицательное.

Создадим табличную часть и опишем ее реквизиты.

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


останется только заполнить табличную часть. Заполним ее
материалами для ремонта телевизоров так, как показано на рисунке:

Запустим 1С: Предприятие в режиме отладки и протестируем


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

68
69
Быстрая разработка прикладных решений Документ

Аналогичным образом мы создадим второй документ, который <*^ Узнай больше!


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

Вернемся в конфигуратор и откроем окно редактирования объекта


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

Создадим форму документа...

Наверняка вы обратили внимание на то, что при заполнении


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

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

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


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

70 71
Быстрая разработка прикладных решений
Документ

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

Новая форма документа и окно редактора форм

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

72
73
Быстрая разработка прикладных решений Документ

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

Модуль - это «хранилище» для текста программы на встроенном


языке. В конфигурации существует большое количество модулей,
которые расположены в различных ее точках. Они могут
принадлежать некоторым объектам конфигурации (например,
формам), а могут существовать сами по себе (принадлежать всей
конфигурации в целом). Текст программы, содержащийся в модулях,
будет использоваться платформой в заранее известные моменты
работы системы 1С:Предприятие.
Мы хотим, чтобы каждый раз, когда меняется значение в поле
«Количество» или в поле «Цена», в поле «Сумма» автоматически
устанавливалось значение равное Количество*Цена. Очевидно, что
для этого нужно написать на встроенном языке команду похожую на
Сумма = Количество*Цена, которая будет выполняться при изменении
значения поля «Количество» или «Цена». Но как «поймать» эти
моменты изменения?

Создание процедуры обработки события в модуле


формы

Щ елкните правой кнопкой мыши на поле ввода в колонке


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

<*" Узнай больше!


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

В модуль формы добавим следующий текст: некотором «общедоступном» месте, чтобы разные документы,
имеющие аналогичные реквизиты табличной части, могли
ПроцедураМатериалыКоличествоПриИзменении(Элемент) использовать этот алгоритм.
СтрокаТабличнойЧасти = ЭлементыФормы.Материалы Для описания таких «общедоступных» мест служат объекты
.ТекущиеДанные; СтрокаТабличнойЧасти.Сумма =
конфигурации Общий модуль, расположенные в ветке
СтрокаТабличнойЧасти.Количество
* СтрокаТабличнойЧасти.Цена; Общие | Общие модули. Процедуры и функции, содержащиеся в
КонецПроцедуры _____________________________________________ этих модулях, могут быть доступны для любых объектов
конфигурации.
Объясним назначение этих строк.
В первой строке мы обращаемся к программному объекту
Создание процедуры обработки события в общем
ЭлементыФормы. Этот объект является коллекцией значений, модуле

Д
содержащей все элементы управления, расположенные на нашей ля того чтобы алгоритм, выполняемый при обработке события,
форме. Каждый элемент управления формы можно получить, указав был доступен для разных документов, мы создадим общий
его имя в качестве свойства объекта ЭлементыФормы. В данном модуль и перенесем в него нашу процедуру расчета суммы. А в
случае мы обращаемся к элементу управления с именем «Материалы» документе просто оставим вызовы этой процедуры из общего
(ЭлементыФормы.Материалы). модуля.
Этот элемент управления отображает строки табличной части Создадим объект конфигурации Общий модуль в ветке
нашего документа. Получить ту строку, в которой в настоящее время Общие | Общие модули и назовем его «РаботаСДокументами». Он
осуществляется редактирование, можно при помощи свойства будет содержать следующий текст:
программного объекта ТабличноеПоле - ТекущиеДанные. Таким
образом, в результате выполнения первой строки переменная Процедура РассчитатьСумлц^СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти будет содержать объект СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество
* СтрокаТабличнойЧасти.Цена;
ДокументТабличнаяЧастьСтрока.ПриходнаяНакладная.Матери КонецПроцедуры
алы, в котором находятся редактируемые данные.
Во второй строке вычисляется сумма как произведение количества Ключевое слово Экспорт в конце оператора «Процедура» как раз
и цены. Объект ДокументТабличнаяЧастьСтрока.<имя> позволяет указывает на то, что эта процедура может быть доступна из других
обратиться к данным конкретной колонки, указав имя колонки в программных модулей.
качестве свойства объекта (например, Затем в модуле нашей формы изменим текст нашего обработчика:
СтрокаТабличнойЧасти.Количество).
Теперь посмотрим, как это работает. В окне программы откроем Процедура МатериалыКоличествоПриИзменении(Элемент)
список документов «ПриходнаяНакладная» и откроем любой из двух СтрокаТабличнойЧасти = ЭлементыФормы.Материалы
.ТекущиеДанные;
созданных нами документов. Если теперь вы поменяете количество в РассчитатьСумму(СтрокаТабличнойЧасти);
любой строке документа, то сумма в строке будет пересчитана КонецПроцедуры
автоматически.
Замечательно. Но теперь хотелось бы и для поля «Цена» сделать то Таким образом, теперь вместо непосредственного расчета суммы
же самое. А если заглянуть вперед, то мы увидим, что подобное мы будем вызывать процедуру из общего модуля, и передавать ей в
автоматическое заполнение поля «Сумма» может нам понадобиться и качестве параметра нужную нам строку табличной части.
в других документах. Поэтому лучше будет поместить расчет суммы в

77
Быстрая разработка прикладных решений Документ

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

т
Теперь осталось и для поля «Цена» установить такой же
Создание документа ОказаниеУслуги
обработчик. Так как однажды мы уже написали в модуле формы еперь мы аналогичным образом создадим второй документ,
нужную нам процедуру, то мы просто могли бы сопоставить ее также необходимый нам - «ОказаниеУслуги». Для этого потребуется
и другому событию другого элемента управления, расположенного в выполнить следующие действия:
форме. Однако стандарты разработки конфигураций фирмы «1С» не
допускают такого решения.
создать новый объект конфигурации Документ
«ОказаниеУслуги» с реквизитами:
«" Узнай больше!
Согласно стандартам разработки фирмы «1С», у каждого
события должен быть свой обработчик. Если одинаковые действия • «Склад», тип СправочникСсылка.Склады,
должны выполняться при изменении разных элементов управления • «Клиент», тип СправочникСсылка.Клиенты,
(например, при нажатии нескольких кнопок), то в этом случае • «Мастер», тип СправочникСсылка.Сотрудники,
следует поступать следующим образом:
- создается отдельная процедура (функция), выполняющая создать табличную часть этого документа
«ПереченьНоменклатуры» с реквизитами:
необходимые действия;
- для каждого элемента управления создается отдельный
• «Номенклатура», тип
обработчик с именем, назначаемым no умолчанию;
СправочникСсылка.Номенклатура,
- из каждого обработчика вызывается требуемая процедура • «Количество», тип Число, длина 15, точность 3,
(функция). неотрицательное,
• «Цена», тип Число, длина 15, точность 2,
Поэтому мы создадим обработчик события «При изменении» для неотрицательное,
поля ввода, которое расположено в колонке «Цена» и повторим в нем
• «Сумма», тип Число, длина 15, точность 2,
вызов процедуры «РассчитатьСумму» из общего модуля: неотрицательное,

ПроцедураМатериалыЦенаПриИзменении(Элемент)
• создать основную форму документа,
СтрокаТабличнойЧасти = ЭлементыФормы.Материалы
.ТекущиеДанные; • для полей ввода колонок «Количество» и «Цена» создать
РассчитатьСумму(СтрокаТабличнойЧасти); обработчик события «ПриИзменении», в котором вызывать
КоненПроцедуры процедуру «РассчитатьСумму» из общего модуля
«РаботаСДокументами».
Запустим 1С:Предприятие в режиме отладки и убедимся, что
теперь сумма в строках табличной части документов
«ПриходнаяНакладная» пересчитывается как при изменении
количества, так и при изменении цены.

78 79
Быстрая разработка прикладных решений
Документ

В результате документ «ОказаниеУслуги» будет выглядеть


следующим образом: Что нового мы узнали

- для чего предназначен объект конфигурации Документ -


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

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


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

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

Глава 4. Регистр накопления Зачем нужен регистр накопления?

И
В этой главе мы познакомимся с объектом конфигурации Регистр так, мы с вами подошли к одному из главных моментов
накопления. Вы узнаете, для чего используется этот объект, какой разработки любой конфигурации - созданию механизма учета
структурой он обладает и каковы его отличительные особенности. накопления данных.
В заключение главы мы создадим с вами один из регистров Казалось бы, что все необходимое мы с вами уже
накопления, который будет использоваться в нашей конфигурации. создали: у нас есть что расходовать и приходовать (справочники) и у
нас есть чем расходовать и приходовать (документы). Осталось
только построить несколько отчетов и автоматизация OOO «На все
руки мастер» будет закончена.
Однако это не так.
Во-первых, путем анализа документов можно, конечно, получить
требуемые нам выходные данные, но представьте, что завтра OOO «На
все руки мастер» решит немного изменить свои бизнес-процессы и нам
потребуется ввести в конфигурацию еще один документ (или
несколько документов!).
Например, сейчас мы полагаем, что товары поступают в OOO и
затем расходуются. Руководство захотело усилить материальный
контроль и решило приходовать товары на основной склад
организации и затем выдавать их материально ответственным лицам.
В этом случае нам придется добавить в конфигурацию еще один
документ, который будет фиксировать перемещение материалов
между основным складом и материально ответственными лицами. И
очевидно, нам придется переработать все отчеты, которые были нами
созданы к этому моменту, с тем, чтобы они учитывали изменения,
вносимые новым документом. А представьте, если в нашей
конфигурации не два, а двадцать документов?!
Во-вторых, отчеты, анализирующие документы, будут работать
довольно медленно, что будет вызывать раздражение пользователей и
недовольство руководителей.
Поэтому в системе 1С:Предприятие есть несколько объектов
конфигурации, которые позволяют создавать в базе данных структуры,
предназначенные для накопления информации в удобном для
последующего анализа виде.

82 83
Быстрая разработка прикладных решений Регистр накопления

Использование таких «хранилищ» данных позволяет нам с одной


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

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

Для тех, кто работал с версией 7.7


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

Основным назначением регистра накопления является накопление


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

84 85
Быстрая разработка прикладных решений Регистр накопления

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


содержит значения измерений, значения приращений ресурсов, ссылку Создание регистра накопления
на документ, который вызвал эти изменения (регистратор) и
«направление» приращения (приход или расход). Такой набор записей
ОстаткиМатериалов

Т
называется движениями регистра накопления. Каждому движению еперь, когда мы знаем, для чего предназначены регистры
регистра накопления всегда должен соответствовать регистратор. накопления, посмотрим, как можно их использовать в нашем
Кроме того, регистр накопления может хранить дополнительную примере.
информацию, описывающую каждое движение. Набор такой Прежде всего, нас интересует информация о том,
дополнительной информации задается разработчиком при помощи сколько и каких материалов есть у нас на складах. Для накопления
реквизитов объекта конфигурации Регистр накопления. такой информации мы создадим регистр «ОстаткиМатериалов».
Откроем в конфигураторе нашу учебную конфигурацию и
<*" Узнай больше! создадим новый объект конфигурации Регистр накопления. Зададим
О структуре объектов встроенного языка, предназначенных для имя регистра - «ОстаткиМатериалов». Нажмем «Далее» и перейдем к
работы с регистрами накопления можно прочитать в главе созданию структуры регистра.
«Регистры накопления» на странице 599. Создадим измерения регистра:
«Материал», с типом
СправочникСсылка.Номенклатура,
«Склад», с типом СправочникСсылка.Склады.
Затем создадим ресурс «Количество» с длиной 15 и точностью 3.
В результате этих действий регистр «ОстаткиМатериалов» должен
иметь следующий вид:

Если вы сейчас попытаетесь запустить 1С:Предприятие в режиме


отладки, то система выдаст сообщение об ошибке:
«РегистрНакопления.ОстаткиМатериалов: Ни один из документов не
является регистратором для регистра». Это сообщение еще раз

86 87
Регистр накопления
Быстрая разработка прикладных решений

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

Д вижения документа - это записи в регистрах, которые


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

Отметим регистр накопления и воспользуемся


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

Обратите внимание, что сразу после отметки выбранного регистра


становится доступной кнопка «Конструктор движений». Этим
конструктором мы и воспользуемся.
Конструктор устроен просто. В списке «Регистры» перечислены
регистры, в которых документ может создавать движения. В нашем
случае там пока один регистр «ОстаткиМатериалов».
В списке «Реквизиты документа» должны находиться исходные
данные для создания движений. А в таблице «Поле - Выражение»

89
Быстрая разработка прикладных решений Регистр накопления

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

Что записываем в измерения и Выберем табличную часть и нажмем «Заполнить


Регистр, для которого выражения»...
конструируем движения Откуда берем данные
(приход или расход)

Как видите, конструктор движений установил соответствия


ресурсы регистра
подходящим образом: в качестве материала в регистр будет записан
материал из табличной части документа, в качестве склада - склад,
указанный в шапке документа, а в качестве количества - количество
из табличной части документа.
Обратите внимание, что по умолчанию конструктор предлагает нам
Нажмем «ОК» и посмотрим, какой текст сформировал конструктор
создавать движения прихода (символ «+» рядом с названием регистра) в модуле объекта:
по регистру «ОстаткиМатериалов». Это нас вполне устраивает, ведь
документ «ПриходнаяНакладная» и должен приходовать материалы.
Процедура ОбработкаПроведения(Отказ, Режим)
В поле выбора «Табличная часть» выберем табличную часть //{{_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный
нашего документа - «Материалы». Список реквизитов документа фрагмент построен конструктором. // При повторном
автоматически заполнится реквизитами нашей табличной части. использовании конструктора, // внесенные вручную
Теперь нажмем «Заполнить выражения». изменения будут утеряны!!! Для Каждого ТекСтрокаМатериалы
Из Материалы Цикл // регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакоплеиия.Приход;

90 91
Быстрая разработка прикладных решений Регистр накопления

Движение.Период = Дата; Откроем Приходную накладную №1 и нажмем «ОК». Обратите


Движение.Материал = ТекСтрокаМатериалы.Материал; внимание, что при проведении приходной накладной появляются
Движение.Склад = Склад; соответствующие записи в регистрах накопления:
Движение.Количество = ТекСтрокаМатериалы.Количество;
КонецЦикла;
// записываем движения регистров
Движения.ОстаткиМатериалов.Записать();
//}_КОНСТРУКТОР ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Конструктор создал обработчик события «ОбработкаПроведения»


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

92 93
Быстрая разработка прикладных решений Регистр накопления

Создание движений документа Что нового мы узнали


ОказаниеУслуги

Т еперь мы аналогичным образом создадим движения


документа «ОказаниеУслуги». При использовании
конструктора будем внимательны и обратим внимание на то,
что документ «ОказаниеУслуги» должен расходовать материалы.
- для чего предназначен объект конфигурации
Регистр накопления
Поэтому перед тем, как нажать «ОК» убедимся, что выбран правильный - почему следует использовать регистры, хотя
тип движения регистров (нам нужен «Расход»).
необходимая информация содержится в других объектах -
Запустим отладку и создадим документ оказания услуги, который
будет расходовать один транзистор Philips за 3 рубля. для чего нужны измерения регистра, ресурсы и реквизиты
Проведем документ оказания услуги и убедимся, что в регистре - что такое движения регистра и что такое регистратор -
накопления он создал верные движения.
Сформированные таким образом движения этого документа будут как создать новый регистр накопления и описать его
не совсем правильны. Дело в том, что в документе «ОказаниеУслуги», структуру
в отличие от документа «ПриходнаяНакладная» могут содержаться не
- как создать движения документа с
только расходуемые материалы, но и услуги. Поэтому в регистр
«ОстаткиМатериалов» будут попадать записи и о расходуемых помощью конструктора движений
услугах, что не правильно. - как средствами встроенного языка обойти
Пока мы ничего не будем делать с движениями, которые
сформировал конструктор, но как только познакомимся с табличную часть документа и обратиться к ее данным -
перечислениями, мы внесем в обработчик проведения необходимые как средствами встроенного языка сформировать и
изменения.
записать движения документа в регистр накопления

94 95
Отчет

Глава 5. Отчет Объект конфигурации Отчет

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

Для тех, кто работал с версией 7.7


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

96
Быстрая разработка прикладных решений Отчет

таблицы регистра «ОстаткиМатериалов» в этой ветке присутствуют


Создание отчета Материалы еще несколько виртуальных таблиц, которые формирует система.

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

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

После выбора имени формы конструктор предложит нам начать


создание отчета. Конструктор обладает большим количеством
возможностей для визуального проектирования отчетов, но мы сейчас
воспользуемся только самыми простыми его возможностями и просто
определим те данные, которые хотим видеть в результате работы
нашего отчета. Как вы видите, эта таблица содержит материал, склад и кроме этого
В списке «База данных» представлен состав объектов базы данных; начальные и конечные остатки, а также значения прихода, расхода и
на основе их данных мы имеем возможность построить отчет. Если оборотов для всех ресурсов регистра «ОстаткиМатериалов».
раскрыть ветку «РегистрыНакопления» то мы увидим, что кроме

98
Быстрая разработка прикладных решений
Отчет

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

После этого на закладке «Итоги» укажем группировочное поле


«Склад»:

Нажмем «ОК». Система автоматически сформирует формы и


откроет их на экране.
Запустим 1С:Предприятие в режиме отладки и посмотрим, как
работает отчет. Выполним Операции | Отчет... | Материалы и
нажмем «Сформировать».

100

101
Быстрая разработка прикладных решений

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

102 103
Быстрая разработка прикладных решений Макет

Объект конфигурации Макет Создание макета документа

О
ОказаниеУслуги

о
бъект конфигурации Макет предназначен для хранения
различных форм представления данных, которые могут 1 ткроем в конфигураторе окно редактирования объекта
потребоваться каким либо объектам конфигурации или всему конфигурации Документ «ОказаниеУслуги». Перейдем на
прикладному решению в целом. Макет может содержать закладку «Макеты» и запустим конструктор печати:
табличный или текстовый документ, двоичные данные, HTML-
документ или Active Document. Макеты могут существовать как сами
по себе (общие макеты), так и быть подчинены какому либо объекту Запустим конструктор печати...
конфигурации.
Одно из предназначений макета, подчиненного объекту 1
конфигурации и содержащего табличный документ - создание
печатной формы этого объекта.
Создание печатной формы заключается в конструировании ее
составных частей - именованных областей, из которых затем
«собирается» готовая печатная форма. Порядок заполнения областей
данными и порядок вывода их в итоговую форму описывается при
помощи встроенного языка.
Печатная форма может включать в себя различные графические
объекты: картинки, OLE-объекты, диаграммы и т.д.
Помимо создания макета «вручную», конфигуратор предоставляет
разработчику возможность воспользоваться специальным
инструментом - конструктором печати, который берет на себя
большинство рутинной работы по созданию макета.

На первом шаге укажем, что новая процедура, которая будет


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

104
Быстрая разработка прикладных решений Макет

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

Эта та кнопка, которую добавил конструктор. Нажмем на нее и


увидим печатную форму нашего документа.

Как видите, конструктор сформировал вполне подходящую


печатную форму для нашего документа. Единственное, чего не хватает
в данной форме - это итоговой суммы документа.

106 107
Редактирование макетов и форм

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


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

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

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

Выделим мышью две строки и зададим имя области

Здесь следует сказать о том, что каждая ячейка редактируемого


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

Назовем область «Всего». В созданной области, в колонке «Цена»,


н а п иш е м « В с е го », а в к о л о н к е « С у м м а » н а п и ш е м
«ВсегоПоДокументу».

110 111
Быстрая разработка прикладных решений Редактирование макетов и форм

Теперь откроем модуль формы документа «ОказаниеУслуги» - параметру «ВсегоПоДокументу», находящемуся в этой области, мы
«ФормаДокумента». Найдем в нем процедуру «Печать» и после цикла присваиваем значение суммы табличной части документа по колонке
добавим в нее следующие строки (новые строки выделены жирным «Сумма» (обращение к табличной части документа выполняется по
шрифтом): имени - «ПереченьНоменклатуры»). В заключение мы выводим
область в итоговый табличный документ, который будет показан на
Процедура Печать(Элемент)
экране и распечатан пользователем.
// {{_KOHCTPyKTOP_ПЕЧАТИ_ЭЛEMEHT(печать) // Подобным образом, используя свойства ячеек макета и управляя
Данный фрагмент построен конструктором. // При порядком их вывода, разработчик имеет возможность создать
повторном использовании конструктора, //внесенные
вручную изменения будут утеряны!!! ТабДок = Новый печатную форму любого дизайна.
ТабличныйДокумент; А теперь, для того, чтобы наш документ «ОказаниеУслуги»,
Макет = Документы.ОказаниеУслуги.ПолучитьМакет("Печать"); //
Заголовок выглядел вполне законченным, добавим итоговую сумму по
Область = Макет.ПолучитьОбласть("Заголовок"); документу и на экранную форму, чтобы пользователь мог видеть ее в
ТабДок.Вывести(Область); // Шапка процессе заполнения табличной части документа.
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Номер = Номер;
Область.Параметры.Дата = Дата;
Область.Параметры.Клиент = Клиент;
Область.Параметры.Мастер = Мастер;
ТабДок.Вывести(Область); // тчНоменклатура
Область = Макет.ПолучитьОбласть("тчНоменклатураШапка");
ТабДок.Вывести(Область);
Для Каждого ТекСтрокатчНоменклатура Из тчНоменклатура Цикл
Область = Макет.ПолучитьОбласть("тчНоменклатура");
Область.Параметры.УслугаМатериал = ТекСтрокатчНоменклатура.Номенклатура;
Область.Параметры.Количество = ТекСтрокатчНоменклатура.Количество;
Область.Параметры.Цена = ТекСтрокатчНоменклатура.Цена;
Область.Параметры.Сумма = ТекСтрокатчНоменклатура.Сумма;
ТабДок.Вывести(Область); КонецЦикла;
Область = Макет.ПолучитьОбласть("Всего");
Область.Параметры.ВсегоПоДокументу = ПереченьНоменклатуры
.Итог("Сумма");
ТабДок.Вывести(Область); ТабДок.ОтображатьСетку =
Ложь; ТабДок.Защита = Ложь; ТабДок.ТолькоПросмотр =
Ложь; ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
//} }_КОНСТРУКТОР_ПЕЧАТИ_ЭЛЕМЕНТ
КонецПроцедуры

Смысл добавленного фрагмента прост: мы получаем новую область


«Всего» (ту, которую мы только что добавили к макету). Затем

112
113
Быстрая разработка прикладных решений Редактирование макетов и форм

После этого откроем свойства колонки «Сумма», установим


Редактирование формы документа горизонтальное положение в подвале - «Прижать вправо», установим
ОказаниеУслуги флаг «Показывать итог в подвале» и в шрифте подвала тоже изменим
начертание на «Жирный».

О
ткроем в конфигураторе форму документа «ОказаниеУслуги»
- «ФормаДокумента». Откроем палитру свойств для Запустим 1С:Предприятие в режиме отладки и посмотрим, как
табличного поля, расположенного в форме, и установим теперь выглядит форма документа Оказание услуги № 1:
свойство «Подвал», которое определяет наличие подвала у элемента
управления табличное поле.

Добавим подвал к табличному полю...

Подобным образом, используя свойства элементов управления и


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

Затем откроем свойства колонки «Цена» и установим текст подвала


- «Всего:», горизонтальное положение в подвале - «Прижать вправо»
и в шрифте подвала изменим начертание на «Жирный».

114
115
Быстрая разработка прикладных решений

Что нового мы узнали Часть II. Использование


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

116 117
Периодический регистр сведений

Глава 1. Периодический регистр Зачем нужен периодический регистр


сведений сведений?

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

118 119
Использование основных объектов конфигурации Периодический регистр сведений

Как и для других регистров, система контролирует уникальность


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

О
бъект конфигурации Регистр сведений является прикладным уникальным идентификатором записи является регистратор и номер
объектом и предназначен для описания структуры хранения строки, то для регистра сведений применяется другой принцип
данных в разрезе нескольких измерений. На основе объекта формирования ключевого значения.
конфигурации Регистр сведений платформа создает в базе данных Ключом записи, однозначно идентифицирующим запись, является
информационную структуру, в которой может храниться в данном случае совокупность значений измерений регистра и периода
произвольная информация «привязанная» к набору измерений. (в случае, если регистр сведений периодический). Регистр сведений не
Принципиальным отличием регистра сведений от регистра может содержать несколько записей с одинаковыми ключами.
накопления является то, что каждое движение регистра сведений Если продолжать сравнение с регистром накопления, то можно
устанавливает новое значение ресурса, в то время как движение сказать, что регистр сведений предоставляет больше свободы в
регистра накопления изменяет существующее значение ресурса. По редактировании хранимых данных. Наряду с тем, что регистр сведений
этой причине регистр сведений может хранить любые данные (а не может использоваться в режиме подчинения регистратору (когда
только числовые, как регистр накопления). записи регистра сведений «привязаны» к документу-регистратору),
Следующей важной особенностью регистра сведений является его регистр сведений может использоваться и в независимом режиме, в
способность (при необходимости) хранить данные с привязкой ко котором пользователю предоставляется полная свобода интерактивной
времени. Благодаря этому регистр сведений может хранить не только работы с данными регистра. Регистр сведений, не использующий
актуальные значения данных, но и историю их изменения во времени. подчинение регистратору, называют независимым регистром
Регистр сведений, использующий привязку ко времени называют сведений.
обычно периодическимрегистром сведений.
Периодичность регистра сведений можно определить одним из Узнай больше!
следующих значений: О структуре объектов встроенного языка, предназначенных для
работы с регистрами сведений можно прочитать в главе «Регистры
• в пределах секунды, сведений» на странице 593.
• в пределах дня,
• в пределах месяца,
• в пределах квартала,
• в пределах года.
• в пределах регистратора (если установлен режим записи -
«Подчинение регистратору»)
Периодический регистр сведений всегда содержит служебное поле
«Период», добавляемое системой автоматически. Оно имеет тип Дата,
и служит для указания факта принадлежности записи к какому-либо
периоду. При записи данных в регистр, платформа всегда приводит
значение этого поля к началу того периода, в который он попадает.
Например, если в регистр сведений с периодичностью в пределах
месяца записать данные, в которых период указан как 08.04.2004, то
регистр сохранит эти данные со значением периода равным 01.04.2004.

120
121
Использование основных объектов конфигурации Периодический регистр сведений

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


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

П риступим к созданию периодического регистра сведений, который значению выбранного элемента справочника.
будет хранить развернутые во времени розничные цены материалов и После этого создадим новый ресурс «Цена», тип Число, длина 15,
стоимости услуг, оказываемых нашим OOO «На все руки мастер». точность 2, неотрицательное.
Откроем конфигуратор и создадим новый объект конфигурации Теперь запустим 1С:Предприятие в режиме отладки и посмотрим,
Регистр сведений. Назовем его «Цены». Установим периодичность как работает наш периодический регистр сведений Цены.
этого регистра в пределах секунды. Зададим стоимость услуг нашего 000 «На все руки мастер»
Перейдем на закладку «Данные» и создадим измерение регистра следующим образом:
«Номенклатура» с типом СправочникСсылка.Номенклатура.
Укажем, что это измерение будет ведущим.

Создадим измерение «Номенклатура» и укажем, что оно будет ведущим...

После этого зададим розничные цены на материалы:

Свойство «Ведущее» имеет смысл использовать лишь тогда, когда


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

122 123
Использование основных объектов конфигурации
Периодический регистр сведен

Значения ресурсов возвращаются в структуре, поэтому в


Создание функции РозничнаяЦена() следующей строке мы получаем искомую нами розничную цену

С начала мы создадим функцию, которая будет возвращать нам просто указав имя нужного нам ресурса регистра через точку
у
(ЗначенияРесурсов.Цена).
актуальную розничную цену номенклатуры. Откроем
конфигуратор, в ветке Общие | Общие модули создадим Теперь проверим, как работает эта функция.
новый объект конфигурации Модуль и назовем его
«РаботаСоСправочниками».
Разместим в нем следующий текст:

Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры)


Экспорт
//создать вспомогательный объект Отбор
Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);

//получить актуальные значения ресурсов регистра


ЗначенияРесурсов = РегистрыСведений.Цены
.ПолучитьПоследнее(АктуальнаяДата, Отбор);
Возврат ЗначенияРесурсов.Цена; КонецФуикции

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


два параметра:

• АктуальнаяДата - параметр типа Дата, который будет


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

124
Использование основных объектов конфигурации Периодический регистр сведений

В заключение мы вызываем нашу процедуру «РассчитатьСумму»


Автоматическое заполнение цены в из общего модуля «РаботаСДокументами» для того, чтобы она
документе ОказаниеУслуги пересчитала итоговую сумму в строке нашего документа.

И так, задача, которая перед нами стоит, заключается в Проверим, как теперь работает наш документ. Запустим
следующем. При создании документа «ОказаниеУслуги» нам 1С:Предприятие в режиме отладки и откроем регистр сведений
«Цены». Для транзистора Philips добавим следующим числом новую
необходимо обеспечить автоматическое заполнение поля
цену:
«Цена» после того, как пользователь выберет услугу. Причем цена
услуги должна определяться исходя из даты создаваемого
документа.
Найдем в конфигураторе документ «ОказаниеУслуги» и откроем
его форму «ФормаДокумента». Откроем свойства поля ввода,
расположенного в колонке «Номенклатура» и внизу списка найдем
событие «При изменении». Нажмем на кнопку с лупой и в
открывшейся заготовке обработчика события напишем следующий
текст:
Теперь откроем документ ОказаниеУслуги №1. Как вы помните,
ПроцедураПереченьНоменклагурыНоменклатураПриИзменении(Элемент)
этим документом мы как раз «израсходовали» один такой транзистор.
//получить текущую строку табличной части Установим дату документа равной той дате, когда было задано
СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные; первое значение цены транзистора, и повторим выбор транзистора в
колонке «Номенклатура» табличной части документа. Автоматически
//установить цену установится первое значение цены:
СтрокаТабличнойЧасти.Цена = РозничнаяЦенаДата, Элемент.Значение);

//пересчитать сумму строки


РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры

Прокомментируем содержимое обработчика.


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

126
127
Использование основных объектов конфигурации Периодический регистр сведений

Теперь изменим дату документа на следующий день и снова


повторим выбор транзистора. Будет установлено новое значение цены: Что нового мы узнали

- для чего предназначен объект конфигурации Регистр


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

128
129
Перечисление

Глава 2. Перечисление Объект конфигурации Перечисление

О
бъект конфигурации Перечисление является прикладным
До сих пор мы с вами не обращали внимания на то, что у нас нет объектом и предназначен для описания структуры хранения
никакого признака, по которому мы могли бы сказать, чем является постоянных наборов значений, не изменяемых в процессе
конкретный элемент справочника «Номенклатура»: материалом или работы конфигурации. На основе объекта конфигурации
услугой. To, что все элементы справочника разложены у нас по Перечисление платформа создает в базе данных информационную
некоторым группам, не может являться надежным критерием оценки: структуру, в которой может храниться набор некоторых постоянных
группы можно удалить, переименовать, сгруппировать элементы по значений.
другим принципам...
В реальной жизни этому объекту может соответствовать, например,
Поэтому нам требуется некоторый признак, позволяющий перечисление вариантов указания цены («включая НДС», «без НДС»).
однозначно определять принадлежность элемента справочника к Набор всех возможных значений, которые содержит перечисление,
материалам или услугам, независимо от изменения иерархической задается при конфигурировании системы, и пользователь не может
структуры справочника. изменять их, удалять или добавлять новые.
В этой главе мы создадим у справочника «Номенклатура» Из этого следует важная особенность перечисления: значения
специальный реквизит, тип значения которого образуется новым пока перечисления не «обезличены» для конфигурации, на них могут
еще для нас объектом конфигурации Перечисление. Это поможет нам опираться алгоритмы работы программы.
в дальнейшем легко определять, чем является элемент справочника
«Номенклатура»: услугой или материалом. Кроме этого, мы
тех, ктоработал с версией 7.7
скорректируем процедуру проведения документа ОказаниеУслуги и Перечисления могут теперь иметь формы (в том числе основную
покажем, как работать с перечислением средствами встроенного форму списка и выбора), а также макеты.
языка.

" Узнай больше!


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

130 131
Использование основных объектов конфигурации Перечисление

После этого запустим 1С:Предприятие в режиме отладки и зададим


Реорганизация справочника Номенклатура для каждого элемента справочника «Номенклатура» соответствующее

О ткроем конфигуратор и создадим сначала новый объек значение реквизита «ВидНоменклатуры»:


конфигурации Перечисление с
имене\
«ВидыНоменклатуры».
На закладке «Данные» добавим два значен»
перечисления: «Материал» и «Услуга»:

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


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

Затем добавим в
справочник «Номенклатура» новый реквизит
«ВидНоменклатуры» с типом
ПеречислениеСсылка.ВидыНоменклатуры:

132
133
Использование основных объектов конфигурации Перечисление

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

Е
//} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
сли вы помните, в первой части книги, когда создавались КонецПроцедуры
движения документа «ОказаниеУслуги» по регистру
накопления «ОстаткиМатериалов», мы сказали, что они не
Добавленный текст исключает из выполнения операторов цикла те
совсем правильные, поскольку в регистр будут попадать не только строки документа, в которых номенклатура не является материалом. К
записи об израсходованных материалах, но и записи об значению перечисления «Материал» мы обращаемся, используя
оказанных услугах. менеджер перечисления «ВидыНоменклатуры»
Теперь мы займемся тем, что доработаем документ таким образом, (Перечисления.ВидыНоменклатуры), указывая в качестве его
чтобы в регистре появлялись только записи, относящиеся к расходу свойства имя нужного нам значения перечисления.
материалов. Эта доработка будет не совсем эффективна с точки зрения Запустим 1С:Предприятие в режиме отладки и проверим работу
производительности, зато позволит нам получить нужные данные в процедуры проведения документа «ОказаниеУслуги».
регистре «ОстаткиМатериалов». Откроем документ Оказание услуги №1 и внесем в него следующие
Более эффективный вариант обработки проведения этого изменения (обратите внимание, что изменен не только состав
документа мы рассмотрим после изучения главы, рассказывающей о номенклатуры в табличной части, но и время документа):
механизме запросов 1С:Предприятия 8.0.
Скорректируем движения документа, исключив из обработки те
строки табличной части, в которых находятся услуги. Для этого в
обработчик события «ОбработкаПроведения», расположенный в
модуле документа «ОказаниеУслуги», добавим следующий текст
(добавленный текст выделен жирным шрифтом):

Процедура ОбработкаПроведения(Отказ, Режим)


//{{_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ //
Данный фрагмент построен конструктором. // При
повторном использовании конструктора, // внесенные
вручную изменения будут утеряны!!! Для Каждого
ТекСтрокаПереченьНоменклатуры Из
ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьНоменклатуры.Номеиклатура.ВидНоменклатуры<>
Перечисления.ВидыНоменклатуры.Материал тогда Продолжить; КонецЕсли;

// регистр ОстаткиМатериалов Расход


Движение = Движения.ОстаткиМатериалов.Добавить(); Перед тем, как провести документ, откроем список регистра
Движение.ВидДвижения = ВидДвиженияНакопления.Расход; «ОстаткиМатериалов», содержащий движения этого документа. Для
Движение.Период = Дата; этого выполним команду Перейти | Остатки материалов из
Движение.Материал = ТекСтрокаПереченъНоменклатуры.Номенклатура; командной панели документа.
Движение.Склад = Склад:

134 135
Использование основных объектов конфигурации
Перечисление

Проведем документ и убедимся, что в движения по регистру


«ОстаткиМатериалов» включаются только строки, содержащие Что нового мы узнали
материалы:

- для чего предназначен объект конфигурации


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

136
137
Проведение документа по нескольким регистрам

Глава 3. Проведение документа по Зачем нужно проведение документа по


нескольким регистрам нескольким регистрам?
Эта глава будет посвящена тому, как один и тот же документ может
«поставлять» информацию в различные регистры конфигурации и для
чего может понадобиться такая возможность.
Д о сих пор мы с вами учитывали только количественное
движение материалов в OOO «На все руки мастер». Для этих
целей мы создали регистр накопления «ОстаткиМатериалов».
Однако, как вы, наверное, догадываетесь, одного только
В ходе изучения этой главы мы создадим еще один регистр количественного учета совершенно недостаточно для нужд нашего
накопления нашей конфигурации и изменим процедуру проведения 000.
документов так, чтобы они записывали необходимые данные как в
Очевидно, что необходимо также знать, какие денежные средства
один, так и в другой регистр и подготовим базу для изучения были затрачены на приобретение тех или иных материалов, и каковы
следующей главы. материальные запасы OOO «На все руки мастер» в денежном
выражении.
После того, как мы начали автоматизировать наше предприятие,
руководство 000 «На все руки мастер» высказало пожелание, чтобы
весь суммовой учет материалов велся бы теперь по средней стоимости.
To есть, при закупке материалов они должны учитываться в ценах
приобретения, а при расходе - по средней стоимости, которая
рассчитывается исходя из общей суммы закупок данного материала и
общего количества этого материала, находящегося в OOO.
Поскольку подобная информация имеет совершенно другую
структуру, нежели количественный учет, для хранения данных об
общей стоимости тех или иных материалов мы будем использовать
еще один регистр накопления «СтоимостьМатериалов».
Таким образом, документы «ПриходнаяНакладная» и
«ОказаниеУслуги» должны будут создавать движения не только в
регистре «ОстаткиМатериалов», но, одновременно, и в регистре
«СтоимостьМатериалов», отражая изменения суммового учета.

138 139
Использование основных объектов конфигурации Проведение документа по нескольким регистрам

Создание регистра СтоимостьМатериалов Изменение процедуры проведения

Р егистр «СтоимостьМатериалов» совсем не сложен, поэтому мы


не будем подробно останавливаться на его создании. Этот
регистр будет иметь всего одно измерение - «Материал» с
типом СправочникСсылка.Номенклатура и один ресурс - :
документа ПриходнаяНакладная

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

Теперь мы можем приступить к внесению изменений в процедуры


проведения документов. Добавим в список регистров новый регистр...

Начнем с самого простого - документа «ПриходнаяНакладная».

140 141
Использование основных объектов конфигурации Проведение документа по нескольким регистрам

//внесенные вручную изменения будут утеряны!!!


Нажмем «ОК» и посмотрим на текст, который сформировал Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
конструктор: // регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Процедура ОбработкаПроведения(Отказ, Режим) Движение.Период = Дата;
//{{_КОНСТРУКТОР ДВИЖЕНИЙ_РЕГИСТРОВ Движение.Материал = ТекСтрокаМатериалы.Материал;
//Данный фрагмент построен конструктором. // При Движение.Склад = Склад;
повторном использовании конструктора, //внесенные Движение.Количество = ТекСтрокаМатериалы.Количество;
вручную изменения будут утеряны!!! Для Каждого //КонецЦикла; //Для Каждого ТекСтрокаМатериалы Из
ТекСтрокаМатериалы Из Материалы Цикл Материалы Цикл
// регистр ОстаткиМатерналов Приход // регистр СтоимостьМатериалов
Движение = Движения.ОстаткиМатериалов.Добавить(); Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата; Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал; Движение.Материал = ТекСтрокаМатериалы.Материал;
Движекие.Склад = Склад; Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
Движеиие.Количество = ТекСтрокаМатериалы.Количество; КонецЦикла;
КонецЦикла; Для Каждого ТекСтрокаМатериалы Из // записываем движения регистров
Материалы Цикл Движения.ОстаткиМатериалов.ЗаписатьО;
// регистр СтоимостьМатериалов Движения.СтоимостьМатериалов.Записать();
Движение = Движения.СтоимостьМатериалов.Добавить(); //}}_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ
Движение.ВидДвижения = ВидДвиженияНакопления.Приход; КонецПроцедуры
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
и перепроведем
// записываем движения регистров Запустим 1С:Предприятие в режиме отладки
Движения.ОстаткиМатериалов.Записать(); документ Приходная накладная №1.
Движения.СтоимостьМатериалов.Записать();
//}}_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ Затем откроем его и убедимся, что документ создает желаемые
КонецПроцедуры записи в регистрах накопления:

Как вы видите, конструктор создал два цикла обхода табличной


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

Процедура ОбработкаПроведения(Отказ, Режим)


//{{—КОНСТРУКТОРЛВИЖЕНИЙ.РЕГИСТРОВ //
Данный фрагмент построен конструктором. // При
повторном использовании конструктора.

142 143
Использование основных объектов конфигурации

Изменение процедуры проведения


документа ОказаниеУслуги

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

144
Использование основных объектов конфигурации Проведение документа по нескольким регистрам

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

Теперь создадим движения документа «ОказаниеУслуги» таким же


образом, как мы делали это для документа «ПриходнаяНакладная». Нажмем «ОК» и в тексте, сформированном конструктором,
Откроем в конфигураторе окно редактирования объекта восстановим изменения, внесенные нами ранее, а также объединим два
цикла обхода табличной части документа в один (изменения выделены
конфигурации Документ «ОказаниеУслуги» и укажем, что он будет жирным шрифтом):
создавать движения по регистру накопления «СтоимостьМатериалов».
Процедура ОбработкаПроведеиия(Отказ, Режим)
//{{_КОНСТРУКТОР ДВИЖЕНИЙ_РЕГИСТРОВ
//Данный фрагмент построен конструктором. // При
повторном использовании конструктора, //
внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаПереченьНоменкяатуры Из ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьН оменклатуры.Номенклатура.ВидНоменклатуры <>
Перечисления.ВидыНоменклатуры.МатериалТогда
Продолжить;
КонецЕсли;

// регистр ОстаткиМатериалов Расход Движение =


Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;

146
Использование основных объектов конфигурации Проведение документа по нескольким регистрам

Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура; Проведем документ Оказание услуги №1 и посмотрим на движения


Движение.Склад = Склад; этого документа по регистру «СтоимостьМатериалов»:
Движение.Количество = ТекСтрокаПереченъНоменклатуры.Количество;
//КонецЦикла;
//Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр СтоимостьМатериалов Расход Движение =
Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость *
ТекСтрокаПереченьНоменклатуры.Количество;
КонецЦикла;
// записываем движения регистров Т е п е р ь с о з д а д и м и п р о в е д е м е щ е д в а д о к у м е н та
Движения.ОстаткиМатериалов.Записать();
Движения.СтоимостьМатериалов.Записать(); «ОказаниеУслуги». Эти документы понадобятся нам в дальнейшем,
//} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ поэтому будьте внимательны и обратите внимание на то, что эти
документы созданы другими датами:
Проверим, как теперь работает проведение документа
«ОказаниеУслуги».
Запустим 1С:Предприятие в режиме отладки и укажем стоимость
выбранных материалов:

148 149
Использование основных объектов конфигурации
Проведение документа по нескольким регистрам

Что нового мы узнали

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


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

Движения документов Оказание услуги №2 и №3 должны


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

150
151
Оборотный регистр накопления

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

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

• какие именно услуги были оказаны (чтобы составить рейтинг


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

152 153
Использование основных объектов конфигурации Оборотный регистр накопления

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


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

К огда мы создавали регистры «ОстаткиМатериалов»


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

154 155
Использование основных объектов конфигурации Оборотный регистр накопления

У регистра будет три ресурса:


Изменение процедуры проведения
• «Количество», тип Число, длина 15, точность 3,
документа ОказаниеУслуги

Н
• «Выручка»,тип Число, длина 15, точность 2,
а этот раз мы не будем использовать конструктор движений
• «Стоимость», тип Число, длина 15, точность 2. документа, а внесем необходимые дополнения прямо в
Откроем окно редактирования объекта конфигурации Документ обработчик события «ОбработкаПроведения» документа
«ОказаниеУслуги» и на закладке «Движения» укажем, что этот «ОказаниеУслуги».
документ будет создавать движения по регистру «Продажи». Откроем в конфигураторе модуль объекта конфигурации документ
Запустим 1С:Предприятие в режиме отладки и откроем формы «ОказаниеУслуги» и найдем в нем процедуру обработчика события
списка регистров накопления «Продажи» и «ОстаткиМатериалов». «ОбработкаПроведения».
Обратите внимание, что формы практически одинаковы, за Создадим еще один цикл обхода табличной части и команду записи
исключением состава измерений и ресурсов. движений регистра (добавления выделены жирным шрифтом):

Процедура ОбработкаПроведения(Отказ, Режим)


//{{_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
//Данный фрагмент построен конструктором. //
При повторном использовании конструктора, //
внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <>
Перечисления.ВидыНоменклатуры.Материал Тогда
Продолжить;
КонедЕсли;

// регистр ОстаткиМатериалов Расход


Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакогшения.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры
.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
//КонецЦикла;
//Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимостъ *
ТекСтрокаПереченьНоменклатуры.Количество;
КонецЦикла;
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры
Цикл

157

156
Использование основных объектов конфигурации Оборотный регистр накопления

// регистр Продажи Движение.Клиент = Клиент;


Движение.Мастер = Мастер;
КонецЦикла; Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
// записываем движения регистров Двнжение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость *
Движения.ОстаткиМатериалов.Записать(); ТекСтрокаПереченьНоменклатуры.Количество;
Движения.СтоимостьМатериалов.Записать(); КонецЦикла;
Движения.Продажи.Записать();
//} }_КОНСТРУКТОР^ВИЖЕНИЙ_РЕГИСТРОВ // записываем движения регистров
КонецПроцедуры _______________________________ Движения.ОстаткиМатериалов.Записать();
Движения.СтоимостьМатериалов.Записать();
Теперь в тело созданного нами цикла вставим команды создания Движения .Продажи.Записать();
//} }_КОНСТРУКТОР^ВИЖЕНИЙ_РЕГИСТРОВ
движений регистра «Продажи»: КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим) Все добавленные конструкции вам уже хорошо известны, обратите
//{{_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ // внимание лишь на то, что у оборотного регистра отсутствует свойство
Данный фрагмент построен конструктором. // При
повторном использовании конструктора, // внесенные
«ВидДвижения», поскольку отражение вида движения (приход или
вручную изменения будут утеряны!!! расход) имеет смысл лишь при учете остатков. В случае регистра
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл Если оборотов нас интересует только значение, на которое должно быть
ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <> записано в ресурс регистра.
Перечислеиия.ВидыНоменклатуры.МатериалТогда
Продолжить; Запустим 1С:Предприятие в режиме отладки и перепроведем все
КонецЕсли; документы «Оказание услуги». Движения этих документов по
регистру «Продажи» должны иметь следующий вид:
// регистр ОстаткиМатериалов Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата; Движения документа Оказание услуги №1
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
//КонецЦикла;
//Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр СтоимостьМатериалов Расход Движение =
Движения.СтоимостьМатериалов.Добавшъ(); Движение.ВидДвижения =
ВидДвиженияНакопления.Расход; Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Стоимостъ = ТекСтрокаПереченьНоменклатуры.Стоимость *
ТекСтрокаПереченьНоменклатуры.Количество;
КонецЦикла;
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаПеречеиьНоменклатуры.Номенклатура;

158 159
Использование основных объектов конфигурации Оборотный регистр накопления

Что нового мы узнали


Движения документа Оказание услуги №2

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


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

Теперь у нас есть практически вся необходимая информация для


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

160 161
Создание отчетов

Глава 5. Создание отчетов работа с запросами


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

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

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

162 163
Использование основных объектов конфигурации Создание отчетов

формироваться и из одной реальной таблицы (например, виртуальная Объединение запросов определяет, как будут объединены
таблица «Цены.СрезПоследних» формируется на основе таблицы результаты выполнения нескольких запросов.
регистра сведений «Цены»). Однако общим для всех виртуальных Упорядочивание результатов определяет условия упорядочивания
таблиц является то, что им можно задать ряд параметров, которые строк результата запроса.
будут определять, какие данные будут включены в эти виртуальные АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим
таблицы. Набор таких параметров может быть различным для разных автоматического упорядочивания строк результата запроса.
виртуальных таблиц, и определяется данными, хранящимися в Описание итогов определяет, какие итоги необходимо
исходных таблицах базы данных. рассчитывать в запросе и каким образом группировать результат.
Реальные таблицы подразделяются на объектные (ссылочные) и не Применение различных синтаксических конструкций языка
объектные (не ссылочные). запросов подробно описано в книге «1С:Предприятие 8.0 Описание
В объектных (ссылочных) таблицах представлена информация встроенного языка», поэтому мы перейдем прямо к созданию отчетов,
ссылочных типов данных (справочники, документы, планы видов и по пути будем комментировать создаваемый текст запросов.
характеристик и т.д.). А в не объектных (не ссылочных) - всех
остальных типов данных (константы, регистры и т.д.).
Отличительной особенностью объектных (ссылочных) таблиц
является то, что они содержат поле «Ссылка», содержащее ссылку на
текущую запись. Кроме этого для таких таблиц возможно получение
пользовательского представления объекта, эти таблицы могут быть
иерархическими и поля таких таблиц могут содержать вложенные
таблицы (табличные части).

Язык запросов

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

• описание запроса,
• объединение запросов,
• упорядочивание результатов,
• АВТОУПОРЯДОЧИВАНИЕ
• описание итогов.
Обязательной частью запроса является только первая - описание
запроса. Все остальные присутствуют по необходимости.
Описание запроса определяет источники данных, поля выборкИ,
группировки и т.д.

164 165
Использование основных объектов конфигурации Создание отчетов

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


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

П ервым отчетом, на основе которого мы начнем знакомиться с представления ссылочных полей, в расчете на то, что именно они и
языком запросов, будет отчет будут использованы для вывода в документ.
«РеестрДокументовОказаниеУслуги». Этот отчет просто После этого перейдем на закладку «Порядок» и укажем, что
будет выводить список существующих в базе данных результат запроса должен быть сначала упорядочен по значению поля
документов «ОказаниеУслуги» в порядке их дат и номеров. «Дата», а затем - по значению поля «ОказаниеУслуги.Ссылка»:
Создадим в конфигураторе новый объект конфигурации Отчет
«РеестрДокументовОказаниеУслуги». Перейдем на закладку «Макет»
и запустим конструктор выходной формы.
В качестве источника данных для запроса выберем объектную
(ссылочную) таблицу документов «ОказаниеУслуги». Из этой таблицы
выберем следующие поля: Перейдем на закладку «Отчет» и сбросим флаг «Использовать
построитель отчета»:
• «Дата»,
• «Номер»,
Сбросим флаг «Использовать построитель отчета»...
• «Склад»,
• «Мастер»,
• «Клиент»:

Обратите внимание, что при выборе полей «Склад», «Мастер» и


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

166 167
Использование основных объектов конфигурации
Создание or ieTOB

формируется текст запроса, который будет использован для получения После ключевого слова ИЗ указываются источники данных -
интересующих нас данных: исходные таблицы запроса, содержимое которых обрабатывается в
запросе. В данном случае это объектная (ссылочная) таблица
«Документ.ОказаниеУслуги». После ключевого слова КАК
Запрос.Текст = указывается псевдоним источника данных. В нашем случае это
"ВЫБРАТЬ «ОказаниеУслуги». В дальнейшем к этому источнику данных можно
| ОказаниеУслуги.Дата КАК Дата,
| ОказаниеУслуги.Номер КАК Номер,
будет обращаться в тексте запроса, используя псевдоним.
| ОказаниеУслуги.Склад, Такое обращение мы видим в описании полей выборки:
| ОказаниеУслуги.Склад.Представление,
| ОказаниеУслуги.Мастер,
| ОказаниеУслуги.Мастер.Представление,
"ВЫБРАТЬ
| ОказаниеУслуги.Клиент,
| ОказаниеУслуги.Дата КАК Дата,
| ОказаниеУслуги.Клиент.Представление
| ОказаниеУслуги.Номер КАК Номер,
| ИЗ
| ОказаниеУслуги.Склад,
| Документ.ОказаниеУслуги КАК ОказаниеУслуги
| ОказаниеУслуги.Склад.Представление,
|
| ОказаниеУслуги.Мастер,
|УПОРЯДОЧИТЬ ПО
| Дата, | ОказаниеУслуги.Мастер.Представление,
| Номер"; | ОказаниеУслуги.Клиент,
| ОказаниеУслуги.Клиент.Представление

Текст запроса начинается, как мы говорили выше, с части описания


запроса: Поля выборки также могут иметь псевдонимы, по которым в
дальнейшем в тексте запроса можно обращаться к этому полю. В
нашем случае это псевдонимы «Дата» и «Номер».
После части описания запроса в нашем примере следует часть
"ВЫБРАТЬ упорядочивания результатов:
I ОказаниеУслуги.Дата КАК Дата,
I ОказаниеУслуги.Номер КАК Номер,
I ОказаниеУслуги.Склад,
I ОказаниеУслуги.Склад.Представление, |УПОРЯДОЧИТЬ ПО
I ОказаниеУслуги.Мастер, | Дата, |
I ОказаниеУслуги.Мастер.Представление, Номер";
I ОказаниеУслуги.Клиент,
1 ОказаниеУслуги.Клиеит.Представление
1ИЗ Предложение УПОРЯДОЧИТЬ ПО позволяет сортировать строки
в
I Документ.ОказаниеУслуги КАК ОказаниеУслуги результате запроса. После этого ключевого предложения
располагается выражение упорядочивания, которое, в общем случае,
представляет собой перечисление полей (выражений) и порядка
Описание запроса начинается с обязательного ключевого слова вывода. В нашем случае упорядочивание будет выполняться сначала
ВЫБРАТЬ. Затем следует список полей выборки, в котором По
полю выборки, обращение к которому выполняется через
описываются поля, которые должны содержаться в результате запроса. псевдоним - «Код», а затем по полю - «Номер». В обоих случаях
Этот список может содержать как собственно поля, так и некоторые порядок сортировки будет по возрастанию, который является
выражения, вычисляемые на основе значений полей. По
рядком сортировки по-умолчанию.

168
169
Использование основных объектов конфигурации Создание отчетов

Теперь обратим внимание на то, как выводится результат запроса в В начале процедуры мы получаем макет отчета, из которого затем
табличный документ. получаем существующие в нем области в соответствующие
переменные:
Процедура РеестрДокументовОказаниеУслуги(ТабДок) Экспорт
//{{КОНСТРУКТОР_ВЫХОДНЬК_ФОРМ(РеестрДокументовОказаниеУслугн)
// Данный фрагмент построен конструктором. // При повторном использовании ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
конструктора, // внесенные вручную изменения будут утеряны!!! ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
Макет = ПолучитьМакет("РеестрДокументовОказаниеУслуги"); ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы"');
Запрос = Новый Запрос; ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

Результат = Запрос.Выполнить(); Затем мы очищаем табличный документ и выводим в него те


области, которые не содержат данных, получаемых из результата
ОбластъЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ОбластьПодвал = запроса:
Макет.ПолучитьОбласть("Подвал"); ОбластьШапкаТаблицы =
Макет.ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы =
Макет.ПолучитьОбласть("ПодвалТаблицы"); ОбластьДетальныхЗаписей =
Макет.ПолучитьОбласть("Детали"); ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Очистить(); ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.Вывести(ОбластьЗаголовок); ТабДок.НачатьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогрутшировкуСтрок();

ВыборкаДетали = Результат.Выбрать(); В последней строке конструктор добавил начало автогруппировки


Пока ВыборкаДетали.Следукнций() Цикл
строк. В данном примере у нас нет строк, которые нужно было бы
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали); группировать, но по умолчанию конструктор всегда предлагает
ТабДок.Вывести(ОбластьДетальньпсЗаписей, ВыборкаДетали.Уровень()); выполнить группировку строк в табличном документе. На скорость
КонецЦикла; вывода отчета такой вызов влиять не будет, поэтому оставим текст
конструктора без изменений.
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
После этого мы получаем выборку из результата запроса, которую
ТабДок.Вывести(ОбластьПодвал);
перебираем в цикле:

/Л}КОНСТРУКТОР_ВЬКОДНЫХ_ФОРМ
КонецПроцедуры
Результат = Запрос.Выполнить();

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


ПолеТабличногоДокумента с именем «ТабДок», который
Пока ВыборкаДетали.Следующий() Цикл
заполняется данными на основе макета, сформированного
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали)-
конструктором. ТабДок.Вывести(ОбластьДетальныхЗаписей)-КонецЦикла;

170 171
Использование основных объектов конфигурации Создание отчетов

В каждой итерации цикла мы заполняем параметры полученной


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

О
выборки результата запроса и выводим эту область в табличный тчет «Рейтинг услуг» будет содержать информацию о том,
документ. выполнение каких услуг принесло OOO «На все руки мастер»
В заключение процедуры, мы выводим в табличный документ наибольшую прибыль в указанном периоде. На примере
отчета «Рейтинг услуг» мы проиллюстрируем, как отбирать данные
завершающие области макета: в некотором периоде, как задавать параметры запроса и как
использовать в запросе данные из нескольких таблиц и включать в
результат запроса все данные одного из источников.
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы); Создадим новый объект конфигурации Отчет «РейтингУслуг».
ТабДок.Вывести(ОбластьПодвал); Перейдем на закладку «Макеты» и вызовем конструктор выходной
формы.
Выберем объектную (ссылочную) таблицу справочника
Теперь запустим 1С:Предприятие в режиме отладки и посмотрим «Номенклатура» и виртуальную таблицу регистра накопления
на результат работы нашего отчета: «Продажи.Обороты». Для того чтобы исключить неоднозначность
имен в запросе, переименуем таблицу «Номенклатура» в
«СпрНоменклатура» (контекстное меню правой кнопки мыши).
Затем установим курсор на таблицу «ПродажиОбороты» и вызовем
диалог ввода параметров виртуальной таблицы:

Откроем диалог ввода параметров


виртуальной таблицы

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


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

172 173
Использование основных объектов конфигурации Создание отчетов

Укажем, что начало и конец периода будут переданы в Единственное, что нам останется сделать, это сбросить флаг «Все»
соответствующих параметрах «ДатаНачала» и «ДатаОкончания» у таблицы регистра и установить его у таблицы справочника.
(символ «&» перед именем указывает, что это параметр запроса):
Будем выбирать все элементы из справочника
«Номенклатура»

Затем выберем из таблиц поля «СпрНоменклатура.Ссылка» и


«ПродажиОбороты.ВыручкаОборот»:
Установка флага «Все» у таблицы справочника будет означать, что
из справочника будут выбраны все элементы и этим элементам будет
j.. - СпрНоменклатура.Ссылка
!.. _ СпрНоменклатура.Представление
поставлено в соответствие значение оборота выручки из регистра.
'■. | ПродажиОборотыВыручкаОборот Таким образом, в результате запроса будут присутствовать все услуги,
и для некоторых из них будут указаны обороты выручки. Для тех
услуг, которые не оказывались в выбранном периоде, не будет указано
Перейдем на закладку «Связи» и увидим, что конструктор уже ничего.
создал связь между двумя выбранными таблицами - значение
Перейдем на закладку «Условия» и зададим условия выбора
изменения регистра «Номенклатура» должно быть равно ссылке на
элементов из справочника «Номенклатура». При задании условий
элемент справочника «Номенклатура».
выбора мы снова будем использовать параметры запроса. Первым
условием должно быть то, что выбранный элемент не является
группой (для этого следует переключиться в режим «Произвольное
условие»).
Вторым условием должно быть то, что выбранный элемент
является услугой (это - «Простое условие»):

174 175
Использование основных объектов конфигурации Создание отчетов

В дальнейшем, перед выполнением запроса, мы передадим в В этой процедуре, в той части, где выполняется установка
параметр «ВидНоменклатуры» - соответствующее значение параметров запроса, определим значение параметра
перечисления. «ВидНоменклатуры» (исправления выделены жирным шрифтом):
Перейдем на закладку «Объединения/Псевдонимы» и укажем, что
представление элемента справочника будет иметь псевдоним
Запрос.Текст =
«Услуга», а поле регистра будет иметь псевдоним «Выручка»: "ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Услуга,
| СпрНоменклатура.Представление КАК Представление,
| ПродажиОбороты.ВыручкаОборот КАК Выручка
|И3
| Справочник.Номенклатура КАК СпрНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи,Обороты(&ДатаНачала,
| &ДатаОкончания,,)
Перейдем на закладку «Порядок» и укажем, что результат запроса | КАК ПродажиОбороты
должен быть отсортирован по убыванию значения поля «Выручка». | ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка
На закладке «Итоги» определим, что нужно выводить общие итоги, ГДЕ
и они должны представлять собой сумму значений поля «Выручка»: | (СпрНоменклатура.ЭтоГруппа = Ложь) И
| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

|УПОРЯДОЧИТЬ ПО |
ВыручкаУБЫВ

|ИТОГИ СУММА(Выручка) ПО
| ОБЩИЕ";

На закладке «Отчет» сбросим флаг «Использовать построитель ЗапросУстановитьПараметрС'ВидНоменклатуры",


Перечисления.ВидыНоменклатуры.Услуга);
отчета». Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
Теперь перейдем на закладку «Выходная форма». Укажем, что Запрос.УстановитьПараметрС'ДатаОкончания", ДатаОкончания);
параметры «ДатаОкончания» и «ДатаНачала» будут редактироваться в
форме в полях ввода с типом «Дата». Для параметра
«ВидНоменклатуры» мы наоборот снимем признак редактирования в Теперь рассмотрим текст запроса, сформированный
конструктором:
форме:

Запрос.Текст =
"ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Услуга,
| СпрНоменклатура.Представление КАК Представление,
|ПродажиОбороты.ВыручкаОборот КАК Выручка
| Справочник.Номенклатура КАК СпрНоменклатура
Нажмем «ОК». Платформа сформирует макет и форму отчета ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,
Откроем модуль формы и найдем в нем процедуру «РейтингУслуг».

176 177
Использование основных объектов конфигурации Создание отчетов

| КАК ПродажиОбороты В описании первого источника и условия соединения нет для нас
| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка ничего нового, а вот при описании второго источника, используется
| возможность задания параметров виртуальной таблицы запроса:
|ГДЕ
| (СпрНоменклатура.ЭтоГруппа = Ложь) И
| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
| | РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания,,)
|УПОРЯДОЧИТЬ ПО
| ВыручкаУБЫВ
|
|ИТОГИ СУММА(Выручка) ПО Первым параметром передается начало периода расчета итогов,
| ОБЩИЕ"; вторым - конец периода. В результате исходная таблица будет
содержать только обороты, рассчитанные в переданном периоде. Здесь
всегда следует помнить, что если мы передаем в качестве этих
Сначала, как обычно, идет часть описания запроса и в ней есть параметров дату (а в нашем случае так и будет), то дата содержит и
новые для нас конструкции. время с точностью до секунды.
При описании источников запроса (после ключевого слова ИЗ), Если заранее известно, что пользователя не будут интересовать
использована возможность определения нескольких источников результаты работы отчета в периодах, указанных с точностью до
запроса: секунд, то следует учесть следующую особенность: по умолчанию
время в дате установлено в 00:00:00. Поэтому, если не предпринять
специальных мер, получится, что когда пользователь задаст период
|из отчета с 01.03.2004 по 31.03.2004, итоги регистра будут рассчитаны с
| Справочник.Номенклатура КАК СпрНоменклатура начала дня 01.03.2004 00:00:00 по начало дня 31.03.2004 00:00:00.
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала, Таким образом, данные за 31 число, отличные от начала дня, в расчет
| &ДатаОкончания,,)
| КАК ПродажиОбороты не войдут, что сильно удивит пользователя.
| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка
Для того чтобы исключить эту ситуацию, следует сделать две вещи.
Во-первых, в форме отчета ограничить пользователя в
В данном случае выбираются записи из двух источников: возможностях ввода даты начала и даты окончания, установив для
«СпрНоменклатура» и «ПродажиОбороты», причем ключевым соответствующих полей ввода состав даты как «Дата»:
предложением ЛЕВОЕ СОЕДИНЕНИЕ... ПО описан способ,
которым будут скомбинированы между собой записи этих двух
Определим состав даты...
источников.
ЛЕВОЕ СОЕДИНЕНИЕ означает, что в результат запроса надо
включить комбинации записей из обоих источников, которые
соответствуют указанному после ключевого слова ПО условию. Кроме
этого, в результат запроса надо включить еще и записи из первого
(указанного слева от слова СОЕДИНЕНИЕ) источника, для которых
не найдено соответствующих условию записей из второго источника.

178 179
Использование основных объектов конфигурации Создание отчетов

Во-вторых, при передаче параметров использовать встроенную Далее в запросе следует часть упорядочивания результатов, а за ней
функцию КонецДня(). Для этого вернемся в модуль формы отчета и - новая для нас часть, которая не встречалась ранее - описание итогов:
внесем необходимые изменения (добавления выделены жирным
шрифтом):
|ИТОГИ СУММА(Выручка) ПО
| ОБЩИЕ";
ПроцедураДействияФормыРейтингУслугСформировать(Кнопка)
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(РейтингУслуг)
//Данный фрагмент построен конструктором. // При повторном использовании
конструктора, // внесенные вручную изменения будут утеряны!!! Она всегда начинается с ключевого слова ИТОГИ, за которым
ТабДок = ЭлементыФормы.ТабличноеПоле; следует описание того, какие итоги будут присутствовать в результате
РейтингУслуг(ТабДок, Неопределено, ДатаНачала, КонецДня(ДатаОкончания)); запроса. Сразу после слова ИТОГИ описываются агрегатные функции,
которые необходимо рассчитывать в итогах. В нашем случае будет
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
КонецПроцедуры ___________________________________________________________
рассчитываться сумма по полю «Выручка». Затем следует ключевое
слово ПО, после которого описываются группировки, в которых
Продолжим рассматривать текст запроса. В части описания запроса должны быть рассчитаны итоги. В нашем случае они отсутствуют, и
есть еще одна новая для нас конструкция - задание условий отбора используется только ключевое слово ОБЩИЕ, которое указывает на
то, что итоги будут рассчитаны по всей таблице в целом.
данных из исходных таблиц:
Теперь, когда мы закончили знакомиться с текстом запроса,
запустим 1С:Предприятие в режиме отладки и посмотрим, как
работает наш отчет.
"ВЫБРАТЬ
| СпрНоменклатура.Ссылка КАК Услуга, Зададим период отчета с 01.03.2004 по 30.04.2004. Результат будет
| СпрНоменклатура.Представление КАК Представление, выглядеть следующим образом:
| ПродажиОбороты.ВыручкаОборот КАК Выручка
|ИЗ
| Справочник.Номенклатура КАК СпрНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,
| &ДатаОкончания,
| КАК ПродажиОбороты
| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссьшка

|ГДЕ
| СпрНоменклатура.ЭтоГруппа = Ложь И
| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
|

Условию отбора всегда предшествует ключевое слово ГДЕ. После


него описывается само условие. Обратите внимание, что поля
исходных таблиц, на которые накладывается условие, могут и не
входить в список выборки (как в нашем случае). Кроме того, в нашем
условии использован параметр запроса «ВидНоменклатуры».

180 181
Использование основных объектов конфигурации Создание отчетов

Теперь изменим дату окончания на 31.03.2004 и убедимся, что


данные за 31 марта попадают в отчет: Отчет ВыручкаМастеров

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

182 183
Использование основных объектов конфигурации Создание отчетов

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

ПродедураДействияФормыВыручкаМастеровСформировать(Кнопка)
//{{КОНСТРУКТОР_ВЫХОДНЬК_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
//(ВыручкаМастеров)
// Данный фрагмент построен конструктором. // При
повторном использовании конструктора, // внесенные
Теперь перейдем на закладку «Объединения/Псевдонимы» и вручную изменения будут утеряны!!!
зададим псевдоним «Выручка» для поля ТабДок = ЭлементыФормы.ТабличноеПоле; ВыручкаМастеров(ТабДок,
«ПродажиОбороты.ВыручкаОборот»: ДатаНачала, КонецДня(ДатаОкончанил));
//}}КОНСТРУКТОР_ВЬГХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
КонецПроцедуры

Теперь обратимся к процедуре «ВыручкаМастеров» и в первую


очередь рассмотрим текст запроса, сформированный конструктором:

На закладке «Порядок» определим, что результат запроса будет Запрос.Текст =


отсортирован по возрастанию значения поля «Период» и на закладке "ВЫБРАТЬ
«Итоги» зададим получение общих итогов и промежуточных итогов по | ПродажиОбороты.Мастер КАК Мастер,
| ПродажиОбороты.Мастер.Представление,
полям «Мастер» и «Период»: | ПродажиОбороты.Период КАК Период,
| ПродажиОбороты.Клиент,
| ПродажиОбороты.Клиент.Представление,
| ПродажиОбороты.ВыручкаОборот КАК Выручка
|ИЗ
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,)
КАК ПродажиОбороты

|УПОРЯДОЧИТЬ ПО
| Период
|

184 185
Использование основных объектов конфигурации Создание отчетов

ИТОГИ СУММА(Выручка) Теперь, чтобы наглядно продемонстрировать смысл наших


ПО | ОБЩИЕ, дальнейших действий, запустите 1С:Предприятие в режиме отладки и
| Мастер, | посмотрите на результат работы отчета «Выручка мастеров» за период
Период"; c01.03.2004no30.04.2004:

В части описания запроса обратите внимание, что у источника


данных кроме задания начала и окончания периода расчета итогов
задана периодичность выбираемых данных - «День»:

|из
| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,)
| КАК ПродажиОбороты ,

Именно благодаря этому у нас появляется возможность описать


среди выбранных полей поле «Период».
Далее в тексте запроса следует известная нам часть
упорядочивания результатов, и в следующей части - описание итогов
- мы видим новые для нас строки: Если вы помните, в начале раздела мы говорили, что этот отчет
должен показывать данные с детализацией по всем дням в выбранном
периоде. У нас же отображаются только те дни, для которых
|ИТОГИ СУММА(Выручка) ПО существуют ненулевые записи в таблице регистра накопления.
I ОБЩИЕ, | Мастер, | Поэтому сейчас мы займемся тем, что изменим текст программы таким
Период";
образом, чтобы в отчет попадала каждая дата из указанного периода.
Вернемся к модулю отчета «ВыручкаМастеров» и в части описания
итогов запроса уточним, каким образом должны рассчитываться итоги
Помимо общих итогов, в нашем запросе будут рассчитаны по полю «Период»:
промежуточные итоги по полям «Мастер» и «Период».

Запрос.Текст =
"ВЫБРАТЬ
|ПродажиОбороты.Мастер КАК Мастер,
|ПродажиОбороты.Мастер.Представление,
|ПродажиОбороты.ПериодКАКПериод,
|ПродажиОбороты.Клиент,
|ПродажиОбороты.Клиент.Представление,
|ПродажиОбороты.ВыручкаОборот КАК Выручка

186 187
Использование основных объектов конфигурации Создание отчетов

1ИЗ Смысл внесенных нами уточнений заключается в том, что теперь


I РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,) при формировании выборки по группировке «Период» будут
I КАК ПродажиОбороты выбираться все имеющиеся значения группировок.
I Запустим 1С:Предприятие в режиме отладки и выполним отчет
!УПОРЯДОЧИТЬ ПО «ВыручкаМастеров» за период с 20.03.2004 по 20.04.2004.
I Период
I В целях экономии неинформативного пространства книги, мы не
!ИТОГИ СУММА(Выручка) ПО будем приводить результат работы отчета, но на словах объясним, что
I ОБЩИЕ, результат отчета будет содержать по 32 строки дат для каждого
I Мастер, сотрудника.
I Период ПЕРИОДАМЩДень, &ДатаНачала, &ДатаОкончания)";
Очевидно, что такой внешний вид отчета абсолютно
«нечитабелен», поэтому мы снова вернемся к модулю отчета и внесем
Такая запись говорит о том, что итоги должны быть, рассчитаны небольшие уточнения в алгоритм вывода областей табличного
периодами равными дню, в интервале дат, задаваемом параметрами документа:
«ДатаНачала» и «ДатаОкончания».
И для того, чтобы все эти итоги попали в итоговый табличный
документ, нам нужно будет уточнить порядок вывода итогов в Пока ВыборкаМастер.Следующий() Цикл
ОбластьМаетер.Параметры.ЗаполнитыЗыборкаМастер);
выборке результата запроса: ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());

ВыборкаПериод = ВыборкаМастер
.Bыбрать(ОбходРезультата3anpoca.ПоГруппировкам,
ВыборкаМастер = ВыборкаОбщийИтог
"Период", "Bce");
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПериод.Следующий() Цикл
Пока ВыборкаМастер.Следующий() Цикл ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ОбластьМастер.Параметры.Заполнить(ВыборкаМастер);
ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень(),, Ложь);
ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());
ВыборкаДетали = ВыборкаПериод.Выбрать();
ВыборкаПериод = ВыборкаМастер Пока ВыборкаДетали.Следующий() Цикл
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
"Пернод","Все"); ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Ложь);
КонецЦикла; КонецЦикла; КонецЦикла;
Пока ВыборкаПериод.Следующий() Цикл
ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ТабДок.Вьщесп(ОбластьПериодВыборкаПериод.Уровень());
Смысл внесенных нами изменений заключается в том, что при
ВыборкаДетали = ВыборкаПериод.Выбрать();
выводе областей детальных записей и периода, мы сворачиваем
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
группировки, которые по умолчанию выводятся развернутыми.
ТабДок.Вьтести(ОбластьДетальныхЗаписей,ВыборкаДетали.Уровень()); Запустим 1С:Предприятие в режиме отладки и снова выполним
КонецЦикла; КонецЦикла; КонецЦикла; отчет «ВыручкаМастеров» за период с 20.03.2004 по 20.04.2004.

188 189
Использование основных объектов конфигурации Создание отчетов

На этот раз результат выглядит гораздо лучше:


Отчет ПереченьУслуг

О
тчет «Перечень услуг» будет содержать информацию о том,
какие услуги и по какой цене оказывает OOO «На все руки
мастер». На его примере мы познакомимся с возможностью
получения последних значений из периодического регистра сведений и
вывода иерархических справочников.
Создадим новый объект конфигурации Отчет «ПереченьУслуг».
Перейдем на закладку «Макеты» и вызовем конструктов выходной
формы.
Выберем объектную (ссылочную) таблицу справочника
«Номенклатура» и виртуальную таблицу регистра сведений
«Цены.СрезПоследних». Для того чтобы исключить неоднозначность
имен в запросе, переименуем таблицу «Номенклатура» в
«СпрНоменклатура».
Итак, на примере этого отчета мы продемонстрировали, как
Вызовем диалог ввода параметров виртуальной таблицы
строить многоуровневые группировки в запросе, как обходить все
«ЦеныСрезПоследних» и укажем, что период будет передан в
даты в выбранном периоде и как управлять состоянием группировок в
параметре «ДатаОтчета». Затем выберем из таблиц следующие поля:
табличном документе.
• «СпрНоменклатура.Родитель»,
• «СпрНоменклатура.Ссылка»,
• «ЦеныСрезПоследних.Цена»:

Перейдем на закладку «Связи» и сбросим флаг «Все» у таблицы


регистра и установим его у таблицы справочника.

190 191
Использование основных объектов конфигурации Создание отчете

На закладке «Условия» зададим условие выбора элементов Откроем модуль формы и в процедуре «ПереченьУслуг»
справочника «Номенклатура» - выбираемые элементы должны определим значение параметра запроса:
соответствовать виду номенклатуры переданному в параметре запроса
«ВидНоменклатуры»:
Запрос.УстановитьПараметрС'ВидНоменклатуры",
Перечисления.ВидыНоменклатуры.Услуга)
Запрос.УстановитьПараметр("ДатаОтчета".ДатаОтчета);

Теперь рассмотрим текст запроса, сформированный


На закладке «ОбъединенияЛЛсевдонимы» укажем, что поле конструктором:
«Родитель» будет иметь псевдоним «ГруппаУслуг», а поле «Ссылка» -
«Услуга»:
Запрос.Текст =
"ВЫБРАТЬ
| СпрНоменклатура.Родитеяь КАК ГруппаУслуг,
| СпрНоменклатура.Родитель.Представление,
I СпрНоменклатура.Ссылка КАК Услуга,
I СпрНоменклатура.Представление,
I ЦеныСрезПоследних.Цена
|ИЗ
I Справочник.Номенклатура КАК СпрНоменклатура
Перейдем на закладку «Итоги» и укажем, что группировка будет I ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&ДатаОтчета,)
| КАК ЦеныСрезПоследних
производиться по полю «ГруппаУслуг» с типом итогов «Элементы и | ПО ЦеныСрезПоследних.Номенклатура = СпрНоменклатура.Ссылка
иерархия», а значения суммируемых полей задавать не станем:
|ГДЕ
I СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
|
|ИТОГИ ПО
| ГруппаУслугИЕРАРХИЯ";

На закладке «Отчет» сбросим флаг «Использовать построитель


отчета». Практически все конструкции, использованные в этом запросе, нам
На закладке «Выходная форма» отметим, что тип параметра уже известны, за исключением ключевого слова ИЕРАРХИЯ,
«ДатаОтчета» будет Дата, а параметр «ВидНоменклатуры» в форме использованного в части описания итогов. Это ключевое слово
редактироваться не будет. Нажмем «ОК». позволяет рассчитывать итоги по иерархии справочника, однако
поскольку в нашем случае какие либо итоги в отчете не нужны, мы
использовали эту возможность для создания группировок по иерархии
справочника «Номенклатура».
Теперь запустим 1С:Предприятие в режиме отладки и, прежде
всего, откроем периодический регистр «Цены».

192 193
Использование основных объектов конфигурации Создание отчетов

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

Теперь выполним отчет «Перечень услуг» по состоянию на


31.03.2004:

Как видите, показана новая цена услуги «Диагностика» - 350 руб.


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

Наш отчет правильно отражает цену услуги «Диагностика» на


31.04-200py6.

194
195
Использование основных объектов конфигурации Создание отчетов

Как правило, в качестве точек используются моменты или объекты,


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

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

Диаграмма

Д иаграмма является элементом управления, предназначенным для


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

Значение серии в
точке
Область
легенды

Серия

Диаграмма может быть вставлена в форму либо в табличный


Документ. Заполнение диаграммы данными возможно двумя
способами.
Во-первых, можно заполнить диаграмму данными автоматически.
Для этого используется свойство диаграммы ИсточникДанных. В
качестве источника данных диаграммы может выступать область
табличного документа (если диаграмма вставлена в табличный
Точка Документ), либо таблица значений. Общее требование к источнику
Данных - он должен поставлять диаграмме (кроме самих данных)

196 197
Использование основных объектов конфигурации Создание отчетов

имена точек и серий. В случае с областью табличного документа Затем разместим под ним диаграмму с именем «Диаграмма».
имена точек и серий будут браться из верхней строки и левого столбца Изменим размеры областей диаграммы, и зададим текст области
области; в случае с таблицей значений - из заголовков колонок и заголовка - «Рейтинг клиентов»:
первой колонки.
Во-вторых, диаграмма может быть заполнена данными «вручную».
Для этого нужно создать в диаграмме несколько серий и точек, а
затем, используя метод УстановитьЗначение(), задать нужные
значения для каждой пары серия - точка.
Следует отметить, что эти два способа заполнения диаграммы не
могут комбинироваться.
В следующем примере мы будем использовать диаграмму,
расположенную в форме и заполнять ее данными «вручную»,
используя метод УстановитьЗначение().

Создание отчета РейтингКлиентов

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

Процедура Сформировать()
Запрос = Новый Запрос;
Запрос.Текст =

КонецПроцедуры

Установим курсор в предпоследней строке, перед точкой с запятой


и вызовем конструктор запроса (Текст | Конструктор запроса...).
Выберем виртуальную таблицу регистра накопления
«Продажи.Обороты» и из нее одно поле
«ПродажиОбороты.Клиент.Представление».

198 199
Использование основных объектов конфигурации
Создание отчетов

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

Процедура Сформировать()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПродажиОбороты.Клиент.Представление КАК Клиент, |
ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот |
КАК Доход |ИЗ| РегистрНакопления.Продажи.Обороты КАК
ПродажиОбороты
|УПОРЯДОЧИТЬ ПО
| ДоходУБЫВ";
КонецПроцедуры

По сравнению с предыдущими отчетами, текст запроса довольно


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

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


ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот
КАК Доход

Теперь обработаем результат запроса таким образом, чтобы данные


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

Процедура Сформировать()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПродажиОбороты.Клиент.Представление КАК Клиент, |
ПродажиОбороты.ВыручкаОборот — ПродажиОбороты.СтоимостьОборот |
КАК Доход |ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

200
201
Создание отчетов
Использование основных объектов конфигурации

«АвтоТранспонирование» для того, чтобы различные типы диаграмм,


!УПОРЯДОЧИТЬ ПО I которые будут выбраны в поле выбора, отображались правильно.
ДоходУБЫВ";
ВыборкаРеэультатаЗапроса = Запрос.Выполнить().Выбрать();
<#" Узнай больше!
Диаграмма = ЭлементыФормы.Диаграмма; //запретить Следует сделать несколько замечаний no оптимизации заполнения
обновление и автотранспонирование диаграммы диаграммы данными.
Диаграмма.Обновление = Ложь;
Диаграмма.АвтоТранспонирование = Ложь;
Во-первых, перед началом заполнения диаграммы данными следует
отключать обновление диаграммы (свойство диаграммы
//создать единственную точку диаграммы ТочкаДиаграммы = «Обновление»). Это значительно ускорит процесс заполнения,
Диаграмма.УстановитьТочку("Доход");
поскольку при включенном обновлении диаграмма будет выполнять
//перебрать выборку результата запроса и создать серии пересчет и отрисовку автоматически. После того, как диаграмма
// и значения будет заполнена данными, обновление диаграммы нужно снова
Пока ВыборкаРезультатаЗапроса.СледующнйО Цикл включить.
ТекущаяСерияДиаграммы = Диаграмма
.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);
Во-вторых, перед началом заполнения диаграммы данными
Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы, следует также отключать автотранспонирование диаграммы
ВыборкаРезультатаЗапроса.Доход); (свойство диаграммы «АвтоТранспонирование»).
КонецЦикла; Автотранспонирование позволяет диаграмме анализировать данные и
выбирать наиболее подходящее представление в зависимости от
//разрешить обновление и автотранспонирование диаграммы
Диаграмма.Обновление = Истина; заданного типа диаграммы. Например, круговая диаграмма
Диаграмма.АвтоТранспонирование = Истина; отображает значения нескольких серий в одной точке, а обычный
график - как раз наоборот - значения одной серии в нескольких
точках. Обратите внимание, что автотранспонирование диаграммы
доступно только в режиме «ручного» заполнения данными. При
Сначала, с помощью метода Выполнить() мы получаем результат использовании источника данных это свойство недоступно. После
запроса. Затем методом Выбрать() получаем выборку записей из того, как ди а г р а м м а будет заполнена данными,
результата запроса в переменной «ВыборкаРезультатаЗапроса». автотранспонирование диаграммы можно снова включить, если в
Перед началом заполнения мы отключаем обновление и этом есть необходимость.
автотранспонирование диаграммы для того, чтобы заполнение
данными выполнялось быстрее. Теперь создадим обработчик события формы «ПриОткрытии», и
После этого добавляем в диаграмму единственную точку. добавим в него установку значения поля выбора и типа диаграммы, и
Затем мы организуем цикл по выборке из результата запроса и в вызов нашей процедуры «Сформировать»:
цикле добавляем серии в нашу диаграмму. Каждому клиенту будет
соответствовать своя серия. После этого мы устанавливаем значение Процедура ПриОткрытии() //
точки, передавая методу УстановитьЗначение() точку, серию, для Заполним список поля выбора
которой устанавливается значение в этой точке, и само значение. ПолеВыбора = ТипДиаграммы. Гистограмма;
После заполнения диаграммы данными мы включаем свойство ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;
«Обновление», чтобы новое состояние диаграммы было отображено, и
Сформировать();
КонецПроцедуры

203
202
Использование основных объектов конфигурации Создание отчетов

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

СписокВыбора = ЭлементыФормы.ПолеВыбора.СписокВыбора;

СписокВыбора.Добавить(ТипДиаграммы.График, "График");
СписокВыбора.Добавить(ТипДиаграммы.Гистограмма, "Гистограмма");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаОбъемная, "Гистограмма 3D");
СписокВыбора.Добавитъ(ТипДиаграммы.ГистограммаГоризонтальная,
"Гистограмма горизонтальная");
СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальнаяОбъемная,
"Гистограмма горизонтальная 3D");
СписокВыбора.Добавить(ТипДиаграммы.Круговая, "Круговая");
СписокВыбора.Добавить(ТипДиаграммы.КруговаяОбъемная,"Круговая объемная");
СписокВыбора.Добавить(ТипДиаграммы.Изометрическая," Изометрическая");
СгшсокВыбора.Добавить(ТипДиаграммы.ИзометрическаяНепрерывная,
"Изометрическая непрерывная");
СписокВыбора.ДобавитьСГипДиаграммы.ИзометрическаяЛента,
"Изометрическая лента");
СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяПирамида,
"Изометрическая пирамида");
Теперь изменим тип диаграммы на «Круговая объемная>:

И в заключение, создадим обработчик события поля выбора «При


изменении», и выполним в нем установку типа диаграммы:

ПроцедураПолеВыбораПриИзмененииЭлемент)
ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;
КонецПроцедуры ______________________________________

Только что мы рассмотрели с вами общий случай заполнения


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

204 205
Использование основных объектов конфигурации
т Создание отчетов

заполнения диаграммы данными, используя свойство диаграммы -


«ИсточникДанных». «вручную» (используя
обрабатывать транспонирование диаграммы
Вернемся в модуль формы отчета «РейтингКлиентов» и все строки, свойство СерииВСтроках).
которыми мы добавляли в диаграмму данные:
Таким образом, на примере этого отчета мы продемонстрировали
как создавать запросы, используя конструктор запросов, и как
использовать диаграмму для визуализации результата запроса.
ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

Диаграмма = ЭлементыФормы.Диаграмма;
//запретить автотранспонирование диаграммы
Диаграмма.АвтоТранспонирование = Ложь;

//создать единственную точку диаграммы ТочкаДиаграммы =


Диаграмма.УетановитьТочку("Доход");

//перебрать выборку результата запроса и создать серии и значения


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

//разрешить автотранспонирование диаграммы


Диаграмма.АвтоТранспонирование = Истина;

заменим одной строкой:

ЭлементыФормы.Диаграмма.ИсточникДанных = Запрос,Выполнить().Выгрузить();

Дело в том, что метод Выгрузить() по умолчанию выгружает


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

206
207
Использование основных объектов конфигурации Создание отчетов

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

Формировать параметры настройки на основании текста запроса


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

208
209
Использование основных объектов конфигурации Создание отчетов

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

М
метода ЗаполнитьНастройки() следующим образом:
ы с вами рассмотрим один из вариантов использования
• полями, доступными для выбора в качестве полей отбора, построителя отчета, в котором результаты отчета будут
порядка или вывода в отчет (свойство «ДоступныеПоля»), выводиться в сводную таблицу.
становятся все поля из списка выборки и все их подчиненные Создадим в конфигураторе новый объект
конфигурации Отчет «Универсальный». Этот отчет будет иметь
поля,
реквизит «ПостроительОтчета», с типом ПостроительОтчета.
• в список полей, выбранных для вывода в отчет (свойство
«ВыбранныеПоля»), добавляются все поля из списка выборки, В модуле отчета создадим текст запроса для построителя отчета.
Для этого вставим в модуль следующие строки:
• полями, доступными для выбора в качестве измерений,
становятся все поля из предложения ИТОГИ ПО и все их
ПостроительОтчета.Текст =
подчиненные поля, ;
• в список измерений по строкам (свойство
«ИзмеренияСтроки») добавляются все поля из предложения
ИТОГИПО, Установим курсор перед символом точки с запятой и вызовем
• в доступные отборы (свойство «Отбор») добавляются конструктор запросов (Текст | Конструктор запроса...).
параметры виртуальных таблиц. В качестве таблицы выберем виртуальную таблицу регистра
накопления «Продажи.Обороты». Из этой таблицы выберем все поля:
Вторым способом формирования параметров настроек построителя
отчета является выделение их в тексте запроса. Для этого
используются фигурные скобки «{}». Фигурными скобками могут
быть выделены параметры построителя отчета, а также некоторые
синтаксические конструкции:
• ВЫБРАТЬ ... - описывает поля, которые пользователь сможет
выбирать для вывода,
• ГДЕ ... - описывает поля, на которые пользователь может
накладывать ограничения,
• УПОРЯДОЧИТЬПО ... - описывает поля для обозначения Ha закладке «Итоги» укажем получение общих итогов и выберем
все ресурсы регистра:
порядка,
• ИТОГИ ПО ... - описывает поля, по которым будут
выводиться итоговые значения.
После того, как значения параметров указаны, вывод результатов
запроса возможен как принудительно (используя методы Выполнить()
и Вывести()), либо автоматически, если результаты выводятся в
сводную таблицу.

210 211
Использование основных объектов конфигурации Создание отчетов

Нажмем «OK». B модуле отчета появится текст сформированного Теперь создадим форму отчета и расположим на ней поле
запроса: табличного документа (Форма | Вставить элемент управления I
Поле табличного документа) с именем
ПостроительОтчета.Текст =
«ПолеТабличногоДокумента»:
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.Номенклатура.Представление, Расположим в форме поле табличного документа
| ПродажиОбороты.Клиент,
| ПродажиОбороты.Клиент.Представление,
| ПродажиОбороты.Мастер,
| ПродажиОбороты.Мастер.Представление,
| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
| ПродажиОбороты.ВыручкаОборот КАК ВыручкаОборот,
| ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
|
|ИТОГИ СУММАСКоличествоОборот), СУММА(ВыручкаОборот),
| СУММА(СтоимостьОборот)
| ПООБЩИЕ";

Добавим в текст запроса указания для построителя отчетов:

ПостроительОтчета.Текст =
"ВЫБРАТЬ
| ПродажиОбороты.Номенклатура,
| ПродажиОбороты.Номенклатура.Представление,
| ПродажиОбороты.Клиент,
| ПродажиОбороты.Клиент.Представление, Затем установим курсор в верхнюю левую ячейку поля табличного
| ПродажиОбороты.Мастер, документа и выполним
| ПродажиОбороты.Мастер.Представление,
| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
Таблица | Встроенные таблицы | Вставить сводную таблицу.
| ПродажиОбороты.ВыручкаОборот КАК ВыручкаОборот, После этого создадим обработчик события формы отчета «При
| ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот открытии», и добавим в него следующий текст:
|ИЗ
| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
Процедура ПриОткрытии() СводнаяТаблица =
|{ИТОГИ ПО Номенклатура, Клиент, Мастер} ЭлементыФормы.ПолеТабличногоДокумеита
■ВстроенныеТаблицы.СводнаяТаблица1,'
|ИТОГИ СУММАСКоличествоОборот), СУММА(ВыручкаОборот), СводнаяТаблица.ИсточникДанных = ПостроительОтчета;
| СУММА(СтоимостьОборот) КонецПроцедуры
| ПООБЩИЕ";
Этим текстом мы устанавливаем сводной таблице в качестве
источника данных построитель отчета.

212 213
Использование основных объектов конфигурации Создание отчетов

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

Таким образом, используя построитель отчета, мы предоставили


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

214 215
Использование основных объектов конфигурации Создание отчетов

«ТабличноеПолеПоля» (соответственно «КоманднаяПанельПорядок»


Отчет Универсальный2 и «ТабличноеПолеПорядок»):

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


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

формирования макетов на основе вариантов стандартного оформления.


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

Под каждым текстовым полем расположим командную панель и


табличное поле с именами «КоманднаяПанельПоля» и

216 217
Использование основных объектов конфигурации Создание отчетов

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

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


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

*" Узнай больше!


О связи элементов управления и данных, можно прочитать в
разделе «Данные и элементы управления» на странице 502

218 219
Использование основных объектов конфигурации Создание отчетов

Теперь в нижней части формы разместим еще одну надпись с | РегистрНакопления.Продажи КАК Продажи
именем «Оформление» и заголовком «Оформление:», а под ним поле |
|{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}
выбора с именем «ПолеВыбораОформление»: |
|ИТОГИ СУММА(Количество),
| Сумма(Выручка),
| Сумма(Стоимость)
| ПО ОБЩИЕ";

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


«Продажи», в котором расположены управляющие конструкции для
построителя отчета.
Конструкция ВЫБРАТЬ позволяет предоставить пользователю
возможность выбирать в качестве полей запроса как сами исходные
поля запроса, так и все поля «через точку» от данных полей.
Конструкция УПОРЯДОЧИТЬ ПО предоставляет пользователю
возможность упорядочивать строки результата запроса.
Теперь, для того, чтобы привести состав полей в «исходное»
состояние, добавим команду очистки выбранных полей построителя
отчета, и затем в обработчик «КнопкаСформироватьНажатие» вставим
Теперь откроем модуль формы и добавим в него текст запроса для команды выполнения построителя отчета:
построителя отчета:
ПроцедураКнопкаСформироватьНажатие(Элемент)
ПроцедураКнопкаСформироватьНажатие(Элемент) ПостроительОтчета.МакетОформления =
ПолучитьМакетОформления(ПолеВыбораОформление);
КонецПроцедуры
ПостронтельОтчета.Выполнить();
ПостроительОтчета.Текст = ПостроительОтчета.Вывести();
"ВЫБРАТЬ КонецПроцедуры
| Продажи.Номенклатура КАК Номенклатура,
| Продажн.Клиент КАК Клиеит, ПостроительОтчета.Текст =
| Продажи.Мастер КАК Мастер, "ВЫБРАТЬ
| Продажи.Количество КАК Количества, | Продажи.Номенклатура КАК Номенклатура,
| Продажи.Выручка КАК Выручка, | Продажи.Клиент КАК Клиент,
| Продажи.Стоимость КАК Стоимость | Продажи.Мастер КАК Мастер,
| Продажи.Количество КАК Количество,
|{ВЫБРАТЬ | Продажи.Выручка КАК Выручка,
| Номенклатура.*, | Продажи.Стоимость КАК Стоимость
| Клиент.*, |{ВЫБРАТЬ
| Мастер.*, | Номенклатура.*,
| Количество.*, | Клиент.*,
| Выручка.*, | Мастер.*,
| Стоимость.*} | Количество.*,
|ИЗ | Выручка.*,

220 221
Использование основных объектов конфигурации Создание отчетов

| Продажи.Мастер КАК Мастер,


I Стоимость.*}
| Продажи.Количество КАК Количество,
1ИЗ
| Продажи.Выручка КАК Выручка,
I РегистрНакопления.Продажи КАК Продажи | Продажи.Стоимость КАК Стоимость
I !{ВЫБРАТЬ
!{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*} | Номенклатура.*,
I | Клиент.*,
1ИТОГИ СУММА(Количество), | Мастер.*,
I Сумма(Выручка), I Количество.*,
I Сумма(Стоимость) I Выручка.*,
I ПО ОБЩИЕ"; | Стоимость.*}
| ИЗ
ПостроительОтчета.ВыбранныеПоля.Очистить(): I РегистрНакопления.Продажи КАК Продажи
I
Если построителю отчета не указывать объект, в который |{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}
необходимо выводить результат, то результат будет выведен в новый I
ИТОГИ СУММА(Количество),
табличный документ. Построитель отчета имеет возможность I Сумма(Выручка),
оформить макет результата, используя варианты стандартного I Сумма(Стоимость)
оформления макетов. Для этого мы в начале процедуры получаем I ПООБЩИЕ";
стандартный макет оформления, используя значение, которое будет
ПостроительОтчета.ВыбранныеПоля.Очистить();
выбрано пользователем в поле выбора, а затем на основе этого макета
оформляем макет, созданный построителем отчета по умолчанию. СписокВыбора = ЭлементыФормы.ПолеВыбораОформление.СписокВыбора;
Здесь следует сказать о том, что построитель отчета предоставляет
возможность полностью формировать макет будущего отчета, как СписокВыбора.Добавить(СтандартноеОформление.БезОформления,
задавая его целиком (свойство «Макет»), так и путем описания "БезОформления");
СписокВыбора.Добавить(СтандартноеОформление.Апельсин, "Апельсин");
отдельных областей макета (свойства «МакетДетальныхЗаписей», СпнсокВыбора.Добавить(СтандартноеОформление.Асфальт, "Асфальт");
«МакетЗаголовка» и т.д.). СписокВыбора.Добавить(СтандартноеОформление.Бирюза, "Бирюза");
СписокВыбора.Добавить(СтандаргноеОформление.Текстиль, "Текстиль");
Теперь, для завершения нашего универсального отчета следует
заполнить список выбора поля выбора «ПолеВыбораОформление» и ПолеВыбораОформление = СтаидартноеОформление.БезОформлевия;
установить начальное значение поля:
Запустим 1С:Предприятие в режиме отладки и откроем отчет
ПроцедураКношсаСформироватьНажатие(Элемент)
«Универсальный2».
ПостроительОтчета.МакетОформления = Выберем поля: «Мастер», «Номенклатура.ВидНоменклатуры»,
ПолучитьМакетОформления(ПолеВыбораОформление); «Номенклатура» и «Выручка». Зададим следующий порядок
Построительотчета.ОформитьМакет();
сортировки:
ПостроительОтчета.Вышшшть();
ПостроительОтчета.Вывести(); • «Мастер» по возрастанию,
КонецПроцедуры • «Номенклатура.ВидНоменклатуры» по убыванию,
ПостроитедьОтчета.Текст =
• «Номенклатура» по возрастанию.
"ВЫБРАТЬ
I Продажи.Номенклатура КАК Номенклатура,
I Продажи.Клиент КАК Клиент, _______________________________________________

222 223
Использование основных объектов конфигурации Создание отчетов

Выберем оформление «Апельсин» и нажмем «Сформировать»


Результат будет выглядеть следующим образом: Использование построителя отчета в

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

Отчет УниверсальныйЗ

Теперь изменим условия формирования отчета. Выберем поля


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

Таким образом, на примере этого отчета вы познакомились с


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

224 225
Использование основных объектов конфигурации Создание отчето!

представления (например, для табличного документа - размещение Запустим 1С:Предприятие в режиме отладки, откроем отчет
группировок, реквизитов, итогов, наличие группировок и т.д.). «УниверсальныйЗ», нажмем кнопку «Настройка...» и установим
В нашем случае согласимся с параметрами, которые конструктор параметры выбранных полей и порядка такими же, как в последнем
предложил по умолчанию, единственное, что мы изменим - вариант примере с отчетом «Универсальный2»:
стандартного оформления установим «Асфальт».
Перейдем на закладку «Выходная форма» и откроем закладку: • выбранные поля: «Клиент», «Номенклатура»
«ВыручкаОборот»,
«Форма настройки построителя отчета»: • порядок: «Клиент» по возрастанию:

Дело в том, что кроме самой формы отчета, на которой будет


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

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

226 227
Использование основных объектов конфигурации Создание отчетов

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

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


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

228 229
Оптимизация процедуры проведения документа ОказаниеУслз

Глава 6. Оптимизация процедуры Особенности использования ссылочных


проведения документа ОказаниеУслуги данных
После изучения предыдущей главы вы уже достаточно хорошо
знакомы с языком запросов, и мы наконец-то можем приступить к
одной из самых важных глав нашей книги - к оптимизации документа
«ОказаниеУслуги», и в частности, к полному изменению его
Т ермином «ссылочные данные» мы будем обозначать данные,
хранящиеся в базе данных, доступ к которым возможен при
помощи объектов встроенного языка вида Ссылка:
СправочникСсылка^имя>, ДокументСсылка.<имя> и т.д. Для
того чтобы дальнейшее изложение было более понятным, мы
обработчика события «ОбработкаПроведения».
«Зачем это нужно?» - можете спросить вы. Тому есть две причины. Во- построим объяснение на примере получения ссылки на вид
номенклатуры при проведении документа «ОказаниеУслуги».
первых, руководство OOO «На все руки мастер» решило,
Не все данные, хранящиеся в базе данных, являются ссылочными.
наконец-то, завершить «эксперименты» по вводу стоимости Это связано с тем, что в модели данных 1С:Предприятия 8.0
расходуемых материалов руками и перейти на автоматический расчет существует деление на данные, представляющие объектные сущности
стоимости расходуемых материалов «по среднему». (справочники, планы счетов, документы и т.д.), и данные,
Во-вторых, в обработчике события «Обработка проведения» мы представляющие необъектные сущности (регистры сведений,
используем обращение к реквизиту «ВидНоменклатуры» справочника регистры накопления и т.д.).
«Номенклатура» «через точку». Такое обращение может сильно С точки зрения системы, некоторая совокупность объектных
замедлить скорость выполнения процедуры при больших объемах данных определяется не только значениями своих полей, но и самим
табличной части документа. фактом своего существования. Другими словами, удалив из базы
Поэтому, изменения, вносимые нами в документ некоторую совокупность объектных данных, мы не сможем вернуть
«ОказаниеУслуги», будут преследовать две цели: систему в то же состояние, которое было до удаления. Даже если мы
заново создадим ту же самую совокупность объектных данных с теми
• определение стоимости расходуемых материалов при же самыми значениями полей, с точки зрения системы это будет
проведении документа, ДРУГАЯ совокупность объектных данных. Каждую такую
• повышение скорости выполнения процедуры. совокупность объектных данных, уникальную с точки зрения системы,
называют объектом базы данных. Для того чтобы система могла
Прежде, чем мы приступим непосредственно к каким-либо
отличить один объект базы данных от другого, каждый объект базы
действиям, следует сказать несколько слов об особенностях хранения
данных (совокупность объектных данных) имеет внутренний
и использования ссылочных данных в системе 1С:Предприятие 8.0.
идентификатор. Различные объекты базы данных всегда будут иметь
различные внутренние идентификаторы. Этот идентификатор хранится
вместе с остальными данными объекта в специальном поле «Ссылка».
Необъектные данные хранятся в виде записей, и с точки зрения
системы определяются исключительно значениями своих полей.
Таким образом, удалив некоторую запись и записав после этого новую,
с
точно такими же значениями всех полей, мы получим то же самое
состояние базы данных, которое было до удаления.
Таким образом, поскольку мы можем однозначно указать на
каждый объект базы данных, у нас появляется возможность хранить
232
233
Оптимизация процедуры проведения документа ОказаниеУ сл\
Исполь зование основных объектов конфигурации

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

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


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

Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры о
Когда в обработчике события «ОбработкаПроведения» документа ________________________
«ОказаниеУслуги» мы присваиваем з^начение реквизита ________________________
«Номенклатура» табличной части какой-либо переменной, мы имеем ________________________ Перечисления.ВидыНоменклатуры.Материал
дело с объектом ДокументОбъект.ОказаниеУслуги. Этот объект Toгда
содержит в себе значения всех реквизитов документа и реквизитов его
табличных частей. Поэтому обращение:

Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;

234 235
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации

Как несложно догадаться, подобное обращение к базе данных


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

*■ Узнай больше!
Более подробно об устройстве кэша объектов можно прочитать
в главе «Кэш объектов» на странице 554.

Из всего вышесказанного можно сделать следующий вывод: если


алгоритм проведения документа использует только те данные, которые
присутствуют в реквизитах документа (и его табличных частей),
вполне достаточно использовать конструктор движений документа
(как это было у нас в случае с документом «ПриходнаяНакладная»).
Если же в алгоритме проведения требуется анализировать
дополнительные реквизиты объектов, ссылки на которые содержатся в
документе, а также использовать результаты расчета итогов регистров,
- следует использовать запросы для более быстрой выборки данных из
базы данных.
To же самое справедливо в отношении выполнения любых
участков программы, критичных по производительности. Механизм
запросов лучше «читает» информационную базу и может за один раз
выбрать все необходимые данные, поэтому, например, в типовых
Поскольку в объекте ДокументОбъект.ОказаниеУслуги есть
решениях вы практически не увидите использования объекта
только ссылка на элемент справочника «Номенклатура» и больше СправочникВыборка^имя>.
никаких данных об этом элементе нет, система возьмет эту ссылку и
обратится по ней в кэш объектов, в надежде найти там данные того
объекта, ссылка на который у нее есть. Если кэш объектов не будет
иметь нужных данных, он обратится к базе данных с тем, чтобы
прочитать все данные объекта, ссылкой на который он обладает. После
того, как все данные, хранящиеся в реквизитах нужного элемента
справочника и в реквизитах его табличных частей, будут считаны в
кэш объектов, кэш объектов вернет запрашиваемую ссылку,
хранящуюся в реквизите «ВидНоменклатуры» справочника
«Номенклатура».

237
236
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

Эти поля будут нужны нам для задания значений измерений


Оптимизация документа ОказаниеУслуги регистров и их ресурсов. Кроме того, поле «ВидНоменклатуры»

П
ервое, что мы сделаем для оптимизации документа понадобится нам для анализа того, чем является номенклатура,
«ОказаниеУслуги» - удалим реквизит табличной части указанная в документе: материалом или услугой:
«Стоимость», который нам не понадобится в будущем.
Также следует удалить соответствующую колонку из
табличного поля, расположенного в форме.
После этого можно полностью удалить содержимое обработчика
события «ОбработкаПроведения» в модуле документа и создать в нем
заготовку процедуры проведения. Текст запроса, выполняемого в
режиме оперативного проведения, будет отличаться от запроса, Теперь задумаемся о том, что для указания значений ресурса
выполняемого при неоперативном проведении, поэтому формирование «Стоимость» регистров «СтоимостьМатериалов» и «Продажи» нам
текста запроса мы включим в условие Если ... Иначе ... КонецЕсли: понадобится рассчитать текущую стоимость номенклатуры как
частное стоимости остатка этого материала и его оставшегося
Процедура ОбработкаПроведения(Отказ, Режим)
количества.
Запрос = Новый Запрос; Поэтому добавим к списку выбранных таблиц еще две таблицы:
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос.Текст = • «РегистрНакопления.СтоимостьМатериалов.Остатки»,
Иначе Запрос.Текст • «РегистрНакопления.ОстаткиМатериалов.Остатки»:
=

КонецЕсли;
КонедПроцедуры

Вызовем конструктор запроса и раскроем таблицу


«ПереченьНоменклатуры» табличной части документа
«ОказаниеУслуги» и выберем из нее поля: Для этих виртуальных таблиц нам нужно будет задать параметры.
Эти параметры будут одинаковы для обеих таблиц. Они будут
• «Номенклатура», включать в себя момент времени, на который должны быть получены
• «Количество», остатки этих регистров, и условие получения данных.
• «ВидНоменклатуры»,
• «Сумма».

238 239
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

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

После того, как будут заданы параметры обеих виртуальных таблиц


регистров накопления, выберем из них поля «СтоимостьОстаток» и
«КоличествоОстаток»:

f Узнай больше!
Следует внимательно подходить к использованию виртуальных
таблиц запросов. В частности, необходимо уделять особое внимание
максимально возможному использованию параметров этих таблиц.
Например, в нашем случае можно было бы и не использовать
параметр «Условие», а ограничить выбранные поля уже в самом
запросе, указав вусловии ПОравенство номенклатуры из документа и Теперь вспомним о том, что документы «ОказаниеУслуги» могут
материала из таблицы остатков. В результате мы получили бы тот быть проведены как в оперативном, так и в неоперативном режиме.
же самый результат, однако no производительности этот способ
сильно отличался бы от того, который мы используем. *" Узнай больше!
В самом деле, в нашем варианте виртуальная таблица О концепции оперативного и неоперативного проведения
предоставит нам ровно столько записей, сколько различных документов можно прочитать в главе «Концепция оперативного и
элементов номенклатуры содержится в проводимом документе. Если неоперативного проведения документов» на странице 541.
же не указывать условие, виртуальная таблица предоставит нам
записи no абсолютно всем элементам номенклатуры, информация о Поскольку в оперативном режиме нам понадобится контролировать
которых есть в регистре накопления. И уже в самом нашем запросе остатки списываемой номенклатуры на складе, выберем еще раз
мы будем отбирать из этой огромной массы записей лишь несколько, виртуальную таблицу регистра накопления «ОстаткиМатериалов» и
которые нам действительно нужны. переименуем ее в «ОстаткиМатериаловОстаткиНаСкладе»:
Очевидно, что второй вариант будет работать дольше, и время
выполнения такого запроса будет зависеть в основном не от
количества данных, содержащихся в документе (т.е. реального
количества обрабатываемой информации), а от размера регистра
накопления.

240 241
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

Для этой виртуальной таблицы мы также укажем тп Теперь перейдем на закладку «Дополнительно» и установим флаг
«МоментВремени», а в условии напишем, что материал должен «Для изменения». Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет
находиться в списке номенклатуры и склад должен быть равен складу заблаговременно заблокировать чтение указанных данных (которые
указанному в документе: мОгут читаться транзакцией другого соединения) уже при считывании,
чтобы исключить взаимные блокировки при записи. Это предложение
дает возможность указать в запросе таблицы, считываемые данные
которых предполагается изменять.

<*- Узнай больше!


Более подробно об использовании предложения ДЛЯИЗМЕНЕНИЯ
можно прочесть на диске ИТС (информационно-технологического
с о п р о во ж де н и я ) в с т а т ь е « И с п о л ь з о ва н и е п р е дл о же н и я
ДЛЯ ИЗМЕНЕНИЯ в языке запросов».
Теперь из этой виртуальной таблицы мы выберем поле
«КоличествоОстаток»:
Поскольку мы с вами планируем выполнить запись регистров
накопления «ОстаткиМатериалов» и «СтоимостьМатериалов», укажем
таблицы этих регистров в качестве таблиц для изменения:

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


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

242 243
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

Перейдем на закладку «Псевдонимы» и зададим следующИе | ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка


псевдонимы полей:
|ДЛЯ ИЗМЕНЕНИЯ
• «НоменклатураВидНоменклатуры» - «ВидНоменклатуры», | РегистрНакопления.ОстаткиМатериалов.Остатки, |
РегистрНакопления.СтоимостьМатериалов.Остатки"; Иначе
• «КличествоОстатокЬ> - «КоличествоНаСкладе». Запрос.Текст =
Нажмем «ОК» и посмотрим, какой текст запроса сформировал КонецПроцедуры
конструктор:

Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый Как видите, в запросе нет ничего сложного за исключением, быть
Запрос; Если Режим = РежимПроведенияДокумента.Оперативный может, трех левых соединений с таблицей табличной части документа
Тогда
Запрос.Текст =
и использования ключевого предложения ДЛЯ ИЗМЕНЕНИЯ,
"ВЫБРАТЬ значение которого было объяснено выше.
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Количество,
Текст запроса для случая неоперативного проведения документа
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры будет практически таким же, за исключением того, что в нем будет
| КАК ВидНоменклатуры. отсутствовать третье левое соединение и, соответственно, поле
I ОказаниеУслугиПереченьНоменклатуры.Сумма, «КоличествоОстатокНаСкладе», т.к. проверку остатков в этом случае
I ОстаткиМатериаловОстатки.КоличествоОстаток, мы выполнять не будем:
I СтоимостьМатериаловОстатки.СтоимостьОстаток,
I ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток
I КАК КоличествоОстатокНаСкладе
«ИЗ Иначе
I Документ.ОказаниеУслуги.ПереченьНоменклатуры Запрос.Текст =
1 КАК ОказаниеУслугиПереченьНоменклатуры "ВЫБРАТЬ
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура, |
I &МоментВремени,
ОказаниеУслугиПереченьНоменклатуры.Количеотво, |
I Материал В (&СписокНоменклатурыДокумента))
ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры |
I КАК СтоимостьМатериаловОстатки
КАК ВидНоменклатуры, | ОказаниеУслугиПереченьНоменклатуры.Сумма, |
1 ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
ОстаткиМатериаловОстатки.КоличествоОстаток, |
t СтоимостъМатериаловОстатки.Материал
СтоимостьМатериаловОстатки.СтоимостьОстаток |ИЗ
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
| Документ.ОказаниеУслуги.ПереченьНоменклатуры | КАК
1 &МоментВремени,
I Материал В (&СписокНоменклатурыДокумента)) ОказаниеУслугиПереченьНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.СтоимостьМатериалов.Остатки(
I КАК ОстаткиМатериаловОстатки
I ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = &МоментВремени,
I ОстаткиМатериаловОстатки.Материал Материал В (&СписокНоменклатурыДокумента))
I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки( I КАК СтоимостьМатериаловОстатки
I &МоментВремени, I ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
I Материал В (&СписокНоменклатурыДокумента) И I СтоимостьМатериаловОстатки .Материал
I Склад = &СкладВДокументе) I ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
I КАК ОстаткиМатериаловОстаткиНаСкладе I &МоментВремени,
I ПО ОказаниеУслутиПереченьНоменклатуры.Номенклатура = Материал В (&СписокНоменклатурыДокумента))
I ОстаткиМатериаловОстаткиНаСкладе.Материал I КАК ОстаткиМатериаловОстатки I ПО
ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
1ГДЕ __

244 245
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

| ОстаткиМатериаловОстатки.Материал После этого добавим получение результата запроса и цикл его


|
|ГДЕ
обхода:
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка |
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления.ОстаткиМатериалов.Остатки, |
КонецЕсли;
РегистрНакопления.СтоимостьМатериалов.Остатки";
Запрос.УстановитьПараметрС'МоментВремени", МоментВремени());
КонецПроцедуры
Запрос.УстановитьПараметрС'СписокНоменклатурыДокумента",
ПереченъНоменклатуры.ВыгрузитьКолонку(" Номенклатура"));
Теперь добавим в текст обработчика задание параметров запроса: Запрос.УстановитьПараметр("Ссылка",Ссылка);

ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

Заирос.УстановитъПараметр("СкладВДокументе",Склад); Пока ВыборкаРезультатаЗапроса.Следующий() Цикл


Иначе
Запрос.Текст = КонецЦикла;
"ВЫБРАТЪ КонецПроцедуры ____________________________________________________________

| РегистрНакопления.ОстаткиМатериалов.Остатки";
КонецЕсли;
Теперь, прежде чем начать формирование движений по регистрам,
Запрос.УстановитьПараметрС'МоментВремени", МоментВремени()); нам нужно проверить наличие на складе достаточного количества
Запрос.УстановитьПараметрО'СписокНоменклатурыДокумента", номенклатуры:
ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
Запрое.УстановитьПараметр("Ссылка",Ссылка);

КонецЕсли;
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Обратите внимание, что для формирования списка номенклатуры Запрос.УстановитьПараметр("СписокНоменклатурыДокумента",
документа мы используем метод ВыгрузитьКолонку() объекта ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура"));
ДокументТабличнаяЧасть.ОказаниеУслуги.ПереченьНоменклат Запрос.УстановитьПараметр("Ссылка",Ссылка);
УРЫ. ВыборкаРезультатаЗапроса =

Запрос.Выполнить().Выбрать(); Пока

ВыборкаРезультатаЗапроса.Следующий() Цикл

//Проверить остаток при оперативном проведении -Если Режим =


РежимПроведенияДокумента.Оперативный Тогда Если
ВыборкаРезультатаЗапроса.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.Материал Тогда
Остаток = ?(Вы6оркаРезультатаЗапроса.КоличествоОстатокНаСкладе = NuH,
0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе); Если
Остаток < ВыборкаРезультатаЗапроса.Количество Тогда
Сообщить("Материала " +
СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) +
" имеется только " + Остаток);
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;

246 247
Оптимизация процедуры проведения документа ОказаниеУслуги
Использование основных объектов конфигурации

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
КонедЕсли;
Движение.Период = Дата;
КонецЦикла;
Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;
КонецПроцедуры
//расчитать стоимость материала
СтоимостьМатериала =
И в заключение добавим формирование движений по регистрам ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,
накопления: ВыборкаРезультатаЗапроса.СтоимостьОстаток /
ВыборкаРезультатаЗапроса.КоличествоОстаток); Движение.Стоимость =
СтоимостьМатериала *
ВыборкаРезультатаЗапроса.Количество;
КонецЕсли; КонецЕсли;
Запрос.УстановитьПараметр(" МоментВремени", МоментВремени());
Запрос.УстановитьПараметр(" СписокНоменклатурыДокумента", // регистр Продажи
ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура")); Движение = Движения.Продажи.Добавить();
Запрос.УстановнтьПараметр(" Ссылка" ,Ссылка); Движение.Период = Дата;
Движение.Номенклатура = ВыборкаРезультатаЗанроса.Номенклатура;
ВыборкаРезультатаЗапроса = Запрос.Вьшолнить().Выбрать(); Движение.Клиент = Клиент;
Движение.Мастер = Мастер;
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл Движение.Количество = ВыборкаРезультатаЗапроса.Количество;
Движение.Выручка = ВыборкаРезультатаЗапроса.Сумма;
//Провернть остаток при оперативном проведении Если Режим — Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =
РежимПроведенияДокумента.Оперативный Тогда Если Перечисления.ВидыНоменклатуры.Материал Тогда
ВыборкаРезультатаЗапроса.ВидНоменклатуры = Движение.Стоимость = СтоимостьМатериала *
Перечисления.ВидыНоменклатуры.МатериалТогда ВыборкаРезультатаЗапроса.Количество;
Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null, Иначе
0, ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе); Движение.Стоимость = 0;
Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда КонецЕсли; КонецЦикла;
Сообщить("Материала" +
СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется только // записать движения регистров
" + Остаток); Отказ = Истина; Возврат; КонецЕсли; КонецЕсли; Движения.ОстаткиМатериалов.Записать();
КонецЕсли; Движения.СтоимостьМатериалов.Записан,();
Движения.Продажи.Записать();
//Сформировать движения КонецПроцедуры
Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.Материал Тогда
// регистр ОстаткиМатериалов Расход Запустим 1С:Предприятие в режиме отладки и проверим работу
Движение = Движения.ОстаткиМатериалов.Добавить(); нового обработчика события «ОбработкаПроведения», перепроведя
Движение.ВидДвижения = ВидДвиженияНакопления.Расход; все документы «ОказаниеУслуги».
Движение.Период = Дата;
Движение.Материал = ВыборкаРезулыатаЗапроса.Ноченклатура; В заключение следует сделать небольшое отступление, которое
Движение.Склад = Склад; касается задания параметров виртуальных таблиц, использовавшихся в
Движение.Количество = ВыборкаРезультатаЗапроса.Количество; наших запросах.
// регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить();

248
249
Использование основных объектов конфигурации Оптимизация процедуры проведения документа ОказаниеУслуги

Как в первом, так и во втором запросах мы использовали условие


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

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки( - как система 1С:Предприятие выполняет обращение к


| &МоментВремени,
Материал В (&СписокНоменклатурыДокумента)) ссылочным данным - как используется кэш объектов -
почему для доступа к массивам данных информационной
Однако, что при большом количестве строк табличной части базы предпочтительнее использовать запросы - как
документа, из которой формируется список номенклатуры документа,
возможно более эффективным будет не передача номенклатуры запросом получить остатки регистра накопления - когда
документа в списке значений, а выполнение вложенного запроса: следует использовать ключевое предложение ДЛЯ
ИЗМЕНЕНИЯ - на что следует обращать внимание
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки( при задании
| &МоментВремени,
| Материал В (ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура параметров виртуальных таблиц запросов - почему при
| ИЗ
| Документ.ОказаниеУслуги.ПереченьНоменклатуры неоперативном проведении документов не
| КАК ОказаниеУслугиПереченьНоменклатуры
| ГДЕ ОказаниеУслугиПереченьНоменклатуры.Ссылка = нужно контролировать остатки
| &Ссылка))
- как и зачем можно передать вложенный запрос в
параметры виртуальной таблицы
Выбор одного или другого решения требует сравнительных тестов
и зависит от конкретной информационной базы, размеров документа,
количества одновременно работающих пользователей,
производительности компьютеров и т.д.
Теперь мы можем на некоторое время отвлечься от запросов, с
которыми мы достаточно «плотно» работали в этой главе, и обратить
свое внимание на не менее интересные возможности, которые
предоставляет разработчику платформа 1С:Предприятие 8.0.

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

Глава 7. План видов характеристик Постановка задачи

З
адача, которую мы перед собой поставим, будет заключаться в
В этой главе мы познакомимся с новым объектом конфигурации - следующем: мы создадим механизм, который позволит
План видов характеристик - и узнаем, каким образом можно пользователю произвольным образом описывать материалы, и,
использовать этот объект для расширения возможностей нашей что самое главное, вести учет в разрезе всех тех описаний, которые
конфигурации. могут быть заданы пользователем.
Описывать материалы пользователь сможет следующим образом:
для каждого материала будет возможность создать некоторые
(произвольные) характеристики этого материала (например, цвет,
производитель и пр.). Затем, при поступлении материалов можно
будет задать конкретные значения интересующих характеристик
(например, при поступлении электрических кабелей можно будет
указать, что они белого цвета и их сечение равно 2,5 мм2, а при
поступлении резиновых шлангов указать, что они черного цвета и
произведены на фирме «Fagumit Sp. z о.о.»).
В дальнейшем всегда можно будет получить информацию о том,
сколько и каких материалов есть у нас, скажем, белого цвета, или
сколько было израсходовано черных резиновых шлангов.
Поскольку заранее не известно, какими именно характеристиками
пользователь захочет описать тот или иной материал, мы должны
предоставить ему некоторый механизм, позволяющий создавать
любые характеристики и, что самое важное, указывать, какой тип
значения должен быть у этих характеристик. Тогда при задании
значений определенной характеристики пользователь сможет
выбирать значения строго в соответствии с указанным типом.
Такую возможность описания характеристик как раз и
обеспечивает объект конфигурации План видов характеристик, с
которым мы сейчас познакомимся.

253
252
Использование основных объектов конфигурации План видов характеристик

пожелает создать новый вид характеристик «Запах» и создать его


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

О
бъект конфигурации План видов характеристик является
прикладным объектом и предназначен для описания %Для тех, ктоработал с версией 7.7.
структуры хранения информации о характеристиках, В версии 7.7 нет прямого соответствия прикладному объекту
создаваемых пользователем. На основе объекта конфигурации план видов характеристик. Точнее всего будет сказать,
конфигурации План видов характеристик платформа создает в базе что один план видов характеристик включает в себя me
данных информационную структуру, в которой может храниться функциональные возможности, которыми в версии 7.7 обладали все
информация о том, какие существуют виды характеристик и какой тип объекты конфигурации вида «Вид субконто». Таким образом, в
должно иметь значение характеристики каждого вида. терминах 7.7, планы видов характеристик позволяют создавать
В сущности, план видов характеристик очень напоминает несколько «наборов» объектов «Вид субконто».
справочник. Однако план видов характеристик имеет более узкую Однако описание механизма ведения аналитического учета на
«специализацию»: он хранит, по сути, информацию только о том, счетах не является теперь основной задачей для плана видов
какими видами характеристик может описываться какой-либо объект характеристик. Использование подобного механизма было обобщено в
базы данных. Эта информация состоит из названия вида виде возможности задания переменного количества свойств, которые
характеристики и ее типа. Разработчик и, что самое важное, могут описывать объект конфигурации. Причем возможность
пользователь могут задать в нем любое необходимое им количество задания свойств существует как в режиме Конфигуратора, так и в
видов характеристик. режимеработы пользователя «1С:Предприятие».
Для того чтобы разработчик мог задать некий «набор» возможных Работа с планом счетов рассматривается теперь не как основное
типов значений, которые могут принимать виды характеристик, у предназначение плана видов характеристик, а как частный случай,
объекта конфигурации План видов характеристик существует свойство вытекающий из его возможностей. Конечно, как мы увидим далее,
Тип значения характеристик. Это свойство определяет составной тип взаимодействие плана видов характеристик с планом счетов
данных, в который входят все типы, которые могут понадобиться при максимально автоматизировано средствами платформы (no
указании типа значения характеристики. сравнению с взаимодействием с другими объектами конфигурации).
Кроме этого может случиться так, что пользователю станет Однако основной акцент делается на универсальность механизма,
недостаточно тех типов данных, которые существуют в конкретной предоставляемого планом видов характеристик. В частности это
системе (например, он захочет вести учет в разрезе цвета товаров, а видно и из названия объекта, где вместо слова субконто (разрез
справочник Цвет в конфигурации отсутствует). В этом случае он аналитического учета) теперь используется слово характеристика,
сможет воспользоваться неким вспомогательным справочником, обозначающее свойство объекта конфигурации, описанное вне его
который разработчик создаст заблаговременно и укажет в качестве самого (в другом объекте конфигурации).
свойства объекта конфигурации План видов характеристик -
дополнительные значения характеристик.
Тогда пользователь, создав новый вид характеристики «Цвет»,
сможет создать необходимые значения этого вида характеристики в
справочнике дополнительных значений характеристик.
Примечательно, что этот справочник является подчиненным плану
видов характеристик. Таким образом, если затем пользователь

254 255
Использование основных объектов конфигурации План видов характеристик

<*" Узнай больше! Логическая связь объектов


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

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


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

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


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

256 257
Использование основных объектов конфигурации План видов характеристик

обладающие таким значением характеристики, и затем по ним и их


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

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

• Число, длина 15, точность 3,


• Строка, длина 25,
• Дата,
• Булево,
• СправочникСсылка.ДополнительныеСвойстваНоменкла
туры:

258 259
Использование основных объектов конфигурации План видов характеристик

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

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

В заключение создадим объект конфигурации Регистр сведений с


именем «ЗначенияСвойствНоменклатуры».
Измерения регистра:
тип
• «НаборСвойств», ведущее,
СправочникСсылка.ВариантыНоменклатуры,
• «ВидСвойства», тип
ПланВидовХарактеристикСсылка.СвойстваНоменклатуры.
Ресурс регистра:
• «Значение», тип Характеристика.СвойстваНоменклатурЫ-
Обратите внимание, что мы имеем возможность определить тип
значения ресурса регистра, как Характеристика.<имя>. По сути, это

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

Теперь мы скорректируем размеры панели и добавим в нее новую


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

На зтот вопрос мы ответим утвердительно, и все элементы


управления переместятся в добавленную панель: Зададим имя и заголовок новой страницы - «Свойства», а первую
страницу также переименуем в «Основные» и зададим ей такой же
заголовок (группа свойств «Текущая страница» в палитре свойств
формы):

263
262
Использование основных объектов конфигурации План видов характеристик

После этого выделим все элементы управления, расположенные Под этой надписью расположим табличное поле с командной
панели, и выполним команду панелью с именем «Варианты» и типом
Форма | Центрирование | Центрировать по вертикали: СправочникСписок.ВариантыНоменклатуры. Из табличного поля
удалим колонку «Код». Для этого табличного поля установим
свойство «Связь по владельцу» - СправочникОбъект.Ссылка:

Теперь перейдем на страницу «Свойства» и добавим надпись


«НадписьВариантыНоменклатуры» с заголовком «Варианты
номенклатуры:». Укажем для нее начертание шрифта «Жирный».

Установка этого свойства будет обеспечивать нам то, что для


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

264 265
План видов характеристик
Использование основных объектов конфигурации

Под ней расположим табличное поле с командной панелью с


Ниже разместим аналогичным образом еще одну надпись именем «Свойства» и типом
«НадписьЗначенияСвойств» с заголовком «Значения свойств:» и РегистрСведенийСписок.ЗначенияСвойствНоменклатуры. Для
начертанием шрифта «Жирный».: колонки «НаборСвойств» снимем флаг «Видимость», а для поля ввода
в колонке «Значение» установим связь по типу -
ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства:

Связь по типу будет обеспечивать нам то, что тип значений,


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

267
266
Использование основных объектов конфигурации План видов характеристик

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

Т
значения в поле «Вид свойства» привести значение поля «Значение» к
еперь нам следует доработать
типу характеристики, выбранной в поле «Вид свойства». справочник
Поэтому для поля ввода в колонке «Вид свойства» создадим «ВариантыНоменклатуры» таким образом, чтобы
обработчик события «При изменении»: пользователь имел возможность создавать новые свойства
материалов не только при редактировании самого материала, но и в
Процедура СвойстваВидСвойстваПриИзмененииЭлемент) ДанныеВидСвойства процессе ввода документов, когда в табличную часть подбирается
= ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства; набор свойств.
ЭлементыФормы.Свойства.ТекущиеДанные.Значение =
ДанныеВидСвойства.ТипЗначения Поэтому для справочника «ВариантыНоменклатуры» укажем, что
.ПривестиЗначение(ЭлементыФормы.Свойства.ТекущиеДанные.Значение); он будет редактироваться обоими способами (как в списке, так и в
КоиецПроцедуры _________________________________________________________ диалоге) и создадим с помощью конструктора основную форму
элемента.
Теперь нам нужно сделать так, чтобы в табличном поле «Свойства»
Доработка формы элемента справочника
отображались записи регистра сведений, относящиеся только к «ВариантыНоменклатуры» будет сводиться, по большому счету, к тем
выбранному в верхнем табличном поле элементу справочника же действиям, которые мы выполнили с формой справочника
«ВариантыНоменклатуры». «Номенклатура». В форме нам нужно будет расположить табличное
Поэтому для табличного поля «Варианты» создадим обработчик поле, которое должно отображать существующие в регистре сведений
события «При активизации строки»: записи о значениях свойств для этого элемента справочника.
Откроем основную форму элемента справочника
ПроцедураВариантыПриАктивизацииСтрокиСЭлемент) «ВариантыНоменклатуры» и раздвинем форму вниз. На
ЭлементыФормы.Свойства.Значение.Отбор.НаборСвойств освободившемся пространстве поместим табличное поле с именем
.Установить(Элемент.ТекущиеДанные.Ссылка, Истина);
«Свойства», типом
КонедПроцедуры
РегистрСведенийСписок.ЗначенияСвойствНоменклатуры и
командной панелью. Для колонки «НаборСвойств» снимем флаг
Кроме этого, чтобы не отображать весь регистр при открытии видимости:
формы, создадим обработчик события формы «ПриОткрытии»,
содержащий следующий текст:

Процедура ПриОткрытии()
ЭлементыФормы.Свойства.Значение.Отбор.НаборСвойств.Установить(,Истина);
КонедПроцедуры

268 269
Использование основных объектов конфигурации План видов характеристик

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

Процедура СвойстваВидСвойстваПриИзменении(Элемент) Процедура СвойстваЛередНачаломДобавления(Элемент, Отказ, Копирование)


ДанныеВидСвойства = ЭлементыФормы.Свойства.ТекущиеДанные.ВидСвойства; Если ЭтоНовый() Тогда
ЭлементыФормы.Свойства.ТекущиеДанные.Значение = Записать();
ДанныеВидСвойства.ТипЗначения КонецЕсли;
.ПривестиЗначение(ЭлементыФормы.Свойства.ТекущиеДанные.Значение); КонецПроцедуры
КоиедПроцедуры

Теперь необходимо сделать так, чтобы при открытии формы Доработка регистра ОстаткиМатериалов

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

Узнай больше!
О событиях, связанных с формой, можно прочитать в главе
«События, связанные с формой» на странице 547.

Прежде всего, создадим обработчик события


«ПриИзмененииСсылки», в котором установим требуемый нам отбор:

Процедура ПриИзмененииСсылки(ПутьКДанным)
Cвойства.Отбор.Ha6opCвойств.Установить(Cсылка,"Истина");
КонецПроцедуры

Затем в тело модуля формы добавим вызов этого обработчика: Доработка документа ПриходнаяНакладная

ПодключитьОбработчикИзмененияДанныхССправочникОбъект.Ссылка",
"ПриИзмененииСсылкн"); П оследнее, что нам осталось - доработать документ
«ПриходнаяНакладная». Для того чтобы при приходовании
товаров пользователь мог указывать набор свойств для
каждого приходуемого материала, добавим в табличную

270 271
Использование основных объектов конфигурации План видов характеристик

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

Процедура ОбработкаПроведения(Отказ, Режим)


//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный
фрагмент построен конструктором. // При повторном
использовании конструктора, // внесенные вручную изменения
будут утеряны!!! Для Каждого ТекСтрокаМатериалы Из
Материалы Цикл
// регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.НаборСвойств = ТекСтрокаМатериалы.НаборСвойств;
После этого расположим этот реквизит в табличном поле формы Движение.Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
документа (правая кнопка мыши - Размещение данных): КонецЦикла; Для Каждого ТекСтрокаМатериалы Из Материалы
Цикл
// регистр СтоимостьМатериалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
// записываем движения регистров
Движения.ОстаткиМатериалов.Записать();
Движения.СтоимостьМатериалов.Записать();
Движения.Управленческий.Записать();
//}}_KOHCTPУКТР_ДВИЖЕНИЙ_PEГИCTPOB
КонецПроцедуры

Теперь запустим 1С:Предприятие в режиме отладки и создадим


несколько наборов свойств для наших материалов.

Создание наборов свойств

О
Для поля ввода, расположенного в колонке «НаборСвойств» снова ткроем элемент справочника «Номенклатура» - «Кабель
воспользуемся свойством «Связь по владельцу» электрический». Перейдем на закладку «Свойства» и
ЭлементыФормы.Материалы.ТекущиеДанные.Материал. Теперь создадим набор свойств этого элемента под названием
при выборе в этом поле ввода будет всегда открываться список «Белый».

272 273
Использование основных объектов конфигурации План видов характеристик

Он будет состоять их следующих характеристик: Этот набор свойств будет называться «Польша» и состоять из
следующих характеристик:
• «Цвет» - «Белый»,
• «Сечение, мм2» - 2,5: • «Цвет» - «Черный»,
• «Производитель» - «Fagumit»:

Затем создадим набор свойств для элемента справочника Теперь откроем документ ПриходнаяНакладная №2 и укажем, что
«Номенклатура» - «Шланг резиновый». был закуплен белый электрический кабель в количестве 2 шт. и
польский резиновый шланг.

274 275
Использование основных объектов конфигурации План видов характеристик

Затем скопируем первую строку документа и укажем, что был Кроме этого посмотрим на записи, которые содержатся в регистре
закуплен еще и черный электрический кабель в количестве 3 шт. (в сведений «ЗначенияСвойствНоменклатуры»:
процессе ввода нам придется создать еще один набор свойств для
электрического кабеля - «черный», у которого «Цвет» - «Черный» и
«Сечение» - 2,5):

Отчет ОстаткиМатериаловПоСвойствам

Д ля полного завершения картины мы создадим отчет, который


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

276 277
Использование основных объектов конфигурации План видов характеристик

Выберем виртуальную таблицу регистра накопления Из виртуальной таблицы регистра накопления


«ОстаткиМатериалов.ОстаткиИОбороты». В параметрах виртуальной ;<ОстаткиМатериалов.ОстаткиИОбороты» выберем следующие поля:
таблицы зададим условие отбора таким, что значение измерения
регистра «НаборСвойств» должно находиться в списке, передаваемом • «ОстаткиМатериаловОстаткиИОбороты.Материал»,
в качестве параметра «СписокСвойств»: • «ОстаткиМатериаловОстаткиИОбороты.НаборСвойств,
• «ОстаткиМатериаловОстаткиИОбороты.КоличествоНачальны
йОстаток»,
• «ОстаткиМатериаловОстаткиИОбороты.КоличествоПриход»,
• «ОстаткиМатериаловОстаткиИОбороты.КоличествоРасход»,
• «ОстаткиМатериаловОстаткиИОбороты.КоличествоКонечный
Остаток»:

Для формирования такого списка наборов свойств нам и


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

На закладке «Отчет» сбросим флаг «Использовать построитель


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

278 279
Использование основных объектов конфигурации План видов характеристик

удалим второй параметр при вызове процедуры


«ОстаткиМатериаловПоСвойствам»: //Запрос.УстановитьПараметр("СписокСвойств",СписокСвойств);

Результат = Запрос.Выполнить();
ПроцедураДействияФормыОстаткиМатериаловПоСвойствамСформировать(Кнопка)
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(
//ОстаткиМатериаловПоСвойствам) // Данный фрагмент построен конструктором. //
При повторном использовании конструктора, // внесенные вручную изменения Теперь мы можем перейти к созданию вложенного запроса,
будут утеряны!!! который будет передаваться в условие, заданное в параметре
виртуальной таблицы.
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
ОстаткиМатериаловПоСвойствам(ТабДок); Обладая достаточными навыками написания запросов, мы могли
бы вручную, вместо «&СписокСвойств» написать текст вложенного
//}}КОНСТРУКТОР_ВЫХОДНИЫХ ФОРМ_ПРОЦЕДУРА_ВЫЗОВА запроса. Но, поскольку мы только осваиваем язык запросов,
КонецПроцедуры
воспользуемся более комфортным способом: создадим текст
вложенного запроса при помощи конструктора, а затем просто
После этого в процедуре «ОстаткиМатериаловПоСвойствам» скопируем его в нужное нам место модуля. Для этого выполним
соответствующим образом изменим строку объявления процедуры и команду Текст | Конструктор запроса...
затем удалим строку, устанавливающую параметр запроса:
В качестве исходных данных вложенного запроса выберем таблицу
регистра сведений «ЗначенияСвойствНоменклатуры». Из нее выберем
Процедура ОстаткиМатериаловПоСвойствам(ТабДок) Экспорт
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(ОстаткиМатериаловПоСвойствам)
единственное поле - «ЗначенияСвойствМатериалов.НаборСвойств».
//Данный фрагмент построен конструктором. // При повторном использовании Зададим условия выборки. Прежде всего, владелец набора свойств
конструктора, // внесенные вручную изменения будут утеряны!!! должен быть равен переданному в параметре «Материал» материалу:
Макет = ОтчетОбъект.ПолучитьМакет("ОстаткиМатериаловПоСвойствам"); Запрос
= Новый Запрос; Запрос.Текст * "ВЫБРАТЬ ЗначенияСвойствНоменклатуры.НаборСвойств.Владелед = &Материал
|ОстаткиМатериаловОстаткиИОбороты.Материал,
|ОстаткиМатериаловОстаткиИОбороты.Материал.Представление,
|ОстаткиМатериаловОстаткиИОбороты. НаборСвойств,
|ОстаткиМатериаловОстаткиИОбороты.НаборСвойств.Представление, Затем укажем, что вид свойства должен быть равен переданному в
|ОстаткиМатериаловОстаткиИОбороты.КоличествоНачальныйОстаток параметре «ВидСвойства» значению:
|КАК НачальныйОстаток,
|ОстаткиМатериаловОстаткиИОбороты.КоличествоПриход
|КАК Приход, ЗначенияСвойствНоменклатуры.ВидСвойства = &ВидСвойства
|ОстаткиМатериаловОстаткиИОбороты.КоличествоРасход
|КАК Расход,
|ОстаткиМатериаловОстаткиИОбороты.КоличествоКонечныйОстаток
|КАК КонечныйОстаток |ИЗ
|РегистрНакопления.ОстаткиМатериалов.ОстаткиИОбороты(,,,,
|НаборСвойств В (&СписокСвойств))
|КАК ОстаткиМатериаловОстаткиИОбороты"; ^ _______

280 281
Использование основных объектов конфигурации План видов характеристик

И в заключение отметим, что значение свойства также будет | из


задаваться параметром «Значение»: I РегистрСведений.ЗначенияСвойствНоменклатуры
I КАК ЗначенияСвойствНоменклатуры
I
ЗначенияСвойствНоменклатуры.Значение = &Значение I ГДЕ
I ЗначенияСвойствНоменклатуры.НаборСвойств.Владелец = &Материал И
I ЗначенияСвойствНоменклатуры.ВидСвойства = &ВидСвойства И
I ЗначенияСвойствНоменклатуры.Значение = &Значение))
| КАК ОстаткиМатериаловОстаткиИОбороты";

Результат = Запрос.Выполнить();

Вложенный запрос готов. Теперь нажмем кнопку «Запрос», Маленькая доработка, которую нам останется сделать, будет
расположенную в нижней части окна конструктора запроса, выделим и заключаться в том, чтобы предусмотреть динамическое формирование
скопируем текст запроса в буфер обмена Windows. Закроем окно с текста запроса в зависимости от того, выбрано пользователем значение
текстом запроса и нажмем «Отмена» в конструкторе запроса. Теперь материала, или нет:
вставим текст из буфера обмена вместо параметра в созданный нами
ранее запрос: Процедура ОетаткиМатериаловПоСвойствамСТабДок) Экспорт
//{{КОНСТРУКТОР_ВЬКОДНЫХ_ФОРМ(ОстаткиМатериаяовПоСвойствам) //
Данный фрагмент построен конструктором. // При повторном использовании
Процедура ОстаткиМатериаловПоСвойствам(ТабДок) Экспорт конструктора, // внесенные вручную изменения будут утеряны!!!
//{{КОНСТРУКТОРЗЬПГОДНЬГХ^ЮРМСОстаткиМатериаловПоСвойствам) //
Данный фрагмент построен конструктором. // При повторном использовании Макет = ОтчетОбъект.ПолучитьМакетС'ОстаткиМатериаловПоСвойствам");
конструктора, // внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос;
Запрос.Текст =
Макет = ОтчетОбъект.ПолучитьМакетС'ОстаткиМатериаловПоСвойствам"); "ВЫБРАТЬ
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ОстаткиМатериаловОстаткиИОбороты.Материал,
| ОстаткиМатериаловОстаткиИОбороты.Материал, | | ОстаткиМатериаловОстаткиИОбороты.Материал.Представление,
ОстаткиМатериажовОстаткиИОбороты.Материал.Представление, | | ОстаткиМатериаловОстаткиИОбороты.НаборСвойств,
ОстаткиМатериаловОстаткиИОбороты.НаборСвойств, | | ОстаткиМатериаловОстаткиИОбороты.НаборСвойств.Представление,
ОстаткиМатериаловОстаткиИОбороты.НаборСвойств.Представление, | | ОстаткиМатериаловОстаткиИОбороты, КоличествоНачальныйОстаток
ОстаткиМатериаловОстаткиИОбороты.КоличествоНачальныйОстаток | | КАК НачальныйОстаток,
КАК НачальныйОстаток, | ОстаткиМатериаловОстаткиИОбороты.КоличествоПриход
| ОстаткиМатериаловОстаткиИОбороты.КоличествоПриход | | КАК Приход,
КАК Приход, | ОстаткиМатериаловОстаткиИОбороты.КоличествоРасход
| ОстаткиМатериаловОстаткиИОбороты.КоличествоРасход | | КАК Расход,
КАК Расход, | ОстаткиМатериаловОстаткиИОбороты.КоличествоКонечныйОстаток
| ОстаткиМатериаловОстаткиИОбороты.КоличествоКонечныйОстаток | КАК КонечныйОстаток
| КАК КонечныйОстаток |ИЗ |И3
| РегистрНакопления.ОстаткиМатериалов.ОстаткиИОбороты(,,,, | | РегистрНакопления.ОстаткиМатериалов.ОстаткиИОбороты(,,,,
НаборСвойств В (ВЫБРАТЬ | НаборСвойствВ (ВЫБРАТЬ
|ЗначенияСвойствНоменклатуры.НаборСвойств | ЗначенияСвойствНоменклатуры.НаборСвойств
| ИЗ
| РегистрСведений.ЗначенияСвойствНоменклатуры
| КАК ЗначенияСвойствНоменклатуры

282 283
Использование основных объектов конфигурации План видов характеристик

I ГДЕ
l"; Если Не Материал.Пустая() тогда
Запрос.Текст = Запрос.Текст +
Если Не Материал.ПустаяО тогда "ЗначенияСвойствНоменклатуры.НаборСвойств.Владелец = &Материал И
Запрос.Текст = Запрос.Текст +
"ЗначенияСвойствНоменклатуры.НаборСвойств.Владелец = Материал И КонецЕсли;
|";
КонецЕсли; Запрос.Текст = Запрос.Текст +
" ЗначенияСвойствНоменклатуры.ВидСвойства = &ВидСвойства И
Запрос.Текст = Запрос.Текст + | ЗначенияСвойствНоменклатуры.Значение = &Значение))
ЗначенияСвойствНоменклатуры.ВидСвойства = &ВидСвойства И | КАК ОстаткиМатериаловОстаткийОбороты";
I ЗначенияСвойствНоменклатуры.Значение = &Значение))
I КАК ОстаткиМатериаловОстаткиИОбороты"; Если Не Материал.Пустая() тогда
Результат = Запрос.Выполнить(); Запрос.УстановитьПараметр('' Материал", Материал);
КонецЕсли;
Запрос.УстановитьПараметр("ВидСвойства", ВидСвойства);
После этого добавим в текст модуля установку параметров запроса: Запрос.УстановитьПараметр('Значение", Значение);

Результат = Запрос.Выполнить();
Процедура ОстаткиМатериаловПоСвойетвам(ТабДок) Экспорт
//{{КОНСТРУКТОР_ВЫХОДНИЫХ ФОРМ) // Данный фрагмент построен
конструктором. // При повторном использовании конструктора, // внесенные
вручную изменения будут утеряны!!! Теперь последнее, что нам осталось сделать - это разместить в
форме поля для ввода параметров запроса.
Макет = ОтчетОбъект.ПолучитьМакет("ОстаткиМатериаловПоСвойствам");
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЪ
|ОстаткиМатериаловОстаткиИОбороты.Материал,
|ОстаткиМатериаловОстаткиИОбороты.Материал.Представление,
|ОстаткиМатериаловОстаткиИОбороты.НаборСвойств,
|ОстаткиМатериаловОстаткиИОбороты.НаборСвойств.Представление,
|ОстаткиМатериаловОстаткиИОбороты.КоличествоНачальныйОстаток
|КАК НачальныйОстаток,
|ОстаткиМатериаловОстаткиИОбороты.КоличествоПриход
|КАК Приход,
|ОстаткиМатериаловОстаткиИОбороты.КояичествоРасход
|КАК Расход,
|ОстаткиМатериаловОстаткиИОбороты.КоличествоКонечныйОстаток
|КАК КонечныйОстаток
|ИЗ
|РегистрНакопления.ОстаткиМатериалов.ОстаткиИОбороты(,,,,
|НаборСвойств В (ВЫБРАТЬ
|ЗначенияСвойствНоменклатуры.НаборСвойств |ИЗ
|РегистрСведений.ЗначенияСвойствНоменклатуры
|КАК ЗначенияСвойствНоменклатуры
|ГДЕ

284
285
Использование основных объектов конфигурации План видов характеристик

Откроем форму отчета и разместим на ней три поля ввода: На этом создание отчета завершено. Запустим 1С:Предприятие в
режиме отладки и посмотрим, какие результаты можно получить с
• «Материал» с типом СправочникСсылка.Номенклатура, помощью нашего отчета.
• «ВидСвойства» с типом Сначала посмотрим, какие у нас есть материалы с сечением 2,5
ПланВидовХарактеристикСсылка.СвойстваНоменклатур мм2:
ы,
• «Значение» с типом
Характеристика.СвойстваНоменклатуры:

Затем посмотрим, какие у нас есть материалы черного цвета:

Для поля ввода «Материал» установим свойство «Выбор групп и


элементов» как «Элементы».
Для поля ввода «Значение» установим связь по типу с реквизитом
«ВидСвойства». А для поля ввода «ВидСвойства» создадим
обработчик события «ПриИзменении»:

Процедура ВидСвойстваПриИзменении(Элемеит)
Значение = ВидСвойства.ТипЗначения.ПривестиЗначение(Значение);
КонецПроцедуры

286 287
Использование основных объектов конфигурации План видов характеристик

И в заключение, чтобы убедиться в правильности работы отчета


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

- для чего предназначен объект конфигурации План видов


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

288 289
Бухгалтерский учет

Глава 8. Бухгалтерский учет Объект конфигурации План видов


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

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

Создание объекта конфигурации План видов


характеристик ВидыСубконто

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

290 291
Использование основных объектов конфигурации Бухгалтерский учет

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

• СправочникСсылка.Клиенты,
• СправочникСсылка.Номенклатура,
• СправочникСсылка.Субконто:

Закроем окно редактирования справочника и вернемся к нашему


плану видов характеристик.

Бухгалтерия нашего OOO «На все руки мастер» ведет учет


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

292 293
Использование основных объектов конфигурации Бухгалтерский учет

создадим вид субконто: «Клиенты», с кодом «00002» и типом


СправочникСсылка.Клиенты: Объект конфигурации План счетов

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

294 295
Использование основных объектов конфигурации
Бухгалтерский учет

Нажмем кнопку «Предопределенные» и создадим четыре


Узнай больше! предопределенных счета:
О структуре объектов встроенного языка, предназначенных для
работы с планами счетов можно прочитать в главе «Планы счетов • «Товары», код 41, активный, с количественным учетом в
на странице» 588. разрезе материалов:

Создание объекта конфигурации План счетов


Основной

П риступим к созданию плана счетов OOO «На все руки


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

296
297
Использование основных объектов конфигурации Бухгалтерский учет

• «Расчеты с поставщиками», код 60, активно/пассивный: • «Капитал», с кодом 90, активно/пассивный:

В результате план счетов нашего OOO «На все руки мастер» будет
«Дебиторская задолженность», код 62, активно/пассивный, с выглядеть следующим образом:
учетом в разрезе клиентов:

Теперь, мы можем перейти к знакомству с последним объектом


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

' Узнай больше!


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

298 299
Использование основных объектов конфигурации ____________________ Бухгалтерский учет
------------- ■ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
----------------------------------------------------------------------------------~ ^
' ^

тех случаях, когда пользователь или разработчик выбирает


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

О
тогда, когда с точки зрения пользователя нужноупорядочивать план бъект конфигурации Регистр бухгалтерии является
счетов no коду с учетом разделителей кода счета. Например, если прикладным объектом и предназначен для описания
счета «10.11» и «10.2» упорядочивать no коду счета, то счета будут структуры накопления данных, учет которых ведется исходя из
располагаться так: некоторого плана счетов. На основе объекта конфигурации Регистр
«10.11» бухгалтерии платформа создает в базе данных
«10.2» информационную структуру, в которой будут накапливаться данные о
Это правильно с точки зрения сортировки строк, но не хозяйственных операциях, отображаемых в бухгалтерском учете.
соответствует логическому смыслу кодов. По своему виду регистр бухгалтерии напоминает регистр
Но если заданы значения поля Порядок «10.11» и «10. 2» и накопления - он также имеет ресурсы, может иметь измерения и
установлено свойство «Автопорядок no коду», то при выборе реквизиты. Измерения позволяют разделять ведение учета (например,
упорядочивания no коду пользователь будет, фактически, получать используя измерение «Организация», можно вести учет в разрезе
порядок, учитывающий разделители: нескольких юридических лиц). Реквизиты служат признаком, по
«10.2» которому одни записи регистра можно отделить от других (например,
«10.11». в качестве реквизита может использоваться номер журнала, что
Если свойство не устанавливать, то нужно будет в явном виде позволит отбирать проводки, имеющие одинаковый смысл).
выбирать упорядочивание no полю Порядок. ________________^___ Значительное отличие от регистра накопления заключается в том,
что регистр бухгалтерии имеет жесткую связь с используемым планом
счетов. Поэтому каждая запись регистра бухгалтерии содержит
дополнительные поля, определяемые настройкой используемого плана
счетов. Например, запись регистра может содержать дополнительные
поля для указания корреспондирующих счетов, сумм, объектов
аналитического учета (субконто), количества, вида валюты и т.д.
Кроме этого, отличительной чертой регистра бухгалтерии является
возможность поддержки механизма двойной записи, при которой
каждая запись регистра содержит обязательные поля для указания
счета дебета и счета кредита.

Узнай больше!
О структуре объектов встроенного языка, предназначенных для
работы с регистрами бухгалтерии можно прочитать в главе
«Регистры бухгалтерии» на странице 603.

300 301
Использование основных объектов конфигурации Бухгалтерский учет

Создание регистра бухгалтерии Управленческий


Использование регистра бухгалтерии

О Н
ткроем конфигуратор и создадим новый объект
конфигурации Регистр бухгалтерии. Зададим его имя _ астало время познакомиться с тем, каким образом
«Управленческий». Укажем, что с ним будет связан план используется созданный нами регистр бухгалтерии
счетов «Основной». Установим флаг «Корреспонденция». Этот «Управленческий». В этой главе мы, сначала, доработаем оба
флаг будет говорить о том, что создаваемый нами регистр наши документа - «ПриходнаяНакладная» и
поддерживает корреспонденции. Это означает, что каждая запись «ОказаниеУслуги» - так, чтобы они «поставляли» данные не только
регистра имеет дебетовую и кредитовую часть, что позволит нам для регистров накопления, но и для регистра бухгалтерии. Затем мы
создадим бухгалтерский отчет «Оборотно-сальдовая ведомость»,
получать информацию не только об остатках и оборотах по счетам , но
который будет показывать нам состояние товародвижения в нашем
и о корреспонденциях между счетами.
OOO «На все руки мастер», основываясь на данных регистра
Регистры, не поддерживающие корреспонденцию, используются бухгалтерии.
тогда, когда не нужно использовать принцип двойной записи,
регламентированный в бухгалтерском учете, и, соответственно, Создание движений документа ПриходнаяНакладная

Н
контролировать баланс хозяйственных средств и их источников.
ачнем с простого: доработаем движения документа
Теперь перейдем на закладку «Данные» и создадим два ресурса:
«ПриходнаяНакладная». Для этого нам достаточно будет
• «Сумма», длина 15, точность 2, балансовый, воспользоваться конструктором движений документа и
заменить старые движения документа на новые, по трем
• «Количество», длина 15, точность 3, небалансовый, признак
регистрам.
учета - количественный, признак учета субконто -
количественный. Откроем конфигуратор. В окне редактирования объекта
конфигурации Документ «ПриходнаяНакладная», на закладке
На этом создание нашего регистра бухгалтерии завершено. Теперь «Движения» запустим конструктор движений документа.
откроем окна редактирования документов «ПриходнаяНакладная» и
В список регистров добавим регистр
«ОказаниеУслуги» и отметим, что эти документы будут создавать
«РегистрБухгалтерии.Управленческий». В качестве источника данных
движения и по регистру бухгалтерии «Управленческий» (закладка
выберем табличную часть документа «ПриходнаяНакладная» -
«Движения»).
«Материалы». Счет дебета установим равным
Запустим 1С:Предприятие в режиме отладки и откроем регистр «ПланыСчетов.Основной.Товары» (41), а счет кредита -
бухгалтерии «Управленческий». Как видите, платформа (при создании «ПланыСчетов.Основной.РасчетыСПоставщиками» (60).
структуры хранения данных) добавила к созданным нами реквизитам
регистра еще ряд полей, которые явились следствием использования
плана счетов «Основной». Прежде всего, это поля «СчетДт»,
«СубконтоДт1», «СчетКт» и «СубконтоКт1>. Кроме этого, если
прокрутить окно вправо до конца, то вы обнаружите две колонки
«Количество». Это «КоличествоДт» и «КоличествоКт». Для измерений
и ресурсов регистра, связанных с признаками учета, платформа
создает пару полей для хранения значения ресурса отдельно по дебету
и отдельно по кредиту проводки.

302 303
Использование основных объектов конфигурации Бухгалтерский учет

Нажмем кнопку «Заполнить выражения». У вас должен получиться Движение.Период = Дата;


следующий результат: Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла; Для Каждого ТекСтрокаМатериалы Из
Материалы Цикл
// регистр Управленческий
Движение = Движения.Управленческий.Добавить();
Двюкение.СчетДт = ПланыСчетов.Основной.Товары;
Движение.СчетКт = ПланыСчетов.Основной.РасчетыСПоставшиками;
Движение.Период = Дата;
Движение.Сумма = ТекСтрокаМатериалы.Сумма;
Движение.Количество = ТекСтрокаМатериалы.Количество;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] =
ТекСтрокаМатериалы.Материал;
КонецЦикла;
// записываем движения регистров
Движения.ОстаткиМатериалов.Записать();
Движения.СтоимостьМатериалов.Записать();
Движения.Управленческий.Записать();
//}}_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Платформа сформировала уже знакомые нам три цикла обхода


табличной части документа (для каждого регистра свой цикл). В
первых двух циклах для нас нет ничего нового. В последнем, по
большому счету, тоже - движения формируются таким же образом,
Нажмем «ОК» и посмотрим, какой текст платформа добавила в как и для регистра накопления. Интерес для нас представляет только
обработчик проведения документа «ПриходнаяНакладная»: последняя строчка цикла, в которой присваивается значение субконто
дебета.
Процедура ОбработкаПроведения(Отказ, Режим) Дело в том, что количество субконто как по дебету, так и по
//{{__КОНСТРУКТОР ДВИЖЕНИЙ_РЕГИСТРОВ //
кредиту у каждой записи движения регистра будет различное, в
Данный фрагмент построен конструктором. // При
повторном использовании конструктора, // внесенные зависимости от того, как определены счета в используемом плане
вручную изменения будут утеряны!!! Для Каждого счетов. Поэтому для каждой записи движения регистра бухгалтерии
ТекСтрокаМатериалы Из Материалы Цикл платформа хранит две коллекции значений: коллекцию субконто
// регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
дебета и коллекцию субконто кредита. Каждая из этих коллекций
Движение.ВидДвижения = ВидДвиженияНакопления.Приход; содержит ровно столько элементов, сколько указано использовать
Движение.Период = Дата; видов субконто для соответствующего счета (дебета или кредита) в
Движение.Материал = ТекСтрокаМатериалы.Материал; плане счетов. Обратиться к элементу коллекции можно, указав в
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
квадратных скобках ссылку на соответствующий вид характеристик,
КонецЦикла; Для Каждого ТекСтрокаМатериалы Из либо указав через точку имя предопределенного вида характеристик.
Материалы Цикл
// регистр СтоимостьМатериалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

304 305
Использование основных объектов конфигурации Бухгалтерский учет

Другими словами, запись: Добавление движений по регистру бухгалтерии


Управленческий в документ ОказаниеУслуги
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Материалы]

равносильна записи:
Д ля того чтобы добавить движения по регистру Управленческий в
документ «ОказаниеУслуги», нам уже не удастся
воспользоваться конструктором движений. Если вы помните,
движения этого документа мы создавали самостоятельно, без
использования конструктора.
В отличие от документа «ПриходнаяНакладная», который создавал
Движение.СубконтоДт.Материалы . всего одну бухгалтерскую проводку, документ «ОказаниеУслуги»
будет создавать уже две проводки:

Запустим 1С:Предприятие в режиме отладки, откроем документ


ПриходнаяНакладная №1 и перепроведем его.
Посмотрим, какие движения сформировал документ в регистре
бухгалтерии Управленческий:

Напомним, что бухгалтерия нашего OOO «На все руки мастер» не


совсем похожа на «настоящую» бухгалтерию, потому что для
облегчения своей работы она учитывает только движения материалов.
Услуги, которые оказывает 000, для нее как бы не существуют.
Поэтому документ «ОказаниеУслуги» должен формировать движения
Обратите внимание, что, поскольку, на счете 60 по регистру бухгалтерии только в той части, которая касается
(«РасчетыСПоставщиками») отсутствует аналитика и ведется только расходования материалов.
суммовой учет, в записях движений регистра «СубконтоКт1», Откроем в конфигураторе модуль объекта конфигурации Документ
«СубконтоКт2» и «КоличествоКт» не указаны. «ОказаниеУслуги» и найдем в нем процедуру обработки проведения.
После этого перепроведем документ ПриходнаяНакладная №2 и Она должна иметь следующий вид:
посмотрим, какие движения сформирует он.
Теперь перейдем к более сложной задаче - добавлению движений Процедура ОбработкаПроведения(Отказ, Режим) Запрос = Новый
по регистру «Управленческий» в документ «ОказаниеУслуги». Запрос; Если Режим = РежимПроведенияДокумента.Оперативный
Тогда
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
| ОказаниеУслугиПереченьНоменклатуры.Количество,
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры
| КАК ВидНоменклатуры,
| ОказаниеУслугиПереченьНоменклатуры.Сумма,

306 307
Использование основных объектов конфигурации Бухгалтерский учет

| ОстаткиМатериаловОстатки.КоличествоОстаток, | КАК СтоимостьМатериаловОстатки


| СтоимостьМатериаловОстатки.СтоимостьОстаток, | ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
| ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток | СтоимостьМатериаловОстатки.Материал
| КАК КоличествоОстатокНаСкладе | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
|ИЗ | &МоментВремени,
| Документ.ОказаниеУслуги.ПереченьНоменклатуры | Материал В (&СписокНоменклатурыДокумента))
| КАК ОказаниеУслугиПереченьНоменклатуры | КАК ОстаткиМатериаловОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки( | ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =
| &МоментВремени, | ОстаткиМатериаловОстатки.Материал
| Материал В (&СписокНоменклатурыДокумента))
| КАК СтоимостьМатериаловОстатки |ГДЕ
| ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = | ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
| СтоимостьМатериаловОстатки.Материал
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки( |ДЛЯ ИЗМЕНЕНИЯ
| &МоментВремени, | РегистрНакопления.ОстаткиМатериалов.Остатки, |
| Материал В (&СписокНоменклатурыДокумента)) РегистрНакопления.СтоимостьМатериалов.Остатки";
|КАК ОстаткиМатериаловОстатки КонецЕсли;
| ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = Запрос.УстановитьПараметрС'МоментВремени", МоментВремени());
| ОстаткиМатериаповОстатки.Материал Запрос.УстановитьПараметрС'СписокНоменклатурыДокумента",
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки( ПереченьНоменклатуры.ВыгрузитьКолонкуС'Номенклатура"));
| &МоментВремени, Запрос.УстановитьПараметр{"Ссылка",Ссылка);
| Материал В (&СписокНоменклатурыДокумента) И
| Склад = &СкладВДокументе) ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();
| КАК ОстаткиМатериаловОстаткиНаСкладе
| ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
| ОстаткиМатериаловОстаткиНаСкладе.Материал
/ЯТроверить остаток при оперативном проведении Если Режим =
|ГДЕ РежимПроведенияДокумента.Оперативный Тогда Если
| ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка ВыборкаРезультатаЗапроса.ВидНоменклатуры =
Перечисления.ВидыНоменклатуры.МатериалТогда
|ДЛЯ ИЗМЕНЕНИЯ Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null,
| РегистрНакопления.ОстаткиМатериалов.Остатки, | 0,ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);
РегистрНакопления.СтоимостьМатериалов.Остатки"; Иначе Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда
Запрос.Текст = Сообщить("Материала" +
"ВЫБРАТЬ СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется
| ОказаниеУслугиПереченьНоменклатуры.Номенклатура, | только " + Остаток); Отказ = Истина; Возврат; КонецЕсли;
ОказаниеУслугиПереченьНоменклатуры.Количество, | КонецЕсли; КонецЕсли;
ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры |
КАК ВидНоменклатуры, | ОказаниеУслугиПереченьНоменклатуры.Сумма, | //Сформировать движения
ОстаткиМатериаловОстатки.КоличествоОстаток, | Если ВыборкаРезулыатаЗапроса.ВидНоменклатуры =
СтоимостьМатериаловОстатки.СтоимостьОстаток |ИЗ Перечисления.ВидыНоменклатуры.МатериалТогда
| Документ.ОказаниеУслуги.ПереченьНоменклатуры | // регистр ОстаткиМатериалов Расход Движение =
КАК ОказаниеУслугиПереченьНоменклатуры Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения =
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки( ВидДвиженияНакопления.Расход; Движение.Период = Дата;
| &МоментВремени,
| _______________________________ Материал В
(&СпиеокНоменклатурыДокумента)

308 309
Использование основных объектов конфигурации Бухгалтерский учет

Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура; Добавим движения по регистру бухгалтерии Управленческий:


Движение.Склад = Склад;
Движение.Количество = ВыборкаРезультатаЗапроса.Количество;

// регистр СтоимостьМатериалов Расход Движение = //Сформировать движения


Движения.СтоимостьМатериалов.Добавить(); Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =
Движение.ВидДвижения = ВидЦвиженияНакопления.Расход; Перечисления.ВидыНоменклатуры.Материал Тогда
Движение.Период = Дата; // регистр ОстаткиМатериалов Расход
Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура; Движение = Движения.ОстаткиМатериалов.Добавить();
//расчитать стоимость материала
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null. 0,
Движение.Период = Дата;
ВыборкаРезультатаЗапроса.СтоимостьОстаток /
Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;
ВыборкаРезультатаЗапроса.КоличествоОстаток); Движение.Стоимость =
СтоимостьМатериала * Движение.Склад = Склад;
Движение.Количество = ВыборкаРезультатаЗапроса.Количество;
ВыборкаРезультатаЗапроса.Количество;
КонецЕсли; // регистр СтоимостьМатериалов Расход Движение =
Движения.СтоимостьМатериалов.Добавить();
// регистр Продажи Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение = Движения.Продажи.Добавить(); Движение.Период = Дата;
Движение.Период = Дата; Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;
Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура; //расчитать стоимость материала
Движение.Клиент = Клиент; СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,
Движение.Мастер = Мастер; ВыборкаРезультатаЗапроса.СтоимостьОстаток /
Движение.Количество = ВыборкаРезультатаЗапроса.Количество; ВыборкаРезультатаЗапроса.КоличествоОстаток); Движение.Стоимость =
Движение.Выручка = ВыборкаРезультатаЗапроса.Сумма; СтоимостьМатериала *
Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = ВыборкаРезультатаЗапроса.Количество;
Перечисления.ВидыНоменклатуры.Материал Тогда
Движение.Стоимость = СтоимостьМатериала * //no регистру Управленческий
ВыборкаРезультатаЗапроса.Количество;
Иначе //первая проводка:
Движение.Стоимость = 0; //Д 62(ДебиторскаяЗадолженность) - К 90 (Капитал)
КонецЕсли; КонецЦикла; //розничная сумма
Движение = Движения.Управленческий.Добавить();
// записать движения регистров Движенне.СчетДт = ПланыСчетов.Основной.ДебиторскаяЗадолженность;
Движения.ОстаткиМатериалов.Записать(); Движение.СчетКт = ПланыСчетов.Основной.Капитал; Движение.Период =
Движения.СтоимостьМатериалов.Записать(); Дата;
Движения.Продажи.Записать(); Движение.Сумма = ВыборкаРезультатаЗапроса.Сумма; Движение
КонецПроцедуры ______________________________________________________ . .СубконтоДтГПланыВидовХарактеристик,ВидыСубконто.Материалы] =
ВыборкаРезультатаЗапроса.Номенклатура;
//вторая проводка:
//Д90 (Капитал) - К 41 (Товары) - себестоимость
Поскольку нас интересует только движение материалов, для
Движение = Движения.Управленческий.Добавить(),*
внесения дополнений подойдет тело условия Если ..., в котором мы Движение.СчетДт = ПланыСчетов.Основной.Капитал;
формировали движения по регистрам «ОстаткиМатериалов» и Движение.СчетКт = ПланыСчетов.Основной.Товары;
«СтоимостьМатериалов». Движение.Период = Дата;
Движение.Сумма = СтоимостьМатериала *
___________________ _________

310 311
Использование основных объектов конфигурации Бухгалтерский учет

Движение.КоличествоКт = ВыборкаРезультатаЗапроса.Количество; имеющиеся в плане счетов счета, а в колонках - начальное сальдо,


Движение оборот и конечное сальдо по дебету и кредиту каждого счета.
.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] = Поэтому нам, для построения такого отчета, понадобятся две
ВыборкаРезультатаЗалроса.Номенклатура-
КонецЕсли;
исходные таблицы: объектная (ссылочная) таблица плана счетов
«Основной» и виртуальная таблица регистра бухгалтерии
«Управленческий.ОстаткиИОбороты»:
В первой проводке мы указываем розничную сумму материала из
документа и субконто дебета, поскольку на счете «Дебиторская
задолженность» ведется учет в разрезе материалов.
Во второй проводке мы указываем стоимость материала,
количество и субконто кредита, поскольку на счете «Товары» ведется
количественный учет в разрезе материалов. Из таблицы «Основной» мы выберем поля «Код» и
Запустим 1С:Предприятие в режиме отладки, перепроведем «Наименование», а из таблицы «УправленческийОстаткиИОбороты»,
документ ОказаниеУслуги №1 и посмотрим, какие движения он мы выберем следующие поля:
сформировал по регистру бухгалтерии «Управленческий»:
• «СуммаНачальныйРазвернутыйОстатокДт»,
• «СуммаНачальныйРазвернутыйОстатокКт»,
• «СуммаОборотДт»,
• «СуммаОборотКт»,
• «СуммаКонечныйРазвернутыйОстатокДт»,
• «СуммаКонечныйРазвернутыйОстатокКт»:

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

Создание отчета ОборотноСальдоваяВедомость

Т еперь нам осталось только создать отчет для бухгалтерии


OOO «На все руки мастер» и наше знакомство с
использованием регистра бухгалтерии будет закончено.
Единственный отчет, которым пользуется бухгалтерия
нашего OOO - это отчет «Оборотно-сальдовая ведомость».
Для того чтобы сформировать этот отчет, откроем конфигуратор и
создадим новый объект конфигурации Отчет с именем
«ОборотноСальдоваяВедомость». На закладке «Макеты» откроем
конструктор выходной формы, и посмотрим, что нам предлагает
платформа для выбора.
Бухгалтерский отчет «Оборотно-сальдовая ведомость»
представляет собой таблицу, в строках которой перечислены все

312 313
Использование основных объектов конфигурации

Перейдем на закладку «Связи» и укажем, что из таблицы


т Бухгалтерский учет

В заключение на закладке «Отчет» сбросим флаг «Использовать


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

Затем на закладке «ОбъединенияЯ1севдонимы» зададим


псевдонимы полей регистра: «СальдоНачДт», «СальдоНачКт»,
«ОборотДт», «ОборотКт», «СальдоКонДт» и СальдоКонКт»:

После этого на закладке «Порядок» укажем, что результат запроса


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

314
315
Использование основных объектов конфигурации

Что нового мы узнали Глава 9. План видов расчета, регистр


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

316 317
Использование основных объектов конфигурации План видов расчета, регистр расчета

жлада вообще, а сумму, которая начислена в том периоде, который


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

В
этой главе мы рассмотрим возможности системы В качестве примера рассмотрим начисление премии за апрель.
1С:Предприятие, которые она предоставляет д Ля автоматизации Премия должна начисляться в размере 10% от суммы, начисленной в
сложных периодических расчетов. качестве оплаты по окладу. Следовательно, необходимо
Такие расчеты используются, прежде всего, при расчете проанализировать все записи о начислениях оплаты по окладу,
заработной платы. Поэтому дальнейшее рассмотрение этих которые попадают в интересующий нас базовый период, а именно
возможностей мы будем строить на примере расчета заработной платы апрель. Допустим, общая сумма таких начислений составила 8000
сотрудников, которые работают в нашем OOO «На все руки мастер». рублей - в этом случае премия должна быть начислена в размере 800
В общем случае, сумма заработной платы сотрудника складывается рублей:
из множества частей (например, оплата по окладу, премии, штрафы,
оплаты по больничному листу, разовые выплаты и т.д.). Каждая из
этих частей рассчитывается по некоторому алгоритму, присущему Зависимость премии от оклада по базовому периоду
только этой части. Например, сумма штрафа может определяться
Базовый период
просто фиксированной суммой, сумма премии может рассчитываться
как процент от оклада, а сумма оплаты по окладу рассчитывается
исходя из количества рабочих дней в месяце и количества дней,
отработанных сотрудником. Поэтому для обозначения каждой такой
части мы будем использовать термин вид расчета.
Алгоритм каждого вида расчета опирается в общем случае на две
категории параметров: период, за который нужно получить конечные
данные и набор некоторых исходных данных, используемых при
расчете.
Как правило, в реальной жизни различные виды расчета
существуют не сами по себе, а оказывают некоторое влияние на другие
виды расчета. Исходя из того, что вид расчета опирается на две
различные категории параметров, такое влияние тоже имеет
двойственный характер. Во-вторых, это влияние может быть не на исходные данные, а на
Во-первых, это может быть влияние на исходные данные, сам период, за который производится расчет. В качестве примера
используемые при расчете. В качестве примера можно привести можно привести расчет оплаты по окладу и невыход на работу.
начисление премии в виде процента от оплаты по окладу. При Предположим, что мы начислили сотруднику оплату по окладу за март
изменении оплаты по окладу размер премии тоже должен быть месяц. В этом случае период действия такого расчета будет с
пересчитан, исходя из новой суммы начисленного оклада. Другими 01.03.2004 по 31.03.2004. После этого мы получили информацию от
словами, сумма начисленного оклада является базой для расчета руководителя отдела, что, оказывается, сотрудник отсутствовал на
премии. Причем, поскольку оклад рассчитывается за некоторый работе с 1 по 10 марта по неизвестной причине. В этом случае нам
период, то при расчете премии нам интересно знать не значение нужно будет произвести расчет «Невыход» (в котором можно
рассчитать какие-то удержания с сотрудника). Но кроме этого, нам

318 319
Использование основных объектов конфигурации План видов расчета, регистр расчета

нужно будет пересчитать и оклад сотрудника, исходя из того, ЧТо Базовый период - это период, в котором мы анализируем
фактический период действия расчета «Оклад» стал теперь с результаты других расчетов, которые влияют на наш по базовому
11.03.2004 по 31.03.2004. Такое влияние мы будем называть периоду.
вытеснением no периоду действия. В результате, если за полный Как видите, взаимное влияние между видами расчетов может быть
месяц работы сотруднику должно было быть начислено 9300 рублей довольно разнообразным и, что самое сложное, это влияние может
то теперь, за фактический период работы начисление составит 6300 быть многоуровневым. To есть один вид расчета может влиять на
рублей: другой, который, в свою очередь, влияет на третий и т.д.
Очевидно, что в этой ситуации требуется некий универсальный
механизм, позволяющий описать каждый из видов расчетов (его
алгоритм, влияние на другие виды расчетов, зависимость от других
видов расчетов), обеспечить хранение данных, полученных в
результате этих расчетов и контроль необходимости перерасчета
результатов зависимых расчетов в случае изменения результатов
«первичных» расчетов.
В системе 1С:Предприятие такой универсальный механизм
реализован при помощи планов видов расчета и регистров расчета. И
первым объектом конфигурации, с которым мы начнем знакомиться в
этой главе, будет План видов расчета.

Таким образом, исходя из двух видов взаимного влияния расчетов,


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

320 321
Использование основных объектов конфигурации План видов расчета, регистр расчета

возможность указать три категории видов расчета, влияющих на


Объект конфигурации План видов расчета предопределенный вид расчета:

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

322 323
Использование основных объектов конфигурации
План видов расчета, регистр расчета

~ Узнай больше! Создание плана видов расчета


О структуре объектов встроенного языка, предназначенных ^ ОсновныеНачисления

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

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


базовые планы видов расчета...

Перейдем на закладку «Прочее» и зададим предопределенные виды


расчета. Как и в случае с бухгалтерией, расчеты в нашем OOO «На все

325
324
Использование основных объектов конфигурации T План видов расчета, регистр расчета

руки мастер» будут «скромные», поэтому мы создадим всего три


элемента:
Объект конфигурации Регистр расчета

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

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

326 327
Использование основных объектов конфигурации План видов расчета, регистр расчета

«ПериодРегистрации» типа Дата. При записи данных в регистр Если в этой же ситуации периодичность регистра будет год,
платформа всегда приводит значение этого реквизита к началу того сохраненное значение периода регистрации будет 01.01.2004:
периода, в который он попадает.
Например, если в регистр расчета с периодичностью месяц
записать данные, где «ПериодРегистрации» задан как 08.04.2004, то
регистр сохранит эти данные со значением поля «ПериодРегистрации»
01.04.2004:

Документ

328 329
Использование основных объектов конфигурации

Следующей важной особенностью регистра расчета является


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

После добавления в регистр записи вида расчета «Невыход»,


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

Запись расчета Невыход вытесняет запись расчета Оклад по


периоду действия

Период действия 31 день

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


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

Если рассмотреть структуру записей таблиц регистра расчета, то


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

Таблица фактического периода


Таблица регистра расчета действия

331
330
Использование основных объектов конфигурации План видов расчета, регистр расчета

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

Таблица регистра расчета


(периодичность регистра - «Месяц»)

Заключительной важной особенностью регистра расчета является


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

332 333
Использование основныхобъектов конфигурации План видов расчета, регистр расчета

В информационной структуре, созданной в базе данных на основе


объекта конфигурации Перерасчет, платформа хранит информацию о Создание регистра расчета Начисления

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

"" Узнай больше!


О структуре объектов встроенного языка, предназначенных для После этого создадим объект конфигурации Регистр сведений с
работы с регистром расчета, можно прочитать в главе «Регистры именем «ГрафикиРаботы». Этот регистр будет иметь два измерения:
расчета» на странице 606.
• «ГрафикРаботы», тип
СправочникСсылка.ВидыГрафиковРаботы,
Щ
• «Дата», тип Дата.
Затем создадим единственный ресурс регистра - «Значение», с
типом Число, длиной 1.
Запустим 1С:Предприятие в режиме отладки и заполним регистр
данными о рабочих днях марта графика мастеров. Чтобы проще
выполнить эту довольно однообразную работу, можете
воспользоваться возможностью добавления элементов в справочник

334 335
Использование основных объектов конфигурации План видов расчета, регистр расчета

копированием (Действия | Скопировать). Не забудьте, что 8 марта Укажем, что регистр расчета будет использовать базовый период, и
выходной день, и у вас должно получиться 22 рабочих дня в марте. периодичность регистра будет «Месяц».

Затем перейдем на закладку «Данные» и создадим:

• измерение «Сотрудник»,
тип СправочникСсылка.Сотрудники, базовое,
• ресурс «Результат», тип Число, длина 15, точность 2,
• реквизит «ГрафикРаботы»,
Теперь все готово для создания регистра расчета. тип СправочникСсылка.ВидыГрафиковРаботы, связь с
графиком по измерению «ГрафикРаботы»,
Создадим новый объект конфигурации Регистр расчета с именем • реквизит «ИсходныеДанные», тип Число, длина 15, точность
«Начисления». В качестве плана видов расчета, используемого 2.
регистром, выберем план видов расчетов «ОсновныеНачисления».
Установим, что регистр будет использовать период действия, график Реквизит «ГрафикРаботы» мы будем использовать для того, чтобы
будет задаваться в регистре сведений «ГрафикиРаботы», значение связать запись регистра с используемым графиком работы, а реквизит
графика будет находиться в ресурсе «Значение», а дата графика - в «ИсходныеДанные» - чтобы хранить в нем данные, которые могут
измерении «Дата». понадобиться при расчете или перерасчете (в нашем примере это будет
расчет оклада).

336 337
Использование основных объектов конфигурации План видов расчета, регистр расчета

Теперь перейдем на закладку «Перерасчеты». Создадим объект


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

338 339
Использование регистра расчета

Глава 10. Использование регистра Создание документа


расчета НачисленияСотрудникам
Теперь у нас все готово для того, чтобы начать разработку системы
расчета заработной платы OOO «На все руки мастер». В этой главе мы
создадим документ, с помощью которого будут выполняться
различные виды начислений, посмотрим, как и когда платформа
Д ля того, чтобы иметь возможность регистрировать в базе
данных начисления производимые сотрудникам OOO «На все
руки мастер», нам понадобится специальный документ.
Откроем конфигуратор и создадим новый документ. Назовем
формирует записи перерасчета, увидим, как работают механизмы его «НачисленияСотрудникам».
вытеснения по периоду действия и зависимости по базовому периоду. Этот документ будет иметь табличную часть «Начисления»,
Кроме этого мы создадим отчет, показывающий начисления содержащую следующие реквизиты:
сотрудникам OOO «На все руки мастер» и сделаем так, чтобы данные
расчетов можно было поддерживались в актуальном состоянии. • «Сотрудник», тип СправочникСсылка.Сотрудники,
В заключение мы познакомимся с новым элементом управления - • «ГрафикРаботы»,
Диаграмма Ганта, - и с его помощью наглядно проиллюстрируем типСправочникСсылка.ВидыГрафиковРаботы,
работу некоторых механизмов расчета. • «ДатаНачала», тип Дата,
• «ДатаОкончания», тип Дата,
• «ВидРасчета»,
тип ПланВидовРасчетаСсылка.ОсновныеНачисления,
• «Результат», Число, длина 15, точность 2.
Реквизиты «ДатаНачала» и «ДатаОкончания» понадобятся нам для
того, чтобы задавать период, в котором должна действовать запись
расчета.
На закладке «Движения» запретим оперативное проведение
документа, отметим, что документ будет создавать движения по
регистру расчета «Начисления» и запустим конструктор движений.

340 341
Использование основных объектов конфигурации Использование регистра расчета

В окне конструктора выберем табличную часть «Начисления» Движение.Сторно = Ложь; Движение.ПериодРегистрации = Дата;
нажмем «ЗаполнитьВыражения». Для реквизитов Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
«ПериодДействияКонец» и «БазовыйПериодКонец» укажем Движение.ПериодДействияКонец =
выражение «КонецДня(ТекСтрокаНачисления.ДатаОкончания)» КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Реквизиту «ИсходныеДанные» поставим в соответствие реквизит Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.БазовыйПериодКонец =
табличной части «Результат», а для реквизита «Результат» наоборот
КонеиДня(ТекСтрокаНачисления.ДатаОкончания);
удалим выражение, присвоенное ему конструктором: Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник; Движение.ГрафикРаботы =
ТекСтрокаНачисления.ГрафикРаботы; Движение.йсходныеДанные =
ТекСтрокаНачисления.Результат; КонецЦтота;
// записываем движения регистров
Движения.Начисления.Записать(); //}
}_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Запустим 1С:Предприятие в режиме отладки и посмотрим, как


работает наш документ.
Начислим оклад за март всем сотрудникам OOO «На все руки
мастер», как показано на рисунке:

Нажмем «ОК» и посмотрим текст обработчика, созданный


конструктором:

Процедура ОбработкаПроведения(Отказ. Режим)


//{{_KOHCTPyKTOP_ДВИЖЕНИЙ_PЕГИСТРОВ //
Данный фрагмент построен конструктором. // При
повторном использовании конструктора, // внесенные
вручную изменения будут утеряны!!! Для Каждого
ТекСтрокаНачисления Из Начисления Цикл
// регистр Начисления
Движение = Движения.Начисления.Добавить();

342 343
Использование основных объектов конфигурации Использование регистра расчета

Проведем документ и посмотрим, какие движения он сформировал


в регистре «Начисления»: Иллюстрация механизмов вытеснения и

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

На закладке «Отчет» сбросим флаг «Использовать построитель


Обратите внимание на то, что платформа привела период отчета» и нажмем «OK» - наш отчет готов.
регистрации каждой записи к началу периода регистра расчета (в
Запустим 1С:Предприятие в режиме отладки, сформируем отчет
обработчике проведения мы указывали значение даты документа - «Перерасчет» и убедимся, что пока он не содержит никаких данных.
08.04.2004). Кроме этого заметьте, что с каждой записью мы
сохранили в реквизите «ИсходныеДанные» размер оклада сотрудника, Создадим новый документ Начисление сотрудникам №2, в котором
начислим премию за март Гусакову и Деловому:
введенный в документе, чтобы в дальнейшем рассчитать сумму
оплаты по окладу.
Для дальнейшего изучения работы регистра расчета нам
понадобится служебный отчет, с помощью которого мы сможем
посмотреть содержимое записей перерасчета.

344 345
Использование основных объектов конфигурации Использование регистра расчета

Этим документом мы зафиксируем тот факт, что сотрудникам На этом примере мы с вами познакомились с тем, как работает
Гусакову и Деловому нужно начислить премию по итогам работы за механизм поддержки зависимости по базовому периоду у регистра
март. Поскольку размер премии нам неизвестен (он буде т расчета.
рассчитываться по некоторому алгоритму), поля «Результат» мц Теперь посмотрим, как работает механизм вытеснения по периоду
оставляем пустыми. Нажмем «ОК». действия. Для этого нам понадобится создать третий документ
Теперь снова откроем документ Начисление Сотрудникам №i и НачисленияСотрудникам №3:
изменим оклад Гусакова с 10 000 на 7 000. Нажмем «ОК»
Сформируем отчет «Перерасчет»:

Этим документом мы зафиксируем тот факт, что Гусаков не


Как видите, отчет теперь содержит какие-то данные. В самом деле, выходил на работу с 1 по 10 марта. Очевидно, что в этом случае
вид расчета «Премия» зависит у нас по базовому периоду от вида потребуется пересчитать его оплату по окладу и, как следствие,
расчета «Оклад». Как только мы изменили существовавшие в регистре начисленную премию.
записи по виду расчета «Оклад» - платформа сразу же сформировала Нажмем «ОК» и сформируем отчет «Перерасчет»:
набор записей перерасчета, которые должны быть рассчитаны заново,
т.к. изменилась их база.
Вы можете спросить: «почему в перерасчет попали записи как про
Делового, так и про Гусакова, хотя оклад мы меняли только
Гусакову»? Дело в том, что платформа не отслеживает конкретные
изменения, которые пользователь внес в записи документа. Она
отслеживает лишь факт изменения набора записей регистра расчета в
результате проведения (перепроведения) документа. Поэтому в набор
записей перерасчета она включает информацию о ВСЕХ записях
регистра, значение ресурсов которых МОЖЕТ измениться в результате
перепроведения документа, создавшего базовые записи регистра.
Перепроведем документ Начисления сотрудникам №2 (которым мЫ
начисляли премию) и сформируем отчет «Перерасчет». Он снова не Как вы видите, в перерасчет попала запись о начислении оклада
содержит никаких данных - система отметила тот факт, что M& Усакову. Это явилось результатом работы механизма вытеснения по
«пересчитали» зависимые записи и очистила таблицу перерасчета.

346 347
Использование регистра расчета
Использование основных объектов конфигурации

периоду действия, ведь вид расчета «Невыход» вытесняет у нас вил


Создание процедуры расчета записей
расчета «Оклад».
Обратите внимание, что в перерасчет попала и запись о начислении регистра Начисления
премии Гусакову. Если вы помните, при создании предопределенных
видов расчета мы указали, что результат вида расчета премия будет
зависеть от изменения результата вида расчета «Невыход». Эта
зависимость косвенная, но поскольку явно указали такую зависимость
Д о сих пор мы с вами просто заносили в регистр расчета
«Начисления» записи о том, что необходимо выполнить какой-
либо вид расчета. Но каким именно образом получать эти
результаты мы не говорили. Теперь настало время описать
платформа ее отследила. алгоритмы формирования различных видов расчетов.
Перепроведем документы Начисление сотрудникам №1 и №2 и Поскольку эти алгоритмы нам понадобится использовать не только
убедимся, что таблица перерасчета очистилась. в документе «Начисление сотрудникам», удобнее всего будет
разместить их в отдельном общем модуле.
Откроем в конфигураторе текст обработчика проведения документа
«НачислениеСотрудникам» и добавим в него вызов процедуры из
общего модуля:

Процедура ОбработкаПроведения(Отказ, Режим)


//{{_КОНСТ?УКТОР ДВИЖЕНИЙ_РЕГИСТРОВ //
Данный фрагмент построен конструктором. // При
повторном использовании конструктора, // внесенные
вручную изменения будут утеряны!!! Для Каждого
ТекСтрокаНачисления Из Начисления Цикл
// регистр Начисления
Движение = Движения.Начисления.Добавить();
Движение.Сторно = Ложь;
Движение.ПериодРегистрации = Дата;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец =
КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.БазовыйПериодКонец =
КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.ГрафикРаботы = ТекетрокаНачисления.ГрафикРаботы;
Движение.ИсходныеДанные = ТекСтрокаНачисления.Результат;
КонецЦикла;
// записываем движения регистров
Движения.Начисления.Записать();

//получим список всех сотрудников, содержащихся в документе


Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
__ I НачисленияСотрудникамНачисления.Сотрудник___________________________

349
348
Использование основных объектов конфигурации Использование регистра расчета

Теперь создадим в ветке «Общие» новый общий модуль


|ИЗ
| Документ.НачисленияСотрудникам.Начисления «ПроведениеРасчетов». Добавим в него заготовку процедуры
| КАК НачисленияСотрудникамНачисления «РасчитатьНачисления»:
|
|ГДЕ
| НачисленияСотрудникамНачисления.Ссылка = &ТекущийДокумент"); ПроцедураРасчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) Экспорт //Рассчитать первичные
Запрос.УстановитьПараметр("ТекущийДокумент",Ссылка); записи Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад
тогда
//сформируем список сотрудников ТаблЗнач =
Запрос.ВыполнитьО.Выгрузить(); //Рассчитать вторичные записи
МассивСотрудников = ТаблЗнач.ВыгрузитьКолонкуО'Сотрудник"); иначеЕсли ТребуемыйВидРасчета =
СписокСотрудииков = Новый СписокЗначений; ПланыВидовРасчета.ОсновныеНачисления.Премия тогда
СписокСотрудников.ЗагрузитьЗначения(МассивСотрудников); КонецЕсяи; КонецПроцедуры

РасчитатьНачисления(Двюкения.Начисления,
ПлапыВидовРасчета.ОсновныеНачисления.Оклад, Алгоритм расчета начислений будет различным при расчете
СписокСотрудников); первичных и вторичных записей, и каждая из его частей будет
Движения.Начисления.Записать(,Истнна); находиться в своей ветке условия Если...
РасчитатьНачиеления(Движении.Начисления, При расчете первичных записей нам понадобятся данные графика
ПланыВидовРасчета.ОсновныеНачисления.Премия, из регистра расчета, поэтому добавим в первую ветку условия запрос
СписокСотрудииков); по виртуальной таблице регистра расчета
Движения.НачисленияЛаписать(,Истина); «РегистрРасчета.Начисления.ДанныеГрафика»:
//} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
ПроцедураРасчитатьНачисления(НаборЗаписейРегистра,ТребуемыйВидРасчета,
Обратите внимание, что при проведении документа мы сначала СписокСотрудников) Экспорт /Рассчитать первичные
записываем движения, сформированные документом, в регистр, а записи Если ТребуемыйВидРасчета e ПланыВидовРасчета.ОсновныеНачисления.Оклад
тогда
затем передаем этот набор записей регистра в процедуру расчета.
Сначала для расчета первичных записей («Оклад»), а затем для расчета Запрос = Новый Запрос;
Запрос.Текст =
вторичных («Премия»). Процедура расчета, на основе описанных в ней
"ВЫБРАТЬ
алгоритмов и данных, содержащихся в записях регистра, должна |НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
сформировать значения ресурсов регистра. После того, как ресурсы |НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
будут рассчитаны, мы перезаписываем набор записей регистра без |КАК Факт,
формирования записей перерасчета (второй параметр в методе |НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
|ИЗ
Записать() - Истина. |РегистрРасчета.Начисления.ДанныеГрафика(
Перед вызовом процедуры из общего модуля мы формируем |Регистратор = &Регистратор И |ВидРасчета = &ВидРасчета И |Сотрудник В
список сотрудников, содержащихся в документе, чтобы передать его в (&СписокСотрудников)) |КАК НачисленияДанныеГрафика";
вызываемую процедуру. Запрос.УстановитьПараметр("Регистратор",
________________________ НаборЗаписейРегистра.Отбор.Регистратор.Значеяие);

350 351
Использование основных объектов конфигурации Использование регистра расчета

Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета); ВыборкаРезультата = Запрос.Выполнить().Выбрагь();


~^
^ Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
3anpoc.ycTaHOBHTbnapaMeTp("CnMcoKCoTpyflHHKOB",CnncoKCoTpyflHHKOB)-
СтруктураНомер = Новый СтруктураС'НомерСтроки");
ВыборкаРезультата = Залрос.Выполнить().Выбрать(); СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
/Л>ассчитать вторичные записи Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) тогда
иначеЕсли ТребуемыйВидРасчета = Если ВыборкаРезультата.Норма = 0 тогда
ПланыВидовРасчета.ОсновныеНачисления.Премиятогда Сообщить("Вид расчета: Оклад — Нет рабочих дней в заданном периоде",);
КонецЕсли; КонецПроцедуры ЗаписьРегистра.Результат = 0; Иначе
/Л*ассчитать оклад по фактическому периоду и исходным данным
ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные /
ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;
В этом запросе мы выбираем из виртуальной таблицы данных Сообщить("Выполнен расчет "+ЗаписьРегистра.Регистратор+" - "+
ЗаписьРегистра.ВидРасчета+" - "+ЗаписьРегнстра.Сотрудник,);
графика регистра расчета значение графика для периода действия и КонецЕсли; КонецЕсли; КонецЦикла;
для фактического периода действия. При задании параметров
виртуальной таблицы мы ограничиваем выборку регистратором, //Рассчитать вторичные записи
иначеЕсли ТребуемыйВидРасчета =
нужным нам видом расчета и списком сотрудников, по которым нужно
ПланыВидовРасчета.ОсновныеНачисления.Премиятогда
получить значения графика. КонецЕсли; КонецПроцедуры
Теперь добавим обход переданного в процедуру набора записей и
расчет записей, для которых получены значения графика: Для каждой записи из набора записей регистра расчета мы
получаем номер строки и по этому номеру ищем соответствующую
Процедура РасчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета, запись в выборке из результата запроса. Если в результате запроса есть
СписокСотрудников) экспорт /Рассчитать первичные запись с таким номером строки, мы рассчитываем результат записи
записи Если ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Оклад тогда регистра расчета.
Теперь добавим текст запроса во вторую ветку условия Если... с
Запрос = Новый Запрос;
Запрос.Текст =
той лишь разницей, что теперь мы будем получать значения базы,
"ВЫБРАТЬ используя виртуальную таблицу регистра расчета
| НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма, «РегистрРасчета.Начисления.БазаНачисления»:
| НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия
| КАКФакт,
| НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки ПроцедураРасчитатьНачисления(НаборЗаписейРегистра^ребуемыйВидРасчета,
|ИЗ СписокСотрудников) Экспорт //Рассчитать первичные
| РегистрРасчета.Начисления.ДанныеГрафика( записи Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад
| Регистратор = &Регистратор И тогда
| ВидРасчета = &ВидРасчета И
| Сотрудник В (&СписокСотрудников))
| КАКНачисленияДанныеГрафика";
// Рассчитать вторичные записи
Запрос.УстановитьПараметр("Регистратор",
НаборЗаписейРегистра.Отбор.Регистратор.Значение);
Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета);
ЗапросУстановитьПараметр("СписокСотрудников", СписокСотрудников);

352
353
Использование основных объектов конфигурации Использование регистра расчета

иначеЕсли ТребуемыйВвдРасчета = /Л'ассчитать вторичные записи


ПланыВидовРасчета.ОсновныеНачисления.Премиятогд иначеЕсли ТребуемыйВидРасчета =
ПланыВидовРасчета.ОсновныеНачисления.Премия тогда
Запрос = Новый Запрос;
Запрос.Текст = Запрос = Новый Запрос;
"ВЫБРАТЬ Запрос.Текст =
I НачиеленияБазаНачислення.РезультатБаза КАК База, "ВЫБРАТЬ
I НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки | НачисленияБазаНачисления.РезультатБаза КАК База,
1ИЗ | НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки
I РегистрРасчета.Начиеления.БазаНачисления( |ИЗ
I &ИзмереяияОсновного,
| РегистрРасчета.Начисления.БазаНачисления(
I &ИзмеренияБазового,,
| &ИзмеренияОсновного,
I Регистратор = &Регистратор И
| &ИзмереиияБазового,,
I ВидРасчета = &ВидРасчета И
| Регистратор = &Регистратор И
I Сотрудник В (&СписокСотрудников))
| ВидРасчета = &ВидРасчета И
I КАК НачисленияБазаНачисления";
| Сотрудник В (&СписокСотрудников))
| КАКНачисленияБазаНачисления";
Измер = Новый Maccив(1);
Измер[0] = "Сотрудник";
Измер = Новый Массив(1);
Запрос.УстановитьПараметр("ИзмеренияОсновного",Измер); Измер[0] = "Сотрудник":
Запрос.УстановитьПараметрС'ИзмеренияБазового", Измер);
Запрос.УстановитьПараметр("Регистратор",Регистратор); Запрос.УстановитьПараметр("ИзмеренияОсновного",Измер);
Запрос.УстановитьПараметр("ВидРасчета",Тре6уемыйВидРасчета); Запрос.УстановитьПараметрС'ИзмеренияБазового", Измер);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников); Запрос.УстановитьПараметр("Регистратор",Регистратор);
Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета);
ВыборкаРезультата = Запрос.Выполнить().Выбрать(); Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);

КонецЕсли; ВыборкаРезультата = ЗапросВыпоянить()-Выбрать();


КонецПродедуры
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый СтруктураС'НомерСтроки");
Здесь в параметрах виртуальной таблицы запроса мы, кроме СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
привычных для нас регистратора, вида расчета и списка сотрудников, ВыборкаРезультата.Сбросить();
задаем еще измерения основного и базового регистров. В нашем Если ВыборкаРезультата.НайтнСледующийССтруктураНомер) тогда
ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10/100);
случае это будет один и тот же регистр, а нужное нам измерение - Сообщить("Выполнен расчет "+ЗаписьРегистра.Регистратор+" - "+
«Сотрудник». ЗаписьРегистра.ВвдРасчета+" - "+ЗаписьРегистра.Сотрудник,);
КоиецБсли; КонецЦикла;
В заключение осталось добавить во второе условие Если ... обход
набора записей регистра расчета и вычисление результата вторичных КонецЕсли;
записей: КонедПроцедуры

ПроцедураРасчитатьНачисления{НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) Экспорт Сумму начисленной премии мы рассчитываем как 10% от
/Л>ассчитать первичные записи рассчитанной оплаты по окладу.
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад тогд»

354 355
Использование основных объектов конфигурации Использование регистра расчета

Запустим 1С:Предприятие в режиме отладки и провер Им


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

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

Гусакову и Деловому начислена премия в размере 10% от суммы


начисления по окладу.
Проведем документ Начисление сотрудникам №3, а затем №1 и№2.
Состояние регистра изменится следующим образом:

На закладке «Объединения/Псевдонимы» определим следующие


псевдонимы выбранных полей:

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

356 357
Использование основных объектов конфигурации Использование регистра расчета

На закладке «Порядок» отметим автоупорядочивание. На закладке


«Итоги» зададим получение общих итогов и промежуточных итогов по Выполнение перерасчета записей регистра
сотруднику: расчета

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

В обработчик события нажатия кнопки вставим текст вызова


процедуры перерасчета:

ПроцедураДействияФормыПерерасчитать(Кнопка)
ПерерасчитатьНачисления(ПланыВидовРасчета.ОсновныеНачисления.Оклад);
ПерерасчитатьНачисления01лаиыВидовРасчета.ОсновныеНачисления.Премия);
КонецПроцедуры

Саму процедуру перерасчета разместим в общем модуле


«ПроведениеРасчетов»:

Процедура ПерерасчитатьНачисления(ТребуемыйВидРасчета) экспорт


«здесь следует выбрать из набора записей перерасчета " записи в
следующей последовательности:
//записи документа1 для сотрудников из списка,

358 359
Использование основных объектов конфигурации Использование регистра расчета

//записи документа2 для сотрудников из списка, В самом начале процедуры мы выбираем запросом данные о
//и т.д. записях перерасчетов, содержащие переданный вид расчета и
Запрос = новый Запрос( сгруппированные по объекту перерасчета. Далее, при обходе
"ВЫБРАТЬ результата запроса, мы формируем для каждого объекта перерасчета
| НачисленияПерерасчет.ОбъектПерерасчета,
| НачисленияПерерасчет.Сотрудник