1С Предприятие 8.0. Практическое пособие разработчика

Скачать как pdf или txt
Скачать как pdf или txt
Вы находитесь на странице: 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 для сотрудников из списка, В самом начале процедуры мы выбираем запросом данные о
//и т.д. записях перерасчетов, содержащие переданный вид расчета и
Запрос = новый Запрос( сгруппированные по объекту перерасчета. Далее, при обходе
"ВЫБРАТЬ результата запроса, мы формируем для каждого объекта перерасчета
| НачисленияПерерасчет.ОбъектПерерасчета,
| НачисленияПерерасчет.Сотрудник список сотрудников, читаем соответствующие записи регистра расчета
|ИЗ и вызываем процедуру «РасчитатьНачисления», которая
| РегистрРасчета.Начисления.Перерасчет использовалась нами при расчете записей документа
| КАК НачисленияПерерасчет «НачисленияСотрудникам». После того, как расчет записей выполнен,
| мы записываем набор записей без формирования записей перерасчета
|ГДЕ и очищаем записи перерасчета по тому объекту перерасчета, который
| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета
|
только что обработали.
|ИТОГИ ПО Запустим 1С:Предприятие и проверим, как выполняется перерасчет
I НачисленияПерерасчет.ОбъектПерерасчета"); записей регистра расчета.
Запрос.УстановитьПараметрСТребуемыйВидРасчета'.ТребуемыйВидРасчета);
СписокСотрудников = Новый СписокЗначений; Отменим проведение всех документов «Начисления сотрудникам»
и проведем документ Начисления сотрудникам №1 и затем №2.
//перебрать группировку по регистратору
ВыборкаПоРегистратору = Запрос.Выполнить() Сформируем отчет «Начисления сотрудникам» (здесь и далее колонки
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); отчета с 4 по 6 скрыты, в целях экономии места):
Пока ВыборкаПоРегистратору.Следующий() цикл Регистратор =
ВыборкаПоРегистратору.ОбъектПерерасчета;

//перебрать группировку по сотрудникам


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

//получить набор записей регистра расчета


//для выбранного регистратора
НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;
НаборЗаписей.Прочитать();

РасчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);


НаборЗаписей.Записать(, Истина);

//очистить перерасчитанные записи в перерасчете


НаборЗаписейПерерасчета = РегистрыРасчета.Начисления.Перерасчеты
.Перерасчет.СоздатьНаборЗаписей();
НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор; Теперь откроем документ Начисления сотрудникам №1, изменим
НаборЗаписейПерерасчета.Записать(); КонецЦикла; КонецПроцедуры. оклад Гусакова на 10 000 и проведем документ. В отчете

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

«НачисленияСотрудникам» нажмем кнопку «Перерасчитать». Будет А данные отчета будут содержать актуальные значения начисления
выполнен перерасчет начисления премии Гусакову и Деловому: оклада и премии:

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


Гусакова:

И, наконец, проведем документ Начисления сотрудникам №3 и


нажмем «Перерасчет» в отчете «НачисленияСотрудникам». Снова
будет произведен перерасчет оклада и премии Гусакова:

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

Как мы уже говорили, эта диаграмма будет отображать для каждого


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

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

Диаграмма Ганта

Д иаграмма Ганта представляет собой диаграмму интервалов на


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

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


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

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

Запрос = Новый Запрос;


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

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

Все, запрос готов. Теперь нажмем «ОК» и добавим в процедуру


следующий текст:

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

ПроцедураКнопкаСформироватьНажатие(Элемент)

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

|ИЗ Сначала в переменной «Диаграмма» мы сохраняем расположенную


| РегистрРасчета.Начисления.ФактическийПериодДействия в форме диаграмму Ганта и запрещаем обновление диаграммы на то
время, пока мы будем заполнять ее данными. Это нужно для того,
| КАК НачисленияФактическийПериодДействия";
чтобы в процессе заполнения не выполнялись пересчеты при каждом
ВыборкаРезультата = Запрос.Выполнить().Выбрать(); изменении данных диаграммы. После окончания заполнения
диаграммы мы разрешим обновление, и все пересчеты будут
Диаграмма = ЭлементыФормы.ДиаграммаГанта: выполнены один раз.
// Запретить обновление диаграммы Затем в цикле по выборке запроса мы заполняем диаграмму.
Диаграмма.Обновление = Ложь; Сначала, используя методы УстановитьСерию() и
УстановитьТочку() мы получаем либо существующие, либо новые
Диаграмма.Очистить();
Диаграмма.ОтображатьЗаголовок = Ложь; точку и серию. Точки и серии однозначно идентифицируются своими
значениями, в качестве которых мы используем сотрудника и вид
//заполнить диаграмму Пока расчета из результата запроса.
ВыборкаРезультата.Следуюший() цикл
//получить серию, точку н значение для них После того, как точка и серия получены, с помощью метода
ТекущаяСерия=Диаграмма.УстановитьСерию(ВыборкаРезультата.ВидРасчета, ПолучитьЗначение() мы получаем соответствующее им значение
ВыборкаРезультата.ВидРасчета); диаграммы.
ТекущаяТочка = Диаграмма
.УстановитьТочкуСВыборкаРезультата.Сотрудник, Затем мы добавляем в значение диаграммы новый интервал, задаем
ВыборкаРезультага.Сотрудник); его начало и конец, задаем текст интервала, который будет
ТекущееЗначение = Диаграмма.ПолучитьЗначение(ТекущаяТочка, показываться во всплывающей подсказке, и задаем расшифровку
ТекущаяСерия); интервала, которая будет выполняться при двойном щелчке мышью на
этом интервале.
//создать нужные нам интервалы в значении
ТекущийИнтервал = ТекущееЗначеиие.Добавить(); После того, как все значения диаграммы сформированы, мы
ТекущийИнтервал.Начало = ВыборкаРезультата.ПериодДействияНачало; раскрашиваем серии своими цветами. Серии диаграммы представляют
ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец;
собой коллекцию значений, которую мы перебираем при помощи
ТекущийИнтервалЛ*екст = ВыборкаРезультата.РегистраторПредставление;
ТекущийИнтервал.Расшифровка = ВыборкаРезультата.Регистратор; конструкции Для каждого ... Цикл.
КонецЦикла; Запустим 1С:Предприятие в режиме отладки и посмотрим на
результат работы отчета:
//раскрасить серии своими цветами Для
Каждого Серия из Диаграмма.Серии цикл
Если Серия.Значение = ПланыВидовРасчета.ОсновиыеНачисления.Оклад тогда
Серия.Цвет = WEBЦвета.Желтый;
иначеЕсли Серия.Значение =
ПланыВидовРасчета.ОсновныеНачисления.Премиятогда
Серия.Цвет = WEBЦвета.Зеленый;
иначеЕсли Серия.Значение =
ПланыВидовРасчета.ОсновныеНачисления.Невыходтогда
Серия.Цвет = WEBЦвета.Красный;
КонецЕсли; КонецЦикла;

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


Диаграмма.Обновление = Истина;
КонецПроцедуры ______

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

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


периоду действия «в действии». Откроем документ Начисления Что нового мы узнали
сотрудникам №3 и вместо одного прогула с 1 по 10 число зададим
Гусакову два прогула: с 3 по 7 число и с 12 по 15 число.
Проведем документ и снова нажмем «Сформировать» в
отчете: - как создать движения документа по регистру расчета
- как запросом получить записи перерасчета -
как работает перерасчет - как рассчитать
записи регистра расчета
- как запросом получить данные графика и базы - как
выполнить перерасчет отдельных записей регистра расчета
- как получить запросом записи регистра расчета - как
получить запросом фактический период действия записей
Теперь вы наглядно видите, как записи вида расчета «Невыход» регистра расчета
вытеснили по периоду действия запись расчета «Оклад», изменив ее
- для чего используется диаграмма Ганта -
фактический период действия.
Следует отметить, что существует также возможность как устроена диаграмма Ганта
интерактивной настройки параметров диаграммы Ганта, доступная - как заполнить диаграмму Ганта данными
через пункт контекстного меню «Шкала времени и масштаб...».

370 371
Подсистема

Глава 11. Подсистема Зачем нужны подсистемы?


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

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

Создание подсистем

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


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

Будет удобно задать эти соответствия, воспользовавшись


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

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

Теперь, при перемещении по дереву конфигурации, в окне будет


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

Зададим принадлежность объектов конфигурации к подсистемам


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

376 377
Интерфейс, роль, список пользователей

Глава 12. Интерфейс, роль, список Объект конфигурации Роль


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

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

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

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

Слева, в списке объектов, перечислены все объекты и виды


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

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

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

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


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

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

Создадим новый объект конфигурации Интерфейс, и на экране


Объект конфигурации Интерфейс появится конструктор главного меню:

П омимо того, что для каждого пользователя необходимо


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

Создание интерфейсов Он содержит два списка: список подменю и список команд

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

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

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

Изменим текст пункта подменю

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


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

А при создании меню интерфейса «Администратор» мы не будем


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

387
386
Использование основных объектов конфигурации
Интерфейс, роль, список пользоват<

«Справка». Скорее всего, они понадобятся будущему администратору


информационной базы. Администрирование работы пользователей

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

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


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

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

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

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

Глава 13. Обмен данными


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

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


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

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

измененных данных переносится с помощью сообщений,


Общие сведения об обмене данными инфраструктура которых также поддерживается планами обмена.

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

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

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

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

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

частей, содержащих в свою очередь некоторое количество реквизитов


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

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

XML-сериализация

Т ермином XML-сериализация обозначается механизм,


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

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

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

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

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

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

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

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

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

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

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

Процедура ПриЗаписи(Отказ) Если


РегистрацияВНовыйУзел Тогда // Регистрация
изменений всех данных для узла
ПланыОбмена.ЗарегистрироватьИзменения(Ссылка)-
КонецЕсли;
КонецПроцедуры

Событие формы «ПриЗаписи» возникает после записи объекта


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

Процедура ПередЗаписью(Отказ)
РегистрацияВНовыйУзел = ЭтоНовый();
КонецПроцедуры

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

«ПрочитатьСообщенияСИзменениями» мы создадим позднее), а затем


Создание процедур обмена данными формируем для них сообщения, предназначенные для передачи и

Д ля инициализации обмена данными мы используем объек


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

О
КонедПроцедуры
ткроем конфигуратор и создадим новый объект
конфигурации Обработка с именем «ОбменДанными». Перейдем
на закладку «Прочее» и откроем модуль объекта. Создадим в нем Создание процедуры записи данных

С
процедуру «ОбменСФилиалами»: ами процедуры записи и чтения данных обмена мы разместим в
модуле объекта План обмена «ОбменСФилиалами». Сначала
Процедура ОбменСФилналами() Экспорт создадим процедуру, которая используется нами при обмене
ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать(); данными - «ЗаписатьСообщениеСИзменениями». Порядок создания
Пока ВыборкаУзлов.Следующий() Цикл
этой процедуры будет следующим: сначала мы сформируем имя
файла, который будет содержать данные для обмена:
// Произвести обмен данными со всеми узлами,
// кроме текущего (ЭтотУзел)
Если ВыборкаУзлов.Ссылка о ПланыОбмена Процедура ЗаписатьСообщениеСИзменениями() Экспорт
.Филиалы Сообщить(" ------- Выгрузка в узел" + Строка(ЭтотОбъект) + " ------------ ");
.ЭтотУзел() Тогда УзелОбъект = Каталог = КаталогВременныхФайлов();
ВыборкаУзлов.ПолучитьОбъект(); // Сформировать имя временного файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") +
// Получить сообщение "Message" + СокрЛЩПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" +
СокрЛП(Ссылка.Код) + ".xml";
УзелОбъект.ПрочитатьСообщениеСИзменениями();
Сообщить(" ------- Конец выгрузки ------------ ");
// Сформировать сообщение КонецПроцедуры
УзелОбъект.ЗаписатьСообщениеСИзменениямиО;

КонецЕсли; Для упрощения примера, мы будем обмениваться сообщениями


КонецДикла;
КонепПроцедуры
через каталог временных файлов. Имена сообщений стандартизованы
и имеют вид «Ме8$а§еКодУзлаОтправителя_КодУзлаПолучателя.хт1».
Алгоритм работы этой процедуры заключается в следующем: i После этого обратимся к механизмам записи/чтения XML
цикле мы перебираем узлы, которые содержатся в плане обмена документов и создадим новый объект ЗаписьХМЦ с помощью
«Филиалы», и для всех узлов, кроме себя самого, производим сначала которого откроем новый XML файл для записи, запишем в него
чтение сообщений, поступивших из других узлов обмена (процеДУРУ

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

объявление XML, и в конце процедуры завершим запись


закроем файл: ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Сообщить("--------Конец выгрузки-------------");
Процедура ЗаписатьСообщениеСИзменениями() Экспорт КонецПроцедуры
Сообщить("-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------- ");
Каталог = КаталогВременныхФайлов(); //
Сформировать имя временного файла ИмяФайла = После этого, чтобы получить данные, которые необходимо
Каталог +?(Прав(Каталог, 1) = "\","", "\") + сохранить в этом файле, мы обратимся к механизму регистрации
"Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + *_"
СокрЛП(Ссылка.Код) + ".xrnl; изменений и получим выборку из записей регистрации изменений,
предназначенных данному узлу.
// Создать объект записи XML //*** запись
XML документов ЗаписьXML = Новый При формировании выборки мы передаем вторым параметром
ЗаписьXML; номер сообщения, которым эти данные будут переданы:
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
Процедура ЗаписатьСообщениеСИзменениями() Экспорт
Сообщить(" ------- Выгрузка в узел " + Строка(ЭтотОбъект) + "----------");
ЗаписьXML.Закрыть();
Каталог = КаталогВременныхФайлов(); //
Сообщить(" ------- Конец выгрузки ------------");
Сформировать имя временного файла ИмяФайла =
КонецПроцедуры _________________________________________________ Каталог +?(Прав(Каталог, 1) = "\","", "\") +
"Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" +
Теперь мы обратимся к механизмам инфраструктуры сообщений и СокрЛП(Ссылка.Код) + ".xml";
создадим новый объект ЗаписьСообщенияОбмена, метод которого
// Создать объект записи XML //***
НачатьЗапись() позволяет, кроме всего прочего, создать очередной запись XML документов ЗаписьXML =
номер сообщения и записать заголовок сообщения в XML. В конце Новый ЗаписьXML;
процедуры мы опять же закончим запись сообщения: ЗaписьXML.OткpытьФaйл(ИмяФaйлa);
ЗaписьXML.ЗаписатьОбъявлениеXML();

Процедура ЗаписатьСообщениеСИзменениями() Экспорт //*** инфраструктура сообщений


Сообщить(" ------- Выгрузка в узел " + Строка(ЭтотОбъект) + "-------------- "); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
Каталог = КаталогВременныхФайлов(); // ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
Сформировать имя временного файла ИмяФайла = Сообщить(" Номер сообщения:" + ЗаписьСообщения.НомерСообщения);
Каталог +?(Прав(Каталог, 1) = "\","", "\") +
"Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_* // Получить выборку измененных данных
//*** механизм регистрации изменений
СокрЛП(Ссьшка.Код) + ".xml*;
ВыборкаИзменений = ПланыОбмена
// Создать объект записи XML //*** .ВыбратьИзмененияЗаписьСообщения.Получатель,
запись XML документов ЗаписьXML = ЗаписьСообщения.НомерСообщеиия);
Новый ЗаписьХМЦ
ЗаписьСообщения.ЗакончитьЗапись();
ЗaпиcьXML.OткpьrтьФaйл(ИмяФaйлa);
ЗаписьXML.Закрыть();
ЗaписьXML.ЗаписатьОбъявлениеXML();
Сообщить("--------Конец выгрузки------------ ");
КонецПроцедуры
//*** инфраструктура сообщений
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщенияО;
ЗаписьСообщения.НачатьЗапись(ЗаписьХМЬ, Ссылка);
Сообщить(" Номер сообщения; " + ЗаписьСообщения.НомерСообшения),^

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

Теперь осталось только перебрать выборку записей в цикле


сериализовать их в открытый XML файл:
ПроцедураПрочитатьСообщениеСИзменениями() Экспорт
Каталог = КаталогВременныхФайлов();
Процедура ЗаписатьСообщениеСИзменениями() Экспорт
Сообщить(" ------- Выгрузка в узел " + Строка(ЭтотОбъект) + "------------- "); // Сформировать имя файла
Каталог = КаталогВременныхФайлов(); // ИмяФайла= Каталог+ ?(Прав(Каталог, 1) = "\","", "\") + "Message" +
Сформировать имя временного файла ИмяФайла = СокрЛП(Ссылка.Код) + "_" +
Каталог +?(Прав(Каталог, 1)= "\'\"", "\") + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml" Файл =
"Message" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" + Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда
СокрЛП(Ссылка.Код) + ".xml"; Возврат;
КонецЕсли;
// Создать объект записи XML //*** запись
XML документов ЗаписьXML = Новый УдаяитьФайлы(ИмяФайла);
ЗаписьXML; Сообщить(" ------- Конец загрузки ------------ ");
ЗаписьXML.ОткрытьФайл(ИмяФайла); КонецПроцедуры
ЗаписьXML.ЗаписатьОбъявлениеXML();

//*** инфраструктура сообщений Сначала мы формируем имя файла, которое надеемся найти в этом
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); каталоге, а затем, создав новый объект Файл с таким именем,
ЗаписьСообщения.НачатьЗапись(ЗаписьXML,Ссылка); проверяем, существует ли он. Если такого файла нет, мы завершаем
Сообщить(" Номер сообщения:" + ЗаписьСообщения.НомерСообщения);
работу процедуры. Если же такой файл найден, нужно будет удить его
// Получить выборку измененных данных после того, как все данные, содержащиеся в нем, будут обработаны.
//*** механизм регистрации изменений
ВыборкаИзменений = ПланыОбмена
Теперь добавим в процедуру команды чтения найденного файла с
.ВыбратьИзменения(ЗаписьСообщения.Получатель, данными обмена:
ЗаписьСообщения.НомерСообщения);
Пока ВыборкаИзмеиений.Следующий() Цикл Процедура ПрочитатьСообщениеСИзменениями() Экспорт
// Записать данные в сообщение Каталог = КаталогВременныхФайлов();
//***XML-сериализация
ЗаписатьХМЦЗаписьХМЬ,ВыборкаИзменешш.Получить()); // Сформировать имя файла
КонецЦикла; ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message" +
СокрЛП(Ссылка.Код) + "_* +
ЗаписьСообщения.ЗакончитьЗапись();
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел()-Код) + ".xml"; Файл =
ЗаписьXML.Закрыть();
Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда
Сообщить(" --------Конец выгрузки------------ ");
Возврат;
КонецПроцедуры
КонецЕсли;

//*** Чтение документов XML //


Попытаться открыть файл
На этом создание процедуры записи данных обмена закончено. ЧтениеXML = Новый ЧтениеXML;
Попытка
Создание процедуры чтения данных ЧтениеXML.ОткрытьФайл(ИмяФайла);

П
Исключение
орядок создания процедуры чтения данных обмена будет таким Сообщить("Невозможно открыть файл обмена данными.");
же, как и ранее: сначала мы сформируем имя файла,
содержащего данные обмена:
410 411
Использование основных объектов конфигурации Обмен данными

// Загрузить из найденного файла //*** Инфраструктура


Возврат;
сообщений ЧтениеСообщения =
КонецПопытки;
Сообщить("------- Загрузка из " + Строка(ЭтотОбъект) + " ------------ "); ПланыОбмена.СоздатьЧтениеСообщения();
Сообщить(" - Считывается файл " + ИмяФайла);
//читать заголовок сообщения обмена данными - файла XML
ЧтениеХМЬ.Закрыть(); ЧтениеСообщения.НачатьЧтение(ЧтениеХМЬ),-
УдалитьФайлы(ИмяФайла);
Сообщить(" ------- Конец загрузки------------ "); ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеХМЬ.Закрыть();
КонецПроцедуры
УдалитьФайлы(ИмяФайла);
Сообщить(" ------- Конец загрузки ------------ ");
Именно в этот момент мы обращаемся к механизмам записи/чтения КонецПроцедуры
документов XML, которые работают с ними на «базовом» уровне.
Для этого мы создаем новый объект ЧтениеХМЦ с помощью Здесь мы обращаемся к механизмам инфраструктуры сообщений
которого открываем найденный файл для чтения. В случае успеха мы планов обмена и создаем объект ЧтениеСообщенияОбмена.
выводим сообщение о начале загрузки данных из файла. В конце Используя метод этого объекта НачатьЧтение() мы считываем
процедуры мы также прекращаем чтение XML-данных из файла заголовок XML-сообщения, в котором содержится, в том числе,
методом Закрыть(). информация об отправителе сообщения. После того, как все
Полученные таким образом данные должны являться некоторым сообщение будет нами обработано, мы заканчиваем чтение.
сообщением обмена данными. Для того, чтобы представить их в Теперь, когда мы представили данные обмена в виде сообщения и
терминах сообщений, мы добавим в процедуру следующий код: получили его заголовок, можно произвести одну проверку перед тем,
как начать собственно обрабатывать данные:
Процедура ПрочитатьСообщениеСИзменениями() Экспорт
Каталог = КаталогВременныхФайяов(); Процедура ПрочитатьСообщениеСИзменениями() Экспорт
Каталог = КаталогВременныхФайлов();
// Сформировать имя файла
ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message" + // Сформировать имя файла
СокрЛП(Ссылка.Код) + "_" + ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message" +
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + " .xml" СокрЛП(Ссылкз.Код) + "_" +
Файл = Новый Файл(ИмяФайла); СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml"; Файл =
Если Не Файл.Существует() Тогда Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда
Возврат; Возврат;
КонецЕсли; КонецЕсли;

//*** Чтение документов XML // //*** Чтение документов XML //


Попытаться открыть файл Попытаться открыть файл
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML = Новый ЧтениеXML;
Попытка Попытка
ЧтениеXML.ОткрытьФайл(ИмяФайла); ЧтениеXML.ОткрытьФайл(ИмяФайла);
Исключение Исключение
Сообщит("'Невозможно открыть файл обмена данными."); Сообщить("Невозможно открыть файл обмена данными.");
Возврат; Возврат;
КонецПопытки; КонецПопытки;
Сообщить("......... - Загрузка из " + Строка(ЭтотОбъект) + " ------------ "); Сообщить("---------Загрузка из " + Строка(ЭтотОбъект) + " ...............-");
Сообщить(" - Считывается файл " + ИмяФайла);

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

Сообщить(" - Считывается файл " + ИмяФайла); ЧтениеXML = Новый ЧтениеXML;


Попытка
// Загрузить из найденного файла //*** Инфраструктура ЧтениеXML.ОткрытьФайл(ИмяФайла);
сообщений ЧтениеСообщения = Исключение
ПланыОбмена.СоздатьЧтениеСообщения(); Сообщить("Невозможно открыть файл обмена данными.");
Возврат;
//читать заголовок сообщения обмена данными - файла XML КонецПопьггки;
ЧтениеСообщения.НачатьЧтение(ЧтениеXML); Сообщить(" ------- Загрузкаиз " + Строка(ЭтотОбъект) + " ------------ ");
Сообщить(" - Считывается файл " + ИмяФайла);
// Сообщение предназначено не для этого узла
Если ЧтениеСообщения.Отправитель <> Ссылка Тогда // Загрузить из найденного файла //*** Инфраструктура
ВызватьИсключение "Неверный узел"; сообщений ЧтениеСообщения =
КонецЕсли; ПланыОбмена.СоздатьЧтениеСообщения();

ЧтениеСообщения.ЗакончитьЧтение(); //читать заголовок сообщения обмена данными - файла XML


ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяФайла);
Сообщить("--------Конец загрузки-........... —"); // Сообщение предназначено не для этого узла
КонецПроцедуры Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
ВызватьИсключение "Неверный узел";
Мы проверяем, является ли отправитель сообщения тем узлом, для КонецЕсли;

которого мы в данном вызове этой процедуры производим обмен // Удаляем регистрацию изменений
данными. // для узла отправителя сообщения
//*** служба регистрации изменений
Если все в порядке, то перед тем, как начать чтение данных следует
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,
удалить все записи регистрации изменений, которые были сделаны для ЧтениеСообщения.НомерПринятого);
этого узла и соответствовали номерам сообщений меньше или равным ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть();
тому, который указан в обрабатываемом нами сообщении как номер УдалитьФайлы(ИмяФайла);
Сообщить(" ------- Конец загрузки------------ ");
принятого. Это делается затем, чтобы исключить повторную посылку КонецПроцедуры
данных, которые уже были ранее посланы этому узлу и им
обработаны:
Обратите внимание, что здесь мы обращаемся к службе
Процедура ПрочитатьСообщениеСИзменениями() Экспорт регистрации изменений и используем метод
Каталог = КаталогВременныхФайлов(); УдалитьРегистрациюИзменений() для выполнения описанных
действий.
// Сформировать имя файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message" + Теперь, наконец, мы можем приступить к чтению непосредственно
СокрЛП(Ссылка.Код) + "_" + самих данных, содержащихся в сообщении:
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml"
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда Процедура ПрочитатьСообщениеСИзменениями() Экспорт
Возврат; Каталог = КаталогВременныхФайлов();
КонецЕсли;
// Сформировать имя файла
//*** Чтение документов XML // ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\")+
Попытаться открыть файл _ "Message" + СокрЛП(Ссылка.Код) + "_" +

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

СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml"; Чтение данных выполняется в цикле, причем мы снова обращаемся


Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда к механизмам XML-сериализации и методом глобального контекста
Возврат; ЕЗозможностьЧтенияХМЦ) получаем очередной тип данных XML из
КонецЕсли;
объекта 4TeHneXML и определяем, имеется ли соответствующий тип
//*** Чтение документов XML // 1С:Предприятия. В случае успеха выполнение цикла продолжается.
Попытаться открыть файл И первое, что нам нужно сделать - представить данные XML в виде
ЧтениеXML = Новый ЧтениеXML;
Попытка
некоторого значения, имеющего тип 1С:Предприятия. Для этого мы
ЧтениеXML.ОткрытьФайл(ИмяФайла); используем метод глобального контекста ПрочитатьХМЦ):
Исключение
Сообщить("Невозможно открыть файл обмена данными."); Процедура ПрочитатьСообщениеСИзменениями() Экспорт
Возврат; Каталог = КаталогВременныхФайлов();
КонецПопытки;
Сообщить(" ------- Загрузка из " + Строка(ЭтотОбъект) +"-------------"); // Сформировать имя файла
Сообщить(" - Считывается файл " + ИмяФайла); ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message" +
СокрЛП(Ссылка.Код) + "_" +
// Загрузить из найденного файла //*** Инфраструктура СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml"; Файл =
сообщений ЧтениеСообщения = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда
ПланыОбмена.СоздатьЧтениеСообщения(); Возврат;
КонецЕсли;
//читать заголовок сообщения обмена данными - файла XML
ЧтениеСообщения.НачатьЧтение^тениеXML); //*** Чтение документов XML //
Попытаться открыть файл
// Сообщение предназначено не для этого узла ЧтениеXML = Новый ЧтениеXML;
Если ЧтениеСообщения.Отправитель <> Ссылка Тогда Попытка
ВызватьИсключение "Неверный узел"; ЧтениеXML.ОткрытьФайл(ИмяФайла);
КонецЕсли; Исключение
Сообщить("Невозможно открыть файл обмена данными.");
// Удаляем регистрацию изменений // для узла отправителя сообщения //*** Возврат;
служба регистрации изменений КонецПопытки;
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, Сообщить(" ------- Загрузка из " + Строка(ЭтотОбъект) + "-------------*);
ЧтениеСообщения.НомерПринятого);
Сообщить(" - Считывается файл " + ИмяФайла);

// Читаем данные из сообщения // Загрузить из найденного файла //*** Инфраструктура


//*** XML-сериалшация сообщений ЧтениеСообщения =
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл ПланыОбмена.СоздатьЧтениеСообщения();
//читать заголовок сообщения обмена данными - файла XML
КонецЦикла;
ЧтениеСообщения.НачатьЧтение(ЧтеииеXML);
ЧтениеСообщения.ЗакончитьЧтение(); // Сообщение предназначено не для этого узла
ЧтениеXML.Закрыть(); Если ЧтениеСообщения.Отправитель о Ссылка Тогда
УдалитьФайлы(ИмяФайла); ВызватьИсключение "Неверный узел";
Сообщить("--------Конец загрузки ------------"); КонецЕсли;
КонецПроцедуры _______
// Удаляем регистрацию изменений

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

// для узла отправителя сообщения // Загрузить из найденного файла //*** Инфраструктура


//*** служба регистрации изменений
сообщений ЧтениеСообщения =
ПланыОбмена.УдалитьРегастрациюИзменени(ЧтениеСообщения.Отправитель,
ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НомерПринятого)-
//читать заголовок сообщения обмена данными - файла XML
// Читаем данные из сообщения ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
//*** XML-сериализация
Пока ВозможностьЧтенияXMLЧтениеХМЬ) Цикл // Сообщение предназначено не для этого узла
// Читаем очередное значение Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
Данные = ПрочитатьXML(ЧтениеXML); ВызватьИсключение "Неверный узел";
КонецЕсли;
КонецЦикла;
// Удаляем регистрацию изменений // для узла отправителя сообщения //***
ЧтениеСообщения.ЗакончитьЧтениеО; служба регистрации изменений
ЧтениеХМЬ.Закрыть(); ПланьОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,
УдалитьФайлы(ИмяФайла); ЧтениеСообщения.НомерПринятого);
Сообщить("-------- Конец загрузки ------------");
КонецПроцедуры // Читаем данные из сообщения
//*** XML-сериализация
В результате выполнения этого метода переменная «Данные» будет Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
// Читаем очередное значение
содержать объект 1С:Предприятия, соответствующий данным XML. Данные = ПрочитатьXMLЧтениеXML);
Теперь, после того, как объект 1С:Предприятия получен, следует
// Не переносим изменение полученное // в главный
разрешить возможную коллизию:
из неглавного // если есть регистрация изменения
Если Не ЧтениеСообщения.Отправитель.Главный И
Процедура ПрочитатьСообщениеСИзменениями() Экспорт ПланыОбмена
Каталог = КаталогВремениыхФайлов(); .ИзменеииеЗарегистрировано(ЧтениеСообщения.Отправитель,
Данные) Тогда
// Сформировать имя файла Сообщить("- Изменения отклонены");
ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message" + Продолжить; КонецЕсли;
СокрЛП(Ссылка.Код) + "_" +
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml" КонецЦикла;
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда ЧтениеСообщения.ЗакончитьЧтение();
Возврат; ЧтениеXML.Закрыть();
КонецЕсли; УдалитьФайлы(ИмяФайла);
Сообщить("--------Конец загрузки-------------");
//*** Чтение документов XML // КонецПроцедуры
Попытаться открыть файл ЧтениеXML =
Новый ЧтениеXML; Попытка
ЧтeниeXML.OткpытьФaйл(ИмяФaйлa); Возможная коллизия разрешается следующим образом: мы
Исключение Сообщить("Невозможно открыть файл обмена проверяем, является ли узел-отправитель главным узлом и есть ли
данными."); записи об изменении этого объекта для этого узла в нашей базе
Возврат;
КонецПопытки;
Сообщить(" ------- Загрузка из " + Строка(ЭтотОбъект) + " -------------");
Сообщить(" - Считывается файл " + ИмяФайла);

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

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


ЧтениеСообшения.НомерПринятого);
не является главным узлом, мы отклоняем запись полученного
объекта. Во всех остальных случаях мы принимаем изменения // Читаем данные из сообщения
//*** XML-сериализация
полученного объекта.
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
Теперь единственное, что нам осталось сделать - записать // Читаем очередное значение
полученные данные: Данные = ПрочитатьXMLЧтениеXML);

// Не переносим изменение полученное // в главный


Процедура ПрочитатьСообщениеСИзменениями() Экспорт из неглавного // если есть регистрация изменения
Каталог = КаталогВременныхФайлов(); Если Не ЧтениеСообщения.Отправитель.Главный И
ПланыОбмена.ИзменениеЗарегистрировано(ЧтениеСообщения.Отправитель,
// Сформировать имя файла Данные) Тогда
ИмяФайла = Каталог +?(Прав(Каталог, 1) = "V,"", "\") + "Message" + Сообщить("- Изменения отклонены");
СокрЛП(Ссылка.Код) + "_" + Продолжить; КонецЕсли;
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + " .xml";
Файл = Новый Файл(ИмяФайла); // Записать полученные данные
Если Не Файл.Существует() Тогда Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Возврат; Даниые.ОбменДанными.Загрузка = Истина;
КонецЕсли; ДанныеЗаписать();
КонецЦикла;
//*** Чтение документов XML //
Попытаться открыть файл ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.Закрьпъ();
Попытка УдалитьФайлы(ИмяФайла);
ЧтениеXML.ОткрытьФайл(ИмяФайла); Сообщить("--------Конец загрузки-------------");
Исключение КонецПроцедуры
Сообщить("Невозможно открыть файл обмена данными.");
Возврат;
КонецПопытки; Перед записью полученного объекта мы устанавливаем у него в
Сообщить("--------Загрузка из " + Строка(ЭтотОбъект) + " -------------"); параметрах обмена данными узел-отправителя, для того, чтобы
Сообщить(" - Считывается файл " + ИмяФайла);
система, при записи этого объекта в нашей базе данных, не
// Загрузить из найденного файла //*** Инфраструктура формировала записи регистрации изменений этого объекта для того
сообщений ЧтениеСообщения = узла, от которого мы его только что получили.
ПланыОбмена.СоздатьЧтениеСообщения(); Кроме этого, в параметрах обмена данными мы устанавливаем
//читать заголовок сообщения обмена данными - файла XML
свойство «Загрузка», информирующее систему о том, что запись
ЧтениеСообщения.НачатьЧтение^тениеXML); объекта будет происходить в режиме обновления данных, полученных
в результате обмена. Такое указание позволяет системе упростить
// Сообщение предназначено не для этого узяа процедуру записи объекта, отказавшись от ряда стандартных проверок
Если ЧтениеСообщения.Отправитель <> Ссылка Тогда и исключив изменения связанных данных, которые выполняются при,
ВызватьИсключение "Неверный узел";
обычной записи.
КонецЕсли;
На этом создание процедуры получения и обработки данных
// Удаляем регистрацию изменений // для узла отправителя сообщения //*** служба обмена закончено.
регистрации изменений
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,_

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

Затем создадим новый узел, который будет соответствовать базе


Проверка работы обмена данными

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

Теперь вызовем обработку «ОбменДанными» и нажмем


«Выполнить». В окне сообщений появится следующий текст:

После этого откроем план обмена «Филиалы» и зададим параметры


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

423
d?.7
Использование основных объектов конфигурации Обмен данными

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

Затем откроем план обмена «Филиал» и опишем предопределенный


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

После этого создадим новый узел плана обмена с кодом «ЦБ»,


наименованием «Центральная база» и признаком «Главный»:

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

Основные сведения о распределенных


Механизм распределенных информационных базах

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

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

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

Разрешение коллизий также будет производиться исходя Из


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

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

Постановка задачи

В качестве примера, на котором мы проиллюстрируем


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

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

На следующем шаге укажем каталог информационной базы и


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

Конфигурация подчиненного узла защищена от изменений


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

Стали доступны команды работы с распределенной


информационной базой...

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


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

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

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

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


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

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

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

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

В начале процедуры мы вызываем диалог выбора каталога, в


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

ончить запись сообщения и запись ХМL


ЗаписьСообщения.ЗакончитьЗапись();

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

ЗаписьХМL.Закрыть();
И последним мы создадим обработчик нажатия кнопки «Прочитать
изменения»:
Предупреждение("Запись изменений завершена.");
КонецЕсли; КонецПроцедуры
ПроцедураКнопкаПрочитатьИзмененияНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
В начале процедуры мы вызываем диалог ввода имени файла, в Диалог.Заголовок = "Укажите файл обмена:"; Если Диалог.Выбрать() Тогда
который будут записаны изменения. После этого мы создаем объект
3arwcbXML для работы с этим файлом. Затем создаем объект // Создать я проинициализаровать объект ЧтениеХМL
ЗаписьСообщенияОбмена, с помощью которого будем создавать ЧтениеХМL = Новый ЧтениеХМL;
ЧтениеХМL.ОткрытьФайл(Диалог.ПолноеИмяФайла);
сообщение обмена. В методе НачатьЗапись(), во втором параметре,
мы указываем, для какого узла обмена будет создаваться это // Создать объект ЧтениеСообшенияОбмена //
сообщение. После этого мы выполняем метод ЗаписатьИзменения() и начать чтение сообщения
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
объекта ПланыОбменаМенеджер, который и записывает изменения, ЧтениеСообщения.НачатьЧтение(ЧтениеХМL);
предназначенные для передачи в выбранный узел, в указанное
сообщение обмена. В заключение мы как обычно заканчиваем запись // Прочитать содержимое тела сообщения
ПланыОбмена.ПрочитатьИзмененияЧтениеСообщения);
сообщения обмена и закрываем файл.
// Закончить чтение сообщения и чтение XML
ЧтениеСообщения.ЗакончитьЧтение();
<*■ Узнай больше! ЧтениеХМL. Закрыть();
Следует отметить, что метод ЗаписатьИзменения() позволяет
Предупреждение("Чтение изменений завершено.");
задать максимальное число элементов данных, которые помещаются КонецЕсли; КонецПроцедуры
в сообщение в рамках одной транзакции базы данных. По умолчанию
все данные помещаются в сообщение в рамках одной транзакции.
В начале процедуры мы снова вызываем диалог ввода имени файла,
Такой режим является рекомендуемым, так как гарантирует
который будет прочитан, и создаем объект ЧтениеХМЬ для работы с
согласованность данных, помещаемых в сообщение.
этим файлом. Затем создаем объект ЧтениеСообщенияОбмена для
Но при создании сообщения в многопользовательском режиме чтения сообщения, содержащегося в указанном файле. Затем методом
могут быть конфликты блокировок между транзакцией, в которой ПрочитатьИзменения() объекта ПланыОбменаМенеджер мы
данные помещаются в сообщение, и транзакциями, выполняемыми читаем полученное сообщение. В заключение процедуры мы
другими пользователями. Для снижения вероятности возникновения завершаем чтение сообщения обмена и закрываем файл.
таких конфликтов можно задать значение этого параметра, Проверить работу нашей обработки можно на примере,
отличное от значения no умолчанию. Чем меньше значение аналогичном приведенному в разделе универсального обмена
параметра, тем меньше вероятность конфликта блокировок, но Данными.
выше вероятность помещения в сообщение несогласованных данных.
Учитывая все вышесказанное, идеальным вариантом являегпсЯ
выполнения обмена данными в монопольном режиме. Однако такой
вариант не всегда приемлем, в силу специфики организации работы
конкретных информационных баз.

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

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

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

элемента данных в узле-отправителе будет установлено таким же, как // В информационной базе Узла1
и в нашей базе. ПланыОбменаМенеджер.УстановитьГлавныйУзел(Узел2);

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


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

// В информационной базе Узла1


ПланыОбменаМенеджер.УстановитьГлавныйУзел(Неопредеяено);

Для этого следует выполнить следующие действия:

// В информационной базе Узла2


ПланыОбменаМенеджер.УстановитьГлавныйУзел(Неопределено);

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

Кроме этого мы можем создавать распределенную


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

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


обмена данными
- для чего предназначен объект конфигурации План обмена -
каковы основные составляющие плана обмена - что такое
узлы плана обмена - что такое состав плана обмена, и для
каких элементов
данных возможен обмен данными -
// В информационных базах Узла2, УзлаЗ н Узла4
ПланыОбменаМенеджер.УстанавитьГлавныйУзел(Узел 1);
что такое авторегистрация
- для чего предназначен механизм регистрации изменений -
как работает инфраструктура сообщений - каково
назначение XML-сериализации - для чего используется
запись/чтение документов XML - как создать план обмена
- как настроить конфигурацию для обмена данными - как
реализовать обмен данными в общем виде - как
реализовать обмен данными в распределенной
информационной базе - как программно управлять
обменом данными в
распределенной информационной базе
- как изменить структуру дерева распределенной
информационной базы

442 443
Анализ и прогнозирование данных

Глава 14. Анализ и прогнозирование Общие сведения об анализе и


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

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


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

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

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

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

446 447
Использование основных объектов конфигурации Анализ и прогнозирование даннь IX

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

448 449
Использование основных объектов конфигурации Анализ и прогнозирование Цанщ

Если обобщить обе схемы, представленные выше, то анализ и


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

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

Общая статистика

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

• количество значений - количество значений, присутствующих


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

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

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

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

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

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

Общая статистика

Информация о данных
Т ип анализа АнализДанныхПоискАссоциаций предназначен
для поиска часто встречаемых вместе групп объектов или
значений характеристик, а также выполняет поиск правил
ассоциаций. Этот тип анализа может использоваться для определения
часто приобретаемых вместе товаров или услуг.
Количествообьектов: 20
Типы колонок источника данных:
Непрерывные поля
• Не используется - колонка не используется в анализе.
• Объект - колонка содержит объект, например документ
«Оказание услуги».
Дискретные поля
• Элемент - колонка содержит элемент, например
Контрагент номенклатуру из документа «Оказание услуги».
Количество значений: 20
Количествоуникальных значений;
Мода: Федоров Д.Е.
6 Параметры:

Таблица частот • МинимальныйПроцентСлучаев - (Число) - минимальный


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

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

объект с его характеристиками. Событийный - источник


данных содержит список событий. Например, состав Пример

В
документа «Оказание услуги». качестве примера возьмем данные регистра «Продажи»: поле
ИспользованиеЧисловыхЗначений ~ (как булево, как число) «Регистратор» и измерение «Номенклатура»:
как интерпретировать числовые значения. Можно
интерпретировать числовые значения как числа или как
логические значения, т.е. рассматривать ноль как Ложь, а все
остальные ненулевые значения как Истина.
ИгнорироватьНезаполненныеЗначения ~ (Булево) - Как
использовать незаполненные значения. Т.е. игнорировать их
или нет.
Порядок - (по достоверности, по значимости, по количеству
случаев) - определяет порядок отображения данных в
результате анализа.

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

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


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

Т
ип анализа АнализДанныхПоискПоследовательностей
предназначен для выявления в источнике данных
Поиск ассоциативных правил последовательных цепочек событий. Например, это может
быть цепочка услуг, которые часто последовательно
Параметры анализа заказывают клиенты.
Минимальный процент случаев:
Минимальнаядостоверность: 60 Поддерживается поиск по иерархии, что позволяет отслеживать не
Минимальная значимость:
Отсечениеправил:
0
Избыточные
только последовательности конкретных событий, но и
последовательности родительских групп.
Колонки источника данных
Входные колонки
Набор параметров анализа позволяет ограничивать временные
расстояния между элементами искомых последовательностей, а также
регулировать точность получаемых результатов.
Информация о данньк Типы колонок источника данных:
Количество элементов: 12
Количество обьектов: 11
Средиее количество элементов в объекте: 1,82 • Не используется - колонка не используется в анализе.
Результат анализа
• Элемент - колонка содержит исследуемый элемент.
Найдено часто встречаемых групп: 4
Например, в случае исследования продаж, это может быть
Найдено ассоциативных правил: 5
колонка, содержащая товар.
Часто встречаемые группы • Последовательность - колонка содержащая
последовательности. Например, это может быть контрагент.
• Время - время события.
Параметры:

• МинимальныйПроцентСлучаев - (Число) - минимальное


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

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

КратностъМинималъногоИнтервала - (Число) - кратность Пример

В
минимального интервала качестве примера снова возьмем данные регистра «Продажи»:
МаксималъныйИнтервал - (Булево) - признак того, что измерения «Номенклатура», «Контрагент» и поле «Период»:
установлен максимальный интервал между наблюдаемыми
событиями. Установка максимального интервала означает, что
для того, чтобы элементы попали в искомую
последовательность необходимо, чтобы временной интервал
между элементами был не более установленного.
ЕдиницаМаксималъногоИнтервала - единица максимального
интервала
КратностъМаксималъногоИнтервала - (Число) - кратность
максимального интервала
ИнтервапЭквивалентностиВремени - (Булево) - признак
того, что установлен интервал эквивалентности времени
между наблюдаемыми событиями. Если установлен интервал
эквивалентности времени, то события, временной интервал
между которыми меньше интервала эквивалентности времени
считаются произошедшими в одно время.
ЕдиницаИнтервалаЭквталентностиВремени — единица
интервала эквивалентности времени
КратностьИнтервалаЭквталентностиВремени - (Число) -
кратность интервала эквивалентности времени
Минимальная длина - (Число) - минимальная длина
последовательности.
Порядок - (по длине, по количеству случаев) - определяет
порядок отображения данных в результате анализа.

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

Результат анализа будет выглядеть следующим образом: какому классу следует отнести некий новый объект, необходимо
отвечая на вопросы в узлах пройти цепочку от корня до листа дерева,
переходя к дочерним узлам в случае утвердительного ответа и к
Поиск последовательностей соседнему узлу в случае отрицательного.
Набор параметров анализа позволяет регулировать точность
Параметры анализа полученного дерева.
Минимальный процент случаев: 10
Минимальный интервал: Типы колонок источника данных:
Максимальный интервал:
Интервал эквивалентности времени:
Минимальная длина последовательности: 2 • Неиспользуемая - колонка не используется в анализе,
Информация о данных • Входная - колонка будет использоваться как атрибут для
Количество элементов: 12
создания узлов дерева, содержит характеристику
Количество последовательностей: 6 исследуемого объекта.
Результат анализа • Прогнозируемая - колонка, содержащая классификацию.
Найдено последовательностей: 2 Например - признак того, что контрагент перешел к другому
поставщику.
Последовательности
Параметры:

• МинимальноеКоличествоСлучаев - (Число) - минимальное


количество случаев в узле.
• МаксимальнаяГлубина - (Число) - максимальная глубина
дерева.
• ТипУпрощения - (не упрощать, упрощать) - тип упрощения
Дерево решений дерева решений. Упрощать или не упрощать построенное

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

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

Пример Результат анализа будет иметь следующий вид:

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

Колонки источника данных


Входные колонки
Имя колонки Тип данных
Количест в оРозничныхТочек Непреры в ный
Количест во А в томобилей Непрерывный
ВремяРаботыОрганизации Дискретный
ВремяЗаключенияДоговора Дискретный

Прогнозируемые колонки
Имя колонки Тип данных
ПрекрашениеОтношений Дискретный

Информация о данных
Количество объектов ч3
Количество классов:

Результат анализа
32
Глубина дерева решений: 3
Количество внутренних узлов: 11,11
Количество листьев' Ошибка,
%:

Дерево решений

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

Типы колонок источника данных:

Ошибки кпассиФикзции • Не используется - колонка не используется при анализе.


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

• КоличествоКластеров - (Число) - количество искомых


кластеров.
• ТипЗаполненияТаблицы - (все поля, используемые поля,
ключевые поля, не заполнять) - какие поля выводить в таблицу
кластеризации.
• Стандартизация - (не стандартизировать, стандартизировать) -
Кластерный анализ необходимость стандартизации данных. Если необходимо

Т ип анализа АнализДанныхКластеризация позволяет стандартизировать данные, то анализатор предварительно


разделить исходный набор исследуемых объектов на группы приведет все характеристики объектов к одной весовой
объектов, таким образом, чтобы каждый объект был более категории.
схож с объектами из своей группы, чем с объектами других групп. • МераРасстояния - (ЕвклидоваМетрика,
Анализируя в дальнейшем полученные группы, называемые ЕвклидоваМетрикаВКвадрате, МетрикаГорода,
кластерами, можно определить, чем характеризуется та или иная МетрикаДоминирования) - каким образом вычислять
группа, принять решение о методах работы с объектами различных расстояние между объектами.
групп. • МетодКластеризации - (БлижняяСвязь, ДальняяСвязь,
Например, при помощи кластерного анализа можно разделить КСредних, ЦентрТяжести) - каким методом выполнять
клиентов, с которыми работает компания на группы, для того, чтобы кластеризацию.
применять различные стратегии при работе с ними.
Пример

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

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

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

Расстояния между кластерами


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

Кластерный анализ
Денрограмма связей
Параметры анализа
Количество искомых кластеров: 3
Стандартизация: Стандартизировать
Мера расстояния: Евклидова метрика в квадрате
Метод кластеризации: Метод центра тяжести

Колонки источника данных


Входные колонки

Информация о данных
Количествообъектов: 9

Результат анализа
Найденокластеров: 3

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

Источник данных для модели прогноза задается при помощи


Модель прогноза свойства ИсходныеДанные, а для получения результата прогноза

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

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

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

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

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

Отображение существующего результата анализа

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

Результат анализа

Построитель = Новый ПостроителъОтчетаАнализаДанных;


Построитель.Вывести(РезультатАнализа, ТабличныйДокумент);

473
472
Использование основных объектов конфигурации
Анализ и прогнозирование данны>

Настройка параметров и выполнение анализа

О
бъект ПостроительОтчетаАнализаДанных может бы Ть
Настройка параметров модели прогноза

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

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

Что нового мы узнали Глава 15. Создание документа ввода


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

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

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

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


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

Обратите внимание на то, что дата документа не совпадает с


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

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

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

Можно сказать, что мы достигли поставленной цели, но лишь в


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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)


Для Каждого ЗаписьРегистра Из Движения.ОстаткиМатериалов Цикл
ЗаписьРегистра.Период = Дата;
КонецЦикла; КонецПроцедуры

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

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

482 483
следует размешать в обработчике события набора записей. Все
Глава 16. Легким движением брюки
попытки изменить данные регистра будут сведены, в конечном счете, к
записи именно набора записей. превращаются...
Вот мы и создали с вами небольшое прикладное решение, которое
позволило автоматизировать работу нашей ремонтной фирмы OOO
«На все руки мастер». Теперь настало время для одного чудесного
превращения.
Дело в том, что наше прикладное решение настолько понравилось
сотрудникам OOO «На все руки мастер», что они рассказали о нем
своим соседям - косметическому салону «Королева красоты».
Сотрудники салона посмотрели, как работает наше прикладное
решение, и обратились к нам с просьбой автоматизировать и их салон
тоже.
И мы, конечно же, с радостью согласились, по одной простой
причине: мы с вами создали универсальную конфигурацию,
подходящую для автоматизации практически любой деятельности,
связанной с оказанием услуг.
Все, что нам осталось теперь сделать, чтобы наша конфигурация
смогла работать в косметическом салоне, - просто создать новую
информационную базу с нашей конфигурацией, и заполнить ее
новыми данными, - сотрудниками и новой номенклатурой. Все
механизмы учета, которые мы с вами создавали, не были привязаны к
какой-либо специфике конкретного предприятия, а потому могут с
успехом использоваться на любом другом предприятии, имеющем
аналогичную область деятельности.
Таким образом, даже если в косметическом салоне пожелают иметь
дополнительную функциональность, нам потребуется всего лишь
дописать несколько модулей к нашей конфигурации, что гораздо
эффективнее, чем создавать заново индивидуальное решение только
для данного предприятия.

485
484
Часть III. Специальные приемы Глава 1. Общие приемы
разработки Существует ряд приемов использования объектов конфигурации,
которые нельзя отнести только к какому-то одному виду объектов.
Такие приемы мы собрали в этой главе.
Третья часть нашей книги будет посвящена некоторым конкретным
приемам использования тех или иных объектов конфигурации
которые могут потребоваться разработчику в процессе создания и
модификации конфигурации.

486 487
Специальные приемы разработки Общие приемы

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

Добавим кнопку «Подбор»

Алгоритм организации подборов


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

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


НоваяСтрока.Материал = ВыбранноеЗначение;
закрываться сразу после выбора элемента. Для выбора ЭлементыФормы.Материалы.ТекущаяСтрока = НоваяСтрока;
следующего элемента необходимо будет снова инициировать КонецПроцедуры
подбор.

488 489
Специальные приемы разработки Общие приемы

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

Множественный подбор Процедура КоманднаяПанельШодбор(Кнопка)

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

ПроцедураКоманднаяПанельШодбор(Кнопка) Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение,


ФормаПодбора = Справочники.Номенклатура СтандартнаяОбработка)
.ПолучитьФормуСписка( ,ЭлементыФормы.Материалы); Для СчетчикЦикла = 0 по РезультатВыбора.ВГраница() цикл
ФормаПодбора.РежимВыбора = Истина; НоваяСтрока = Материалы.Добавить(); НоваяСтрока.Материал =
ФормаПодбора.ЗакрыватьПриВыборе = Ложь; РезультатВыбора[СчетчикЦикла]; КонецЦикла; КонецПроцедуры
ФормаПодбора.Открыть(); КонецПроцедуры

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

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

Е ще одним способом организации подбора является


возможность
формы
«Множественный выбор».
использования

Это
свойства

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

выбранный элемент справочника (или массив элементов), а некоторую Ввод на основании

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

493
492
Специальные приемы разработки Общие приемы

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

Определим состав объектов и вызовем конструктор ввода на


основании...

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


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

ПроцедураОбработкаЗаполненш(Основание)
//{{_КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором. II При
повторном использовании конструктора, // внесенные
вручную изменения будут утеряны!!!

494 495
Специальные приемы разработки Общие приемы

Если ТипЗнч(Основание) = Тип("СправочникСсылка.Клиенты") Тогда


// Заполнение шапки Объекты, введенные на основании

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

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

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

Отбор объектов, введенных на основании

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

496 497
Специальные приемы разработки Общие приемы

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

Обратите внимание, что пункт меню «Перейти», формируемый


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

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

Этот обработчик открывает форму критерия отбора и затем


устанавливает значение единственного элемента отбора объекта

499
498
циальные приемы разработки
шальные приемы разработки

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

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

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


списка зависимых документов в окно сообщений.

500 501
Специальные приемы разработки Формы

Похожее влияние источники данных оказывают и на элементы


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

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

502 503
Специальные приемы разработки Формы

событиям объекта Форма добавляется расширение формы списка Затем, поскольку данными, отображаемыми в табличном поле,
будет список справочника «Номенклатура», к свойствам, методам и
справочника: событиям табличного поля добавляется расширение табличного поля
списка справочника. Но, поскольку это табличное поле расположено в
форме, к его свойствам, методам и событиям добавляется также и
расширение элементов управления, расположенных в форме:

В результате этого у формы появляются такие свойства как


ПараметрТекущаяСтрока, ПараметрВыборПоВладельцу и т.п.

505
504
Специальные приемы разработки

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


реквизита справочника типа Перечисление.ВидыНоменклатуры, к должно содержать путь к данным. Путем к данным может являться
свойствам и событиям поля ввода добавляется расширение поля ввода либоимя реквизита формы, либо путь к одному из свойств реквизита
перечисления. А раз это поле ввода расположено в табличном поле, xo Например, если в форме существует элемент управления табличное
к его свойствам и событиям добавляется также расширение элементов поле, можно в качестве данных указать ему имя реквизита
управления, расположенных в табличном поле: «СправочникСписок», У
Р ек ™
которь1Й имеет тш
СправочникСписок.Номенклатура. значения

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


более подробно расширение элементов управления, расположенных в
форме.
В числе прочего, это расширение добавляет элементам управлени
одно важное свойство - Данные. Это свойство имеет тип Строка

506
507
Специальные приемы разработки Формы

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

508 509
Специальные приемы разработки Формы

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


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

510 511
[ециальные приемы разработки Формы

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


Связанные списки нижнем списке, осталось только установить между двумя списками

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

Добавим на форму табличное поле...

512 513
Специальные приемы разработки
Фс

Теперь запустим 1С:Предприятие в режиме отладки и проверим Чтобы выполнить этот пример, уберем для нижнего табличного
работу связанных списков: поля связь по регистратору, а для верхнего создадим обработчик
события «При активизации строки»:

ПроцедураДокументСписокПриАктивизацииСтроки(Элемент)
ЭлементыФормы.ТабличноеПоле.Значение.Отбор.Регистратор
.Установить(Элемент.ТекущаяСтрока, Истина);
КонецПроцедуры

Обратите внимание, что при перемещении в верхнем списке,


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

Аналогичную связь можно установить исключительно


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

514 515
Специальные приемы разработки Формы

После того, как мы укажем заголовок первой кнопки - «Остатки


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

В процессе разработки форм периодически возникает «Остатки материалов».


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

Откроем палитру свойств кнопки «ОстаткиМатериалов» и укажем,


что тип выбираемого значения будет Строка, а выбираемое значение
будет равно «Остатки».
По умолчанию все кнопки имеют тип выбираемого значения Число
и выбираемое значение 0, поэтому для того, чтобы можно было
анализировать состояние группы переключателей, необходимо для
каждой кнопки в этой группе задать уникальное выбираемое значение.
Кроме этого, одна из кнопок в группе всегда должна быть первой в
группе - именно по ее значению можно будет определить состояние
группы, а переключение кнопок в группе будет выполняться в порядке
обхода элементов управления формы (Форма | Порядок обхода). По
умолчанию установлен автопорядок обхода элементов формы
(свойство формы «Автопорядок обхода»). Поэтому если вам

516 517
Специальные приемы разработки

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


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

Процедура ПриОткрытии()
ОстаткиМатериалов = "Остатки";
КонецПроцедуры;

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


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

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

ПроцедураОстаткиМатериаловПриИзменении(Элемент)
Если ОстаткиМатериалов = "Остатки" Тогда
ЭлементыФормы.ТабличноеПоле.Данные = "ТабличноеПоле";
иначе ЭлементыФормы.ТабличноеПоле.Данные = "РегистрСписок";
КонецЕсли;
ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
ДокументСписокПриАктивизацииСтроки(ЭлементыФормы.ДокументСписок);
КонецПроцедуры

519
518
Специальные приемы разработки
Формы

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


Изменение данных табличного поля путем «ТабличноеПоле», типом ТаблицаЗначений и пустым свойством
Данные:
установки типа значения

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


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

Создадим процедуру обработки события «При открытии» формы и


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

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

• «ОстаткиМатериалов» - «Остатки», В этой процедуре, в зависимости от выбранного значения


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

520 521
Специальные приемы разработки Формы

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


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

Массив = Новый Массив();


Массив.Добавить(НужныйТип);
НашеОписание = Новый ОписаниеТипов(Массив);

ТабПоле = ЭлементыФормы.ТабличноеПоле;
ТабПоле.ТипЗначения = НашеОписание;
ТабПоле.СоздатьКолонки();

НашОтбор = ТабПоле.Значение.Отбор;
ЗначениеОтбора = ЭлементыФормы.ДокументСписок.ТекущаяСтрока;
НашОтбор.Регистратор.УстановитьСЗначениеОтбора, Истина);
КонецПроцедуры

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


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

523
522
Формы
Специальные приемы разработки

ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
АктуальнаяЦена = РегистрыСведений.Цены
Вычисляемые колонки в списках .ПолучитьПоследнее(, ОтборНоменклатуры.Цена;

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

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


строки», и добавим в него следующий текст:

Процедура СправочникСписокПриВыволеСтроки(Элемент, ОформлениеСтр(


ДанныеСтроки)
//для элементов отобразим цену и ...
Если Не ДанныеСтроки.ЭтоГруппа тогда ОтборНоменклатуры = Новый
Структура; ОтборНоменклатутш.ВставитьС'Номенклатура",
ДанныеСтроки.Ссылка);

525
524
^^v

Специальные приемы разработки Формы

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


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

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

Вначале мы задаем режим чередования цветов фона строк списка.


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

Процедура СправочиикСписокПриВыводеСтроки(Элемент,ОформлениеСтрокн,
ДанныеСтроки)
//для элементов отобразить цену и...
Если Не ДанныеСтроки.ЭтоГруппа тогда
ОтборНоменклатуры = Новый Структура;
ОтборНоменклатуры.Вставить("Номенклатура\ДанныеСтроки.Ссьшка);
ОфорилениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
АктуальнаяЦена = РегистрыСведений.Цены
_ ______________ .ПолучитьПоследнее(, ОтборНоменклатурыЩена; ___________

526 527
Специальные приемы разработки

ОформлениеСтроки.Ячейки.Цена.Текст = АктуальнаяЦена;

//низкие цены выделим другим цветом


Часть IV. Краткий справочник
Если АктуальнаяЦена<500 тогда
ОформлениеСтроки.Ячейки.Цена.ЦветТекста = WЕВЦвета.Васильковый;
разработчика
КонецЕсли;

//... раздвинуть строку если длинное наименование Заключительная часть нашей книги содержит набор кратких
Если СтрДлина(СокрЛП(ДанныеСтроки.Наименование))>30 Тогда справочных статей и описаний групп обьектов встроенного языка
ОформлениеСтроки.Ячейки.Наименование.АвтоВысотаЯчейки = Истина; используемых для работы с теми или иными данными базы данных '
ОформлениеСтроки.Ячейки.Наименование.ВысотаЯчейки = 3; КонецЕсли;
КонецЕсли; КонецПроцедуры

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


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

528
529
Стандарты именования переменных, процедур и объектов конфигура

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

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

Правила образования имен переменных Правила образования имен процедур (функций)

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

работа с каталогом - РаботаСКаталогом Примеры хороших имен:


количество пачек в коробке - КоличествоПачекВКоробке ПроверитьДублиСтрок(),
ПодобратьВидРасчета(),
Имена переменных не следует начинать с подчеркивания. ПолучитьИнформациюОПроводке()
Имена переменных ни в коем случае не должны состоять из одного
символа. Использование коротких имен переменных допускается
Примеры плохих имен:
только для счетчиков циклов.
OK(), Есть(), ЕщеФлажки(), НамПодходит().

531
530
Краткий справочник разработчика ^Стандарты именования переменных, процедур и объектов конфигуряни,,

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

Ф
используется префикс «КоманднаяПанель»+ИмяТабличнойЧасти,
ункции, которые предназначены для проверки чего-либо, и например, «КоманднаяПанельСпецификация».
возвращают в качестве результата проверки булево
значение, следует именовать так, как называется результат Элементы управления, связанные с данными, называются так же,
как данные.
проверки, имеющий тип Истина.
Например, если функция должна проверить наличие дублей строк в
Общие требования к имени объекта конфигурации

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

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

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

532 533
Краткий справочник разработчика

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


«Форма элемента полная», «Форма элемента упрощенная». Немного о конфигурациях

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

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

534 535
Краткий справочник разработчика

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


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

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

537
536
Краткий справочник разработчика

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


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

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

538 539
Понятие момента времени Концепция оперативного и неоперативного
проведения документов
Д ля определения положения документа на оси времени

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

541
540
Механизмосновныхф»гм

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


Механизм основных форм записей - он сможет это сделать, воспользовавшись конструктором и

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

Константы.ПолучитьФорму();

Также примечательным фактом является то, что состав основных


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

542 543
Окно редактирования объекта конфигурации и палитпя CBOJ

«запоминать», какое свойство объекта в ней выбрано, и при переходе в


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

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

544 545
Обработчики событий События, связанные с формой

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


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

ПодключитьОбработчикИзмененияДанных(
"СправочнжОбъект. Ссылка",
"ПриИзмененииСсылки", Ложь);

546 547
Краткий справочник разработчика События, связанные с фор»

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

548 549
Способы работы с коллекцией Виды объектов встроенного языка,

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

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

550
551
Краткий справочник разработчика

информацию об этом объекте (например, документ

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

552
553
Кэш объ ек

объекта могут существовать в кэше в одном из двух видов: либо все


данные объекта, либо представление объекта.
Кэш объектов

С
Таким образом, если мы обратимся к кэшу для получения
истема 1С:Предприятие 8.0 использует механизм представления объекта, и в кэше есть информация для нашей ссылки,
кэширования данных объектов, считанных из базы данных данные будут взяты из кэша (если в кэше весь объект, нужное
при использовании объектной техники. Таким образом, для представление будет получено из данных объекта). Если в кэше нет
получения реквизитов какого-либо объекта через ссылку, информации для нашей ссылки - из базы данных в кэш будут считаны
выполняется обращение к кэшу объектов, расположенному в только поля, необходимые для формирования представления объекта.
оперативной памяти.
Если мы обратимся к кэшу для получения реквизита объекта, и в
Кэш объектов состоит из двух частей: транзакционного кэша и кэше есть информация для нашей ссылки, дальнейшие действия будут
обычного кэша. В зависимости от того, происходит ли обращение в зависеть от того, что находится в кэше. Если в кэше весь объект -
рамках транзакции или нет, в действие вступает тот или иной кэш: значение реквизита будет получено из кэша. Если в кэше
представление объекта - оно будет удалено из кэша и в кэш будут
считаны все данные объекта. Если же при получении реквизита
А = СправочникНоменклатура.ВидНоменклатуры; I
объекта в кэше нет информации для нашей ссылки - из базы данных
будут считаны все поля объекта.
Считанные данные будут находиться в кэше до тех пор, пока не
наступит одно из трех событий:

• считанные данные будут вытеснены из кэша другими


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

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

555
554
Краткий справочник разработчика

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

А = Номенклатура.Наименование; В =
Номенклатура.ВидНоменклатуры;

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


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

Транзакционный кэш

Е сли обращение к данным происходит в рамках транзакции, то


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

данные, находящиеся в транзакционном кэше, являются валидными


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

556 557
Краткий справочник разработчика

Получение представлений ссылочных объектов

П ри использовании объекта вида Ссылка в элементах Виртуальные таблицы запросов

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

558 559
что такой запрос будет менее эффективным и потребует от
разработчика гораздо больше трудозатрат.
Манипулирование данными объектов

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

Процедура Проверка() Экспорт

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

561
560
Краткий справочник разработчика Манипулирование данными объек!

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

562 563
Константы
Объекты встроенного языка для работы с
константами:

*Заливкой выделен объект манипулирования данными

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

КонстантыНабор - предоставляет возможность проведения


операций чтения и записи сразу для группы констант, в частном
случае - для всех констант. Также используется в форме констант для
хранения, записи и считывания констант.
КонстантаМенеджерЗначения<имя> - используется для
доступа к константе. Любая запись константы (интерактивно в форме,
объекты КонстантыНабор и КонстантаМенеджер.<имя>) создает
объект этого типа и производит запись с его помощью, что
обеспечивает вызов модуля и обработчиков событий этого объекта.

565
Краткий справочник разработчика
Константы

Использование объектов:
СоздатьМенеджерЗначения()

//Пример: Вывести значения всех констант, существующих в конфигурации


Для Каждого ОчереднаяКонстанта Из Константы Цикл
// Константы ИмяКонст=ОчереднаяКонстанта.СоздатьМенеджерЗначения().Метаданные().Имя-
ЗначениеКонст = ОчереднаяКонстанта.Получить(); Сообшить("Константа
//Пример: Открыть основную форму констант "+ИмяКонст+" = "+ЗначениеКонст); КонецЦикла;
Форма = Константы.ПолучитьФорму();
Форма.Открыть();

II .<имя константы> // [<имя константы>] //


Для Каждого ... Из... Цикл ... КоненЦикла;

//Пример: Прочитать значение константы


Результат = Константы.ПрефиксНумерации.ПолучитьО;
Сообщить("Значение константы ПрефиксНумерации = "+Результат);

/ЛТример: Установить значение константы «ПрефиксНумерации» равным «ЦБ»


Константы["ПрефиксНумерации"].Установить("ЦБ");
Сообщить("Новое значение = "+Константы["ПрефиксНумерации"].Получить());

/ЛТример: Очистить значения всех констант


Для Каждого ОчереднаяКонстанта Из Константы Цикл
ОчереднаяКонстанта.Установить(Неопределено);
КоненЦикла;

// СоздатьНабор()

//Пример: Установить новые значения нескольких констант


Набор = Константы.СоздатьНабор("Руководитель, Бухгалтер");
Набор.Руководитель = "НиколаевДенис Павлович";
Набор.Бухгалтер = "Николаева Людмила Сергеевна";
Набор.Записать();

566
567
Краткий справочник разработчика Константы

Особенности внутренней реализации объекта КонстантыНабор


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

Замечание. Работа с формой констант осуществляется при помоши


объекта КонстантыНабор, который, в свою очередь, использует
объектКонстантаМенеджерЗначения.<имя>.

568 569
Справочники

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

// .<имя справочника> // [<ими


справочника>] // Дли Каиедого ... Из ... Цикл
... КонецЦикла;

//Пример: Создать новую группу справочника Номенклатура


НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
НоваяГруппа.Наименование = "Моя новая группа";
НоваяГруппа.Записать();

//Пример: Открыть форму выбора справочника Номенклатура


Форма = Справочники["Номенклатура"].ПолучитьФормуВыбора();
Форма.Открыть();

*Заливкой выделен объект манипулирования данными

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


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

570 571
Краткий справочник разработчика Справочники

// Выбрать()
// НайтиПоКоду()
// ВыбратьИерархически()
// НайтиПоНаименованик>()
// НайтиПоРеквизитуО //Пример: Вывести список элементов, расположенных в корне справочника
// ПустаяСсылка() Выборка = Справочники.Номенклатура
// ПолучнтьСсылку()
.Выбрать(Справочники.Номенклатура.ПустаяСсылкаО); Пока
// .<имя предопределенного элемента справочника>
Выборка.Следующий() Цикл Если Не Выборка.ЭтоГрутша тогда
Сообщить(Выборка);
//Пример: Проверить, помечен лн на удаление элемент справочника Номенклатура
КонецЕсли; КонецЦикла;
//c кодом 13
Если Справочники.Номенклатура.НайтиПоКоду(13).ПометкаУдаления тогда //Пример: Удалить все элементы иерархического справочника
Сообщить("Элемент с кодом 13 помечен на удаление"); Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока
КонецЕсли; Выборка.Следующий() Цикл
Выборка.Удалить();
/ЛТример: Является ли элемент справочника Номенклатура с наименованием КонецЦикла;
//«Услуги» группой
Если Справочники.Номенклатура
.НайтиПоНаименованию"Услуги", Истина).ЭтоГруппа тогда
Сообщить("Элемент Услуги является группой"); КонецЕсли;

//Пример: Проверить, что для всех элементов задан вид номенклатуры


ПустаяСсылкаПеречисления = Перечисления.ВидыНоменклатуры.ПустаяСсылка(); Если // СоздатьГруппу() //
Не Справочники.Номенклатура.НайтиПоРеквизит("'ВидНоменклатуры", СоздатьЭлемент()
ПустаяСсылкаПеречисления).Пустая() тогда
Сообщить("Есть элементы для которых не задан вид номенклатуры"); //Пример: Создать новый элемент справочника Сотрудники
НовыйЭлемент = Справочники.Сотрудники.СоздатьЭлемент();
КонецЕсли;
НовыйЭлемент.Наименование = "Смирнов Андрей Анатольевич";
//Пример: Передать пустую ссылку в параметр метода //Заполнить табличную часть
Выборка = Справочники.Номенклатура НоваяСтрокаТабличнойЧасти = НовыйЭлемент.ТрудоваяДеятельность.Добавить();
.Выбрать(Справочники.Номенклатура.ПустаяСсылка()); ________________ НоваяСтрокаТабличнойЧасти.Организация = "OOO НТЦ";
НоваяСтрокаТабличнойЧасти.НачалоРаботы = Дата(2003,05,01);
НоваяСтрокаТабличнойЧасти.ОкончаниеРаботы = Дата(2003,12,31);
НоваяСтрокаТабличнойЧасти.Должность = "Программист";
НовыйЭлемент.Записать();

572 573
Краткий справочник разработчика Справочники

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

//
// ПолучитьОбъект()
ПолучитьОбъект() //
Скопировать()

// Пример: Изменить наименование элемента справочника //Пример: пометить все элементы неиерархического справочника на удаление
Элемент = Справочники.Номенклатура.НайтиПоКоду(10).ПолучитьОбъект(); Выборка = Справочники.Клиенты.Выбрать();
Элемент.Наименование = "Мое новое наименование"; Элемент.Записать(); Пока Выборка.Следующий() Цикл
Выборка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
// Пример: Заполнить справочник тестовыми данными КонецЦикла;
Элемент = Справочвики.Номенклатура.СоздатьЭлемент();
Элемент.Наименование = "Тестовый элемент";
Элемент.ЗаписатьО; Для ш = 1 по 1000 Цикл
НовыйЭлемент = Элемент.СкопнроватьО;
НовыйЭлемент.Записать();
КонецЦикла;

574 575
Краткий справочник разработчика

элемента
Последовательность событий при записи элемента справочник
справочника из формы элемента а
Модуль
формы Запись элемента Модуль
справочника объекта
Объекты встроенного языка для работы с
Документы документами:

*Заливкой выделен объект манипулирования данными

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


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

576 577
Краткий справочник разработчика Документы

Использование объектов: // НайтиПоНомеру() //


НайтиПоРеквизиту() //
ПустаяСсылка()
// Документы
//Пример: Проверить, проведен ли документ ПриходнаяНакладная с номером 3
//Пример: вывести все типы ссылок на элементы справочников, существующие в Если Документы.ПриходнаяНакладная.НайтиПоНомеру(3).Проведен тогда
конфигурации Сообщить("Документ с номером 3 проведен");
КонецЕсли;
Массив = Документы.ТипВсеСсылки()Типы();
Для Каждого ОчереднойТип из Массив Цикл
//Пример: Проверить, что во всех документах ПриходнаяНакладная заполнен
Сообщить(ОчереднойТип);
//реквизит Склад
КонецЦикла; ПустаяСсьшкаСклада = Справочники.Склады.ПустаяСсылка();
Если Не Документы.ПриходнаяНакладная
.НайтиПоРеквизиту("Склад", ПустаяСсылкаСклада).Пустая() тогда
Сообщит("'Есть документы, у которых не заполнен реквизит Склад");
КонецЕсли;
II .<имя документа> // [<имя документа>] //
Для Каждого ... Из ... Цикл ... КонецЦикла;

/Шример: Открыть форму нового документа ОказаниеУслуги для интерактивного


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

// СоздатьДокумент()

//Пример: Создать новый документ ПриходнаяНакладная


НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокументО;
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Склад = Справочники.Склады.Основной;
//Заполнить табличную часть
НоваяСтрокаТабличнойЧасти = НовыйДокумент.Материалы.Добавить();
НоваяСтрокаТабличнойЧасти.Материал ■ Справочники.Номенклатура.НайтиПоКоду(6);
НоваяСтрокаТабличнойЧасти.Количество = 10;
НоваяСтрокаТабличнойЧасти.Цена = 22,5;
НоваяСтрокаТабличнойЧасти.Сумма = 225;
НовыйДокумент.Записать();

578 579
Краткий справочник разработчика Дою менты

// ПолучитьОбъект()

//Пример: Удалить все документы ПриходнаяНакладная


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

II ПолучитьОбъект() //
Скопировать()

//Пример: Пометить документ на удаление


НенужныйДокумент = Документы.ОказаниеУслуги
.НайтиПоНомеру(13).ПолучитьОбъект();
НенужныйДокумент.УстановитьПометкуУдаления(Истина);

// Ссылка

//Сформировать список ссылок на все документы ПриходнаяНакладная за


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

580
581
Краткий справочник разработчика Документы

Последовательность событий при проведении Последовательность событий при отмене


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

583
582
Краткий справочник разработчика
Перечислени

Перечисления //
//
.<имя перечисления>
[<имя перечисления >]
// Для Каждого ... Из ... Цикл ... КонецЦикла;
Объекты встроенного языка для работы с
//Пример: Открыть форму выбора перечисления
перечислениями: Форма = Перечисления.ВидыНоменклатуры.ПолучитьФормуВыбора();
Форма.Открыть();

// .<имя значения перечисления>


ПеречислениеСписок.<имя> // [<имя значения перечисления >]
// [<идекс элемента коллекции>]
// Для Каждого... Из ... Цикл ... КонецЦикла;
// ПустаяСсылка()

//Пример: Получить пустую ссылку на значение перечисления

ПустаяСсылкаПеречисления= Перечисления.ВидыНоменклатуры.ПустаяСсылка();
Если ТекущаяНоменклатура.ВидНоменклатуры = ПустаяСсылкаПеречисления тогда
//предложить заполнение вида номенклатуры
...

КонецЕсли;

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

Использование объектов:

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

//Пример: Открыть форму списка перечисления


Форма = Перечисления.ВидыНоменклатуры.ПолучитьФормуСписка();
Форма.Открыть();

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

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


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

*Заливкой выделен объект манипулирования данными

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

586 587
Планы счетов

ПланСчетовВидыСубконто^имя>. Используется для доступа к


Планы счетов методам специальной табличной части счета ВидыСубконто в целом.
ПланСчетовВидыСубконтоСтрока^имя>. Строка специальной
Объекты встроенного языка для работы с планами табличной части счета ВидыСубконто.
счетов Свойства и методы взаимодействия перечисленных объектов в
большинстве своем аналогичны свойствам и методам объектов,
предназначенных для работы со справочниками (см. раздел «Объекты
Глобальный контекст встроенного языка для работы со справочниками» на странице 570).
Последовательность событий при записи счета из
формы
ПланыСчетовМенеджер | | ПланСчетовСписок.<имя>

ПланСчетовМенеджер.<имя>

ПланСчетовСсылка.<имя> И ПланСчетовОбъект.ошя>

ПланСчетовВыборка.<имя>

ПланСчетовВидыСубконто.<имя>

ПланСчетовВидыСубконтоСтрока.^ашя>

*Заливкой выделен объект манипулирования данными

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


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

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

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


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

ВытесняющиеВидыРасчета.<имя>. Предопределенная
табличная часть вида расчета - список вытесняющих видов расчета.
Такая табличная часть определена только для планов видов расчета с
признаком ИспользуетПериодДействия. Имеет единственную
колонку- ВидРасчета типа ПланВидовРасчетаСсылка.<имя>.
ВытесняющиеВидыРасчетаСтрока^имя>. Строка
предопределенной таблицы вытесняющих видов расчета.
ВедущиеВидыРасчета.<имя>. Предопределенная табличная
часть вида расчета - список ведущих видов расчета. Имеет
единственную колонку - ВидРасчета типа
ПланВидовРасчетаСсылка.<имя>.
ВедущиеВидыРасчетаСтрока.<имя>. Строка предопределенной
таблицы ведущих видов расчета.
БазовыеВидыРасчета.<имя>. Предопределенная табличная
часть вида расчета - список ведущих видов расчета. Такая табличная
часть (свойство БазовыеВидыРасчета) определена только для
планов видов расчета со свойством ЗависимостьОтБазы не равным
значению «Не зависит». Имеет единственную колонку - ВидРасчета
типа ПланВидовРасчетаСсылка^имя>.
БазовыеВидыРасчетаСтрока.<имя>. Строка предопределенной
таблицы базовых видов расчета.
Свойства и методы взаимодействия перечисленных объектов в
большинстве своем аналогичны свойствам и методам объектов,
предназначенных для работы со справочниками (см. раздел «Объекты
встроенного языка для работы со справочниками» на странице 570).

ВытесняющиеВидыРасчетаСтрока.<имя>

*Заливкой выделен объект манипулирования данными

590 591
Последовательность событий при записи вида Регистры сведений
расчета из формы
Объекты встроенного языка для работы с регистрами
сведений

*Заливкой выделен объект манипулирования данными

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


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

РегистрСведенийМенеджерЗаписи^имя>. Позволяет читать,


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

593
592
Краткий справочник разработчика Регистры сведе ни

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


// СоздатьКлючЗаписи()
записи «Независимый».
РегистрСведенийЗапись.<имя>. Предоставляет доступ к записи //Пример: Активизировать требуемую строку списка регистра сведений
регистра сведений. Объект не создается непосредственно, а СтруктураКлючевыхПолей = Новый Структура;
СтруктураКлючевыхПолей.Вставить("Период",Дата("20040331000000"));
предоставляется другими объектами, связанными с регистром СтруктураКлючевыхПолей.Вставить("Номенклатура",
сведений. Например, данный объект представляет записи регистра в Справочники.Номенклатура.НайтиПоКоду("0000006"));
ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока =
наборе записей. _______
РегистрСведенийКлючЗаписи.<имя>. Представляет собой _______ РегислрыСведений.Цены.СоздатьКлючЗаписи(СтруктураКлючевыхПолей)
набор значений, однозначно идентифицирующих запись регистра. ;
Объект используется в тех случаях, когда необходимо сослаться на
определенную запись. Например, он выступает в качестве значения
свойства «ТекущаяСтрока» табличного поля, отображающего список
записей регистра.
// СоздатьНаборЗаписей()

Использование объектов: //Пример: Показать номенклатуру, цена на которую была установлена в заданную
//дату и время
Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(ЗаданнаяДата, Истина);
// РегистрыСведений Набор.Прочитать();
Для Каждого ОчереднаяЗапись Из Набор Цикл
//Прнмер: Получить текущую цену из периодического регистра сведений Цены Сообщить("Номенклатура = "+ОчереднаяЗапись.Номенклатура+
Элемент = Справочники.Номенклатура.НайтиПоКоду(4); ", цена = "+ОчереднаяЗапись.Цена);
Отбор = Новый Структурв("Номенклатура",Элемент); КонецЦикла;
ЗначенияРесуроов = РегистрыСведений.Цены
.ПолучитьПоследнее(ТекущаяДата(), Отбор);

// СоздатьМенеджерЗаписи()

II .<имя регистра сведений> // [<имя регистра /Шример: Добавить новое значение цены в регистр Цены
сведений >] // Для Каждого ... Из ... Цикл ... Запись = РегистрыСведений.Цены.СоздатьМенеджерЗаписи();
КонецЦикла; Запись.Период = ТекущаяДата();
Запись.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("0000005");
//Пример: Открыть форму списка регистра сведений Цены Запись.Цена = 568;
ИмяРегистра= "Цены"; Запись .Записать();
Форма = РегистрыСведений[ИмяРегистра].ПолучитьФормуСписка();
Форма.Открыть();

594 595
Краткий справочник разработчика Регистры сведений

Последовательность событий
// [<индекс элемента коллекции >]
// Для Каждого ... Из ... Цикл ... КонецЦикла;
При записи из формы записи регистра сведений из формы
/Шример: Показать номенклатуру, цена на которую была установлена в заданную записи
//дату и время
Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей();
Набор.Отбор.Период,Установить(ЗаданнаяДата,Истина);
Набор.Прочитать();
Для Каждого ОчереднаяЗапись Из Набор Цикл
Сообщить("Номенклатура = "+ОчереднаяЗапись.Номенклатура+
", цена = "+ОчереднаяЗапись.Цена);
КонецЦикла; __________________________________________________________

// ПолучитьМенеджерЗаписи()

//Пример: Удалить все записи регистра сведений за текущий месяц


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

// Выбрать()
// ВыбратьПоРегистратору()

//Пример: Показать изменение цен на элемент номенклатуры в течение года


Отбор = Новый Структур("'Номенклатура",
Справочники.Номенклатура.НайтиПоКоду("0000005"));
Выборка = РегистрыСведений.Цены
.Выбрать(НачалоГода(ТекущаяДата()),ТекущаяДата(),Отбор);
Пока Выборка.Следующий() цикл
Сообщить("Дата = "+Выборка.Период+ ", цена = "+Выборка.Цена);
КонецЦикла; _____________________________________________

Замечание. Работа с формой записи регистра сведений


осуществляется при помощи объекта
РегистрСведенийМенеджерЗаписи.<имя>, который, в свою

596 597
Краткий справочник разработчика

очередь, использует объект


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

*Заливкой выделен объект манипулирования данными

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

РегистрНакопленияЗапись^имя>. Используется для доступа к


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

598 599
Краткий справочник разработчика
Регистры накопле

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


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

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

//Пример: Открыть форму списка регистра ОстаткиМатериалов


Форма = РегистрыНакопления.ОстаткиМатериалов.ПолучитьФормуСписка(); // Выбрать()
Форма.Открыть(); // ВыбратьПоРегистратору()

//Пример: Выбрать все записи регистра ОстаткиМатериалов за текущий месяц


Выборка = РегистрыНакопления.ОстаткиМатериалов
.Выбрать(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));

II .<имя регистра накопления> // [<имя


регистра накопления >] // Для Каждого ... Из ...
Цикл... КонецЦикла;
// [<индексэлементаколлекции>|
//Пример: Рассчитать итоги регистра ОстаткиМатериалов на указанную дату // Для Каждого ... Из ... Цикл ... КонецЦикла;
ИмяРегистра = ОстаткиМатериалов;
РегистрыНакопления[ИмяРегистра] //Пример: Получить движения документа
.УстановитьПериодРассчитанныхИтогов(УказаннаяДата); НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4);
Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
Движения.Отбор.Регистратор.Значение = НужныйДокумент;
Движения.Прочитать();
Для Каждого ОчередноеДвижение Из Движения Цикл
//алгоритм обработки движений
// СоздатьКлючЗапнси() КонецЦикла;
//Пример: Активизировать требуемую строку списка регистра накопления
СтруктураКлючевыхПолей = Новый Структура;
СтруктураКлючевыхПолей.Вставить("Регистратор",
Документы.ПриходнаяНакладная.НайтиПоНомеру("0000002"));
СтруктураКлючевыхПолей.Вставить("НомерСтроки",2);
ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока =
РегистрыНакопления.ОстаткиМатериалов
.СоздатьКлючЗапис^СтруктураКлючевыхПолей)
;

600
601
Последовательность событий при записи набора Регистры бухгалтерии
записей регистра накопления из формы набора Объекты встроенного языка для работы с регистрами
записей бухгалтерии

*Заливкой выделен объект манипулирования данными

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

РегистрБухгалтерииЗапись. Используется для доступа к записи


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

603

602
Краткий справочник разработчика Регистры бухгалтерии

бухгалтерии. Например, данный объект представляет записи регистра Последовательность событий при записи набора
в наборе записей. записей регистра бухгалтерии из формы
РегистрБухгалтерииСубконто. Коллекция значений субконто
записи регистра бухгалтерии. Установка и получение значения
конкретного субконто осуществляется через оператор [], в качестве
параметра которому передается вид субконто или через имя
предопределенного субконто.
РегистрБухгалтерииКлючЗаписи. Набор значений, однозначно
идентифицирующий запись регистра. Объект используется в тех
случаях, когда необходимо сослаться на определенную запись.
Например, он выступает в качестве значения свойства
ТекущаяСтрока табличного поля, отображающего список записей
регистра.
Свойства и методы взаимодействия перечисленных объектов в
большинстве своем аналогичны свойствам и методам объектов,
предназначенных для работы с регистрами накопления (см. раздел
«Регистры накопления» на странице 599).

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

»■ Узнай больше!
Регистры расчета Про основные виды объектов встроенного языка можно
прочитать в главе «Виды объектов встроенного языка,
Объекты встроенного языка для работы с регистрами предназначенные для работы с данными прикладных объектов
конфигурации» на странице 551.
расчетов
РегистрРасчетаЗапись.<имя>. Используется для доступа к
записи регистра расчета. Объект не создается непосредственно, а
предоставляется другими объектами, отвечающими за регистр Расчета.
Например, данный объект представляет записи регистра в наборе
записей.
РегистрРасчетаКлючЗаписи.<имя>. Представляет собой набор
значений, однозначно идентифицирующих запись регистра. Объект
используется в тех случаях, когда необходимо сослаться на
определенную запись. Например, он выступает в качестве значения
свойства ТекущаяСтрока табличного поля, отображающего список
записей регистра.
РегистрРасчетаПерерасчеты.<имя>. Менеджер всех
менеджеров перерасчетов регистра расчетов.
ПерерасчетМенеджер.<имя>. Менеджер перерасчета служитдля
получения набора записей перерасчета.
ПерерасчетНаборЗаписей.<имя>. Набор записей перерасчета.
ПерерасчетЗапись.<имя>. Объект используется для доступа к
записи перерасчета.
ФактическийПериодДействия. Массив значений типа
ЭлементФактическогоПериодаДействия.
ЭлементФактическогоПериодаДействия. Элемент
фактического периода действия.
Свойства и методы взаимодействия перечисленных объектов в
большинстве своем аналогичны свойствам и методам объектов,
предназначенных для работы с регистрами накопления (см. раздел
«Регистры накопления» на странице 599).

*Заливкой выделены объекты манипулирования данными

607
606
Сраткий справочник разработчика

Последовательность событий при записи набора


записей регистра расчета из Планы обмена
Запись набора
формы записей регистра
Модуль набора Объекты встроенного языка для работы с планами
расчета
записей обмена
регистра
расчета

Модуль формы
набора записей
регистра
расчета

ПослеЗаписи() ~J

ПланОбменаСписок.<имя>

*Заливкой выделен объект манипулирования данными

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


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

608
609
Краткий справочник разработчика

ЗаписьСообщенияОбмена - Объект предназначен дл я


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

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


формы

610
611
Вопросы при переходе с версии 7.

Использование команды Отладка | Начать отладку (клавиша F5)


Глава 1. Вопросы при переходе с позволяет начинать ' отладку с сохранением редактируемой
конфигурации и обновлением конфигурации базы данных.
версии 7.7 Для сохранения редактируемой конфигурации без обновления
конфигурации базы данных следует использовать команду
Версия 7.7 - версия 8.0 Сохранить конфигурацию или Сохранить (клавиша Ctrl+S).
Более подробную информацию можно прочитать в разделе
Общие вопросы «Основная конфигурация и конфигурация базы данных» на странице
52, и в главе «Немного о конфигурациях» на странице 535.
Я изменил конфигурацию, но когда запускаю 1С:Предприятие -
там нет моих изменений. Почему мои изменения не видны? Как прервать работу модуля? Esc не работает...
В информационной базе версии 8.0 хранится несколько В версии 8.0 прерывание длительных действий выполняется
клавишей Ctrl+Break.
конфигураций одного и того же прикладного решения.
Конфигурация, редактируемая разработчиком, - основная Пользователь может прервать работу модуля, только если в
конфигурация, - сохраняется без выполнения реструктуризации базы процессе выполнения модуля выполняется вызов процедуры
данных. Другими словами, ее сохранение не оказывает влияние на глобального контекста «ОбработкаПрерыванияПользователя». Эта
работающих пользователей. процедура проверяет, была ли нажата пользователем клавиша
Ctrl+Break и прерывает работу модуля.
Для работы пользователей в режиме «1С:Предприятие»
используется другая конфигурация - конфигурация базы данных, также Следует отметить, что работа модуля будет прервана не всегда, а
хранящаяся в информационной базе. только в тех случаях, когда работа модуля была инициирована
следующими действиями пользователя:
Чтобы привести конфигурацию базы данных в соответствие с
основной конфигурацией, нужно выполнить обновление • нажатие кнопки в форме;
конфигурации базы данных (меню • выбор пункта меню или кнопки панели инструментов в
Конфигурация | Обновить конфигурацию базы данных). При этом форме;
выполняются дополнительные проверки конфигурации, • выбор пункта меню или кнопки панели инструментов
реструктуризация базы данных (если изменилась структура данных) и интерфейса;
замена конфигурации базы данных на редактируемую конфигурацию.
• действия, инициируемые обработчиками событий "Выбор"
В меню Конфигурация | Конфигурация базы данных можно элементов управления.
выполнить сравнение редактируемой конфигурации с конфигурацией
базы данных и при необходимости вернуться к конфигурации базы Более подробную информацию можно найти на диске ИТС в статье
данных. "Особенности прерывания пользователем работы модуля".
Использование команды
Конфигурация | Обновить конфигурацию базы данных (клавиша Почему в типовой конфигурации я не могу отредактировать
F7) позволяет сохранять редактируемую конфигурацию сразу с полученную печатную форму документа?
обновлением конфигурации базы данных. Печатные формы первичных документов в типовых конфигурациях
защищены от изменений пользователем. Режим «Защита» установлен

613
Краткий справочник разработчика Вопросы при переходе с версии 7.7

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

614 615
раткий справочник разработчика Вопросы при переходе версии

При редактировании пользователей доступны только те объекты В версии 8.0 обработка ожидания может быть установлена методом
конфигурации (роли, интерфейсы и языки), которые содержатся в ПодключитьОбработчикОжидания() (для отключения обработчика
конфигурации базы данных. ожидания используется метод ОтключитьОбработчикОжидания()).
Обработка ожидания может выполняться как в модуле приложения,
Поэтому, чтобы созданную роль можно было назначить так и в модуле формы. Для каждой формы, как и для приложения в
пользователю, нужно сначала выполнить обновление конфигурации целом, может быть установлено несколько обработчиков ожидания с
базы данных (меню Конфигурация | Обновить конфигурацию базы разными интервалами.
данных).
Более подробно о событиях, связанных с формой, можно прочитать
О том, какие существуют конфигурации, можно прочитать в главе
в главе «События, связанные с формой» на странице 547.
«Немного о конфигурациях» на странице 535.
Что использовать вместо разделителя строк, который был в 7.7?
Системные константы, процедуры и функции Вместо системной константы РазделительСтрок версии 7.7, в
версии 8.0 следует использовать системный набор значений Символы.
В версии 7.7 была функция КаталогИБ, а как теперь определить В частности, для указания символа перевода строки следует
каталог информационной базы, чтобы хранить в нем свои файлы? использовать значение этого набора - «ПС»:
Системная функция 1С:Предприятия 7.7 КаталогИБ() не
реализована в версии 8.0. Сообщить("Первая строка"+Символы.ПС+"Вторая строка");
Это связано с тем, что в версии 8.0 вся информационная база
физически является одним файлом, независимо от используемого
файлового или клиент-серверного варианта работы. Таким образом Есть ли аналог в 8-ке - ПериодСтр() в 7.7?
подразумевается, что понятие каталога, как некоей совокупности Да, в версии 8.0 есть аналог системной функции ПериодСтр().
файлов, относящихся к данной информационной базе, отсутствует. Для формирования текстового представления периода следует
Теперь все нужные файлы должны размещаться внутри использовать функцию глобального контекста
информационной базы. Для этого в 1С:Предприятии 8.0 введен новый ПредставлениеПериода(). В качестве параметров в эту функцию
тип реквизитов и ресурсов — ХранилищеЗначения. передаются даты начала и окончания периода, а также строка,
определяющая способ форматирования периода.
Функция СтатусВозврата(). Есть аналог в 8.0?
Нет, в версии 8.0 метод СтатусВозврата() не используется. ОписаниеПериода = "Период:" +
Чтобы в обработчике события указать на необходимость отмены ПредставлениеПериода(ДатаНачала, ДатаКонца, "ФП = Истина");
стандартных действий, выполняемых системой для данного события,
нужно использовать специальный параметр обработчика события.
Этот параметр имеет тип Булево, а его название зависит от вида Как узнать текущее время в сеансе работы? РабочаяДата
предлагает только дату.
с о б ыт ия , и может б ыт ь различ ным ( «Отказ » или
Свойство глобального контекста РабочаяДата служит для
«СтандартнаяОбработка»).
отображения или установки рабочей даты, используемой в текущем
сеансе конфигурации. Поэтому оно содержит дату в виде 44:MM:CC
Есть ли аналог процедуры ОбработкаОжидания()? 00:00:00, указывающую на начало дня.
Есть.

516 617
Краткий справочник разработчика Вопросы при переходе с версии 7.7

Для получения текущего времени следует использовать


встроенную функцию ТекущаяДата(), которая возвращает Контекст формы
системную дату и время, установленные на компьютере:
Куда вписать выражение, чтобы его результат отображался в
ДатаВремя = ТекущаяДата(); текстовой колонке табличного поля?
Сообщить(*Текущее время = "+Формат(ТекущаяДата(),"ДФ='дд.мм.гг чч:мм:сс'")); В версии 8.0 нет возможности задавать для колонок текстового
поля выражения, которые будут автоматически рассчитываться при
отображении этого табличного поля.
Глобальный модуль Такая возможность не реализована, поскольку весь текст
программы в версии 8.0 располагается только в программных модулях.
Как «отловить» интерактивную пометку на удаление? Поэтому теперь, для вывода вычисляемого значения в колонку
В версии 8.0 изменена реакция на снятие и установку пометки на табличного поля следует использовать обработчик события «При
удаление объекта. выводе строки» табличного поля. Это событие возникает каждый раз
В отличие от версии 7.7, где пометка на удаление обрабатывалась при формировании очередной строки табличного поля, которая будет
соответствующим событием удаления («ПриУдаленииЭлемента», отображена на экране.
«ПриУдаленииДокумента» и т.д.), в версии 8.0 реакция на снятие и В качестве примера можно посмотреть процедуру
установку пометки на удаление приведена в соответствие физическому «СправочникСписокПриВыводеСтроки» в модуле формы списка
смыслу выполняемых действий. справочника «Номенклатура» в разделе «Вычисляемые колонки в
При установке пометки удаления не происходит непосредственного списках» на странице 524.
удаления элемента из базы, а выполняется всего лишь сохранение его Более подробную информацию можно найти на диске ИТС в статье
измененного свойства ПометкаУдаления. Поэтому реакцией на это "Вывод связанной информации по текущему объекту из списка".
действие в версии 8.0 являются события «Перед записью» и «При
записи» (это справедливо и в случае снятия пометки на удаление). В 8.0 в формах нет слоев. А как теперь создавать закладки в
Событие «Перед удалением» возникает теперь только при форме?
непосредственном удалении объекта из базы данных. В версии 8.0 вместо механизма слоев в формах используются
Таким образом, для того, чтобы отследить интерактивную или панели.
программную пометку объекта на удаление, необходимо в Одна панель может содержать несколько страниц. Поддерживается
обработчике события «ПередЗаписью» проанализировать свойство большое количество вариантов отображения закладок, режим
объекта ПометкаУдаления: значение Истина будет говорить о том, прокручиваемых страниц, использование закладок без распределения
что пометка на удаление устанавливается, Ложь - снимается. по страницам.
Если в обработчике события «Перед записью» есть необходимость
Следует заметить, что один элемент управления может
анализировать то состояние объекта, которое было до наступления располагаться только на одной странице. Поэтому если вы хотите,
этого события, нужно считывать данные из базы данных при помощи чтобы в форме присутствовали элементы управления, доступные с
запроса. любой страницы формы, следует размещать их вне той панели, в
которой находятся страницы формы.
Пример использования страниц формы можно посмотреть в форме
элемента справочника «Номенклатура» в разделе «Доработка
справочника Номенклатура» на странице 261, а также в форме

618 619
Сраткий справочник разработчика Вопросы при переходе с версии 7.7

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

Как в формах 1С:Предприятия 8.0 сохранить настройки


пользователя (по аналогии с сохранением настроек форм отчетов Никак не могу заставить работать элемент управления
Переключатель! В чем дело?
и обработок в 1С:Предприятии 7.7)?
В версии 8.0 работа с переключателем ведется таким же образом,
Чтобы задействовать сохранение настроек в версии 8.0, как и в версии 7.7, за исключением одного отличия.
необходимо в палитре свойств формы установить значения свойств
"Сохранять значения" и "Сохраняемые значения". В командной панели Теперь для каждого переключателя в группе можно задать
значение, которое будет помещаться в данные при выборе этого
формы можно использовать стандартные кнопки сохранения и
пер е ключателя . Это значение з а д ае т ся в свойст ве
восстановления настроек.
ВыбираемоеЗначение. По умолчанию выбираемое значение имеет тип
Следует иметь в виду, что сохранение настроек возможно, только Число и значение равное нулю. Таким образом, если при создании
если в качестве основного объекта формы выбраны значения типа переключателя не определить его выбираемое значение, то в данные
ОтчетОбъект.<имя> или ОбработкаОбъект.<имя>, поскольку эту всегда будет помещаться нулевое значение.
функциональность обеспечивают соответствующие расширения Возможность задания значения, которое будет выбираться
формы. конкретным переключателем, позволяет сделать алгоритм обработки
Более подробно о том, что такое расширения формы, можно работы переключателя независимым от порядка следования элементов
прочитать в разделе «Данные и элементы управления» на странице управления, расположенных в форме.
502. Примеры использования переключателя можно посмотреть в
разделах «Изменение источника данных табличного поля» на странице
Есть л и в 1С :Пр едпр иятии 8.0 аналог мето да 516, и «Изменение данных табличного поля путем установки типа
АктивизироватьОбъект(), чтобы активизировать нужную строку значения» на странице 520.
табличного поля?
В версии 8.0 активизация строки табличного поля выполняется Как настроить порядок обхода в форме?
установкой свойства ТекущаяСтрока соответствующего элемента По умолчанию, у панелей форм в 1С:Предприятии 8.0 установлен
управления. Этому свойству нужно присвоить значение, которое будет режим автоматического определения порядка обхода. В этом режиме
идентифицировать нужную строку. Тип этого значения зависит от настроить порядок обхода вручную нельзя.
типа данных, с которыми связано табличное поле.
Для того чтобы стала доступна ручная настройка порядка обхода,
К примеру, если речь идет о списке справочника, то это будет нужно в палитре свойств панели формы сбросить флаг «Автопорядок
ссылка на элемент справочника. обхода».
Кроме механизма, описанного выше, существует более общий Также нужно помнить, что порядок обхода задается не для всей
механизм, позволяющий организовывать взаимодействие между формы целиком, а для каждой панели, расположенной в форме,
различными формами. поэтому и свойство «Автопорядок обхода» нужно регулировать для
Как правило, для установки текущей строки в некоторой форме каждой панели отдельно.
списка из другой формы, нужно использовать свойство формы
НачальноеЗначениеВыбора, а также свойства
ПараметрТекущаяСтрока соответствующих расширений форм
списков.

620 621
гкий справочник разработчика Вопросы при переходе с версии 7.7

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

623
раткий справочник разработчика Вопросы при переходе с версии

У меня не получается программно изменить элемент справочника.


Говорят, что в версии 8.0 нет периодических реквизитов Почему?
справочников. А как же теперь хранить историю изменения их По всей видимости, вы пытаетесь изменять элемент справочника,
значений? используя объект СправочникСсылка^имя>. Объекты этого типа
Действительно, в версии 8.0 нет возможности создавать позволяют обращаться к реквизитам и табличным частям справочника
периодические реквизиты объектов. На смену им пришел новый, более в режиме "только чтение".
универсальный механизм, представленный регистрами сведений.
Для того чтобы изменить данные элемента справочника следует
Регистры сведений позволяют хранить информацию любого типа на
получить объект СправочникОбъект.<имя>, который позволяет как
пересечении комбинации значений измерений. читать, так и записывать данные. Это возможно с помощью метода
Регистр сведений можно сделать периодическим, и тогда он будет ПолучитьОбъект().
хранить историю изменения этих значений, с заданной точностью
(имеется возможность задать различную периодичность регистра Более подробную информацию можно найти в главах «Виды
объектов встроенного языка, предназначенные для работы с данными
сведений - месяц, день, позиция документа и пр.).
прикладных объектов конфигурации» на странице 551,
В качестве примера можно посмотреть периодический регистр «Манипулирование данными объектов» на странице 561, а также в
сведений «Цены», хранящий историю изменения цен номенклатуры, в статьях на диске ИТС: "Работа с прикладными объектами средствами
главе «Периодический регистр сведений» на странице 118. встроенного языка" и "Типы значений, связанные с прикладными
Более подробную информацию можно найти на диске ИТС в статье объектами".
"Периодические регистры сведений".
У прикладных объектов нет методов ПолучитьАтрибут() и
Написал процедуру ПриОткрытии() в модуле формы, но она не УстановитьАтрибут(). Как теперь обращаться к атрибутам
вызывается, когда я открываю форму. В чем дело? объектов, если имя атрибута формируется в процессе
Дело в том, что в версии 8.0 любому событию формы может быть вычислений?
назначена процедура, которая будет обрабатывать это событие. Имя Встроенный язык версии 8.0 поддерживает универсальную
такой процедуры может не совпадать (а в большинстве случаев и не возможность обращения к свойствам объектов, используя
совпадает) с именем события, поэтому для того, чтобы ваша процедура конструкцию [<имя свойства>], где <имя свойства> - строка или
«ПриОткрытии» стала обрабатывать событие формы «При открытии» строковая переменная, содержащая имя требуемого свойства:
необходимо в конфигураторе, в палитре свойств формы, явным
образом назначить ее обработчиком этого события. ИмяСвойства = "Наименование";
Для упрощения работы, в версии 8.0 можно создавать шаблоны Объект[ИмяСвойства] = Объект[ИмяСвойства] + " Новый"
обработчиков событий формы. Для этого следует выбрать нужное
событие в палитре свойств и нажать на символ лупы в конце поля
ввода. Система создаст объявление процедуры в модуле формы и В 7.7 были методы ТекущийДокумент() и ТекущийЭлемент() для
свяжет ее с выбранным событием. получения позиционированного элемента справочника или
Подробнее можно прочитать об этом в главе «Обработчики документа. А как теперь это сделать в 8.0?
событий» на странице 546, и на диске ИТС в статье "Процедуры - В версии 8.0 была введена унифицированная объектная структура
обработчики событий". данных. Теперь значение ссылки на объект базы данных хранится в
поле Ссылка, и во всех случаях (при использовании объекта, выборки,

624 625
!раткий справочник разработчика Вопросы при переходе с версии 7.7

запроса и т.д.) значение ссылки на объект можно получить по имени Документ


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

626 627
раткий справочник разработчика Вопросы при переходе с версии 7.7

Как сохранить документ без проведения (в 7.7 можно было Для обхода табличной части можно использовать и обычный цикл
написать в кнопке #Записать Закрыть)? Для ... По ... Цикл ... КонецЦикла, но необходимо помнить, что
В версии 8.0 следует использовать обработчик события нажатия индекс первого элемента коллекции всегда равен нулю:
кнопки. Назначение процедур модуля обработчиками события нажатия
возможно как для новых кнопок, размещаемых в форме, так и для Для СчетчикЦикла = 0 По Материалы.Количество() - 1 Цикл
ОчереднаяСтрока = Материалы[СчетчикЦикла];
стандартных кнопок, расположенных в командной панели КонецЦикла;
«ОсновныеДействияФормы».
В обработчике события нажатия следует вызвать метод объекта
В качестве примера можно посмотреть главу «
документ Записать(), с первым параметром, равным Способы работы с коллекцией» на странице 550, или обработчик
РежимЗаписиДокумента.Запись. После этого нужно закрыть события «ОбработкаПроведения» в модуле документа
форму: «ПриходнаяНакладная» в разделе «Создание движений документа
ПриходнаяНакладная» на странице 89.
Процедура ЗаписатьБезПроведенияИЗакрыть(Кнопка)
Записать(РежимЗаписиДокумента.Запись); Закрыть();
КонецПроцедуры _______________ _______________ Есть ли в версии 8.0 подчиненные документы?
Нет, специального понятия "Подчиненные документы" в версии 8.0
не существует.
В версии 8.0 одни объекты (документы, элементы справочников,
Как перебрать строки табличной части документа? задачи и т.д.) могут являться основанием, для создания других
Табличная часть документа (так же, как и любого другого объекта объектов. Таким образом, документ может быть создан не только на
конфигурации, обладающего табличными частями) представляет основании другого документа, но и на основании, например, элемента
собой коллекцию значений, элементами которой являются строки справочника или бизнес-процесса.
табличной части. Поэтому перебор строк табличной части (так же, как
Поэтому теперь, для получения документов, имеющих ссылки на
и любой другой коллекции значений) проще всего реализовать с
некоторый документ, рекомендуется использовать объект Критерий
помощью циклаДля Каждого ... Из ... Цикл ... КонецЦикла:
отбора. Использование критерия отбора предоставляет больше
возможностей, чем механизм подчиненных документов. Критерий
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл отбора позволяет отбирать не только документы, но и другие объекты
ОчереднаяСтрока = ТекСтрокаМатериалы; базы данных. Кроме того, он позволяет непосредственно указать
КонецЦикла; перечень реквизитов, по значению которых необходимо выполнять
отбор.
При этом переменной цикла «ТекСтрокаМатериалы» будет
являться не номер строки, а вся строка как объект. Для получения В форме критерия отбора можно использовать стандартный список
для отображения найденных значений и также в форме вставить
номера строки следует использовать свойство НомерСтроки или
список документов с отбором по указанному критерию.
добавить переменную и увеличивать ее в теле цикла.
Однако следует учитывать, что критерий отбора не позволяет
выполнять динамический просмотр найденных данных. В список
будут включаться все найденные объекты. Соответственно,
нецелесообразно использовать этот механизм, если количество

629
Вопросы при переходе с версии 7.7
шожения

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

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


Как теперь обрабатывать во встроенном языке ввод на основании Существует два способа, которыми можно это сделать.
и копирование? Во-первых, можно «пойти от документа». Для этого следует
В версии 8.0 при вызове стандартной команды ввода на основании воспользоваться свойством объекта ДокументОбъект.<имя> -
выполняется создание нового объекта и вызов в модуле этого объекта Движения. Это свойство содержит коллекцию пустых наборов
обработчика события «Обработка заполнения». записей документа по каждому из регистров, которые указаны для

631
630
Приложения

этого документа в конфигураторе. Чтобы получить движения


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

Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
Движения.Отбор.Регистратор.Значение = Документы.ПриходнаяНакладная.
Пример вызова: Выбор = ВыбратьИзСпиека(СписокЗначений, ЭлементФормы,
НайтиПоНомеру( 1);
Движения.Прочитать();
НачальноеЗначение);

В 7.7 были общие реквизиты. В версии 8.0 их нет? Таблица (табличный документ)
Да. Было принято решение в версии 8.0 отказаться от общих
реквизитов документов. Вместе с этим в версии 8.0 нет и общего В 7.7 была процедура НоваяСтраница(). А что в 8.0?
журнала документов. Для того, чтобы в версии 8.0 вставить в табличный документ
Теперь, если у всех документов нужно иметь аналогичные разделитель страниц, следует использовать метод объекта
реквизиты, например, «Автор» и «Редактор», эти реквизиты следует ТабличныйДокумент
создать вручную у каждого документа. ВывестиГоризонтальныйРазделительСтраниц().
Следует заметить, что также появилась возможность вставлять в
При необходимости использовать аналог общего журнала версии табличный документ и вертикальные разделители страниц (метод
7.7, следует просто создать журнал документов, в котором будут ВывестиВертикальныйРазделительСтраниц()).
регистрироваться все существующие документы.
Однако в этом случае следует иметь в виду, что при интенсивной Как сохранить табличный документ в формате Excel? У меня
работе пользователей в файловом варианте информационной базы, ничего не получается...
высока вероятность возникновения коллизий. Добиться ее уменьшения В версии 8.0 для сохранения табличного документа в формате,
отличающемся от его исходного формата, следует использовать пункт
можно путем исключения из состава этого журнала документов,
меню Файл | Сохранить копию...
которые проводятся наиболее часто.
Команда меню Файл | Сохранить как... позволяет сохранять
табличный документ только в «родном» формате.
Вопросы при переходе с версии 7.7
Приложения

Версия 8.0
Запрос
В запросах версии 7.7 была опция «все вошедшие в запрос». Как
Общие вопросы
сделать то же самое в 8.0?
В версии 7.7 опция «все вошедшие в запрос» использовалась для Я указываю период (дату начала, дату окончания), но последний
день в него не попадает. Почему?
вывода в отчет всех значений одной из группировок запроса. Такая
Дело в том, что в версии 8.0 значения типа Дата включают в себя
необходимость могла возникнуть при создании, например, отчета об
время с точностью до секунд. По умолчанию, если время в явном виде
остатках на складах, в котором обязательно должны быть указаны все
не задается, оно устанавливается равным 00:00:00. Поэтому, если
склады, независимо от того, есть на них остатки товаров, или нет. нужно указать период по какую-то дату включительно, следует
В версии 8.0 для решения такой задачи следует использовать указывать конец суток, т.е. определенную дату со временем 23:59:59,
параметр «Группировки для значений группировок» методов либо использовать функцию КонецДня(), если время в явном виде не
Выбрать() результата запроса и выборки из результата запроса. Если в задается.
качестве этого параметра указать "Все", то будут выбраны все
В качестве примера можно посмотреть процедуру
значения этой группировки в запросе. Если же указать конкретную «ДействияФормыРейтингУслугСформировать» в модуле формы
вышестоящую группировку, то будут выбраны все значения отчета «РейтингУслуг» в разделе «Отчет Рейтинг услуг» на странице
группировки для текущих значений указанных вышестоящих 173.
группировок.
В качестве примера можно привести отчет по складским остаткам,
Преобразую число из 4 цифр в строку и получаю количество
сгруппированным по фирмам. В таком отчете данные по фирме будут символов в строке - 5. Это почему так?
выводиться с новой страницы, причем для каждой фирмы будет Дело в том, что в версии 8.0 получение строкового представления
сформирован свой состав колонок-складов в зависимости от того, на числа выполняется на основе региональных настроек, установленных
каких складах есть остатки по этой фирме. на компьютере.
Наряду с описанным выше параметром, для группировок типа Дата В случае, когда установлены стандартные региональные настройки
существует возможность указать в тексте запроса способ дополнения для России, при приведении числа к строке между группами разрядов
результата запроса значениями группировки в указанном интервале с чисел вставляется неразрывный пробел (Символы.НПП), например:
заданной периодичностью. Для этого в описании формирования
итогов используется ключевое слово ПЕРИОДАМИ. Год = 2004;
С помощью такой конструкции можно, например, сформировать СтроковоеПредставление = Строка(Год);
отчет о продажах по неделям, в котором будет отражена каждая // СтроковоеПредставление = "2 004"
// длина строки - 5 символов, включая неразрывный пробел
неделя, независимо от того, были ли продажи в эту неделю, или нет.
Вывод в отчет всех периодов может понадобиться также при
построении диаграмм, в которых необходимо обеспечить
непрерывность отображения периодов.
В качестве примера можно посмотреть отчет «Выручка мастеров» в
разделе «Отчет ВыручкаМастеров» на странице 183.

635
Приложения Вопросы при переходе с версии 7.7

Чтобы преобразовать число к строке без вставки символа- У меня есть реквизит составного типа, включающий ссылки на
разделителя групп (неразрывного пробела), нужно использовать два справочника. Когда я пытаюсь получить через точку
функцию Формат() с параметром «ЧГ» равным нулю: наименование справочника, система выдает ошибку. Почему?
В 1С:Предприятии 8.0 для реквизитов имеющих составной тип
Год = 2004; (боле одного типа) независимо от того какие типы в него включены,
СтроковоеПредставление = Формат(Год,"ЧГ = 0"); значением по умолчанию является значение Неопределено.
// СтроковоеПредставление = "2004" Поэтому выражение Реквизит.Наименование будет выдавать
// длина строки - 4 символа ошибку, если реквизиту «Реквизит» не присвоено значение ссылки на
один из двух справочников, выбранных в типе этого реквизита.
Чтобы изменить преобразование чисел к строке по умолчанию,
нужно для информационной базы установить региональные настройки Какие особенности имеют общие модули в 8.0?
(например, параметр «Группировка» установить в ноль). Для этого В общих модулях конфигурации могут использоваться только
следует воспользоваться командой меню процедуры и функции общих модулей.
Администрирование | Региональные настройки ИБ ... В них не могут использоваться процедуры, функции и переменные
Если стоит задача получения строкового представления текущего модуля приложения и модуля внешнегосоединения. Кроме того, в
года, можно воспользоваться встроенной функцией формат, указав в ее общих модулях допускается определение только процедур и функций
параметре соответствующую форматную строку: и не допускается определение переменных.
Таким образом, общие модули представляют собой набор
Формат(ТекущаяДата(), "ДФ = птг") доступных в конфигурации процедур и функций и не имеют
: хранимого состояния. Это позволяет использовать их не только в
| клиентском приложении и внешнем соединении, но и на сервере
1С:Предприятия.
Более подробную информацию можно найти на диске ИТС в статье
"Особенности форматирования значений". Чем отличается значение типа Неопределено и значение типа
Null?
Допускает ли версия 8.0 два сеанса работы для одного Значение типа Неопределено используется, прежде всего, как
пользователя одновременно? значение по умолчанию (незаданное значение) для полей с составным
Да, в версии 8.0 одновременно может быть запущено два и более типом. Например, если есть реквизит, который имеет составной тип,
сеансов работы с одним пользователем системы. Наличие такой включающий СправочникСсылка.Сотрудники и
возможности весьма полезно. Например, пользователь, может СправочникСсылка.Клиенты, то значением этого реквизита по
запустить выполнение длительной операции в одном сеансе и, умолчанию будет Неопределено. Также это значение используется и
запустив второй сеанс, продолжать работать с системой. в других случаях для обозначения неуказанного значения.
Значение типа Null используется при работе с таблицами
Что будет результатом вычитания двух значений типа Дата? прикладных объектов. Оно обозначает отсутствие значения поля в
В версии 8.0 значение типа Дата содержит как дату, так и время с выборке. Прежде всего, оно используется в результатах запросов
точностью до секунды. Поэтому результатом вычитания двух выполняющих левое или правое соединение. Поля невыбранных
значений типа Дата будет число - разница в секундах. записей таблиц участвующих в таких соединениях будут иметь
значение Null. Кроме того, значение типа Null будет иметь, например,
Для получения следующей даты нужно прибавить к дате
количество секунд в дате.

636
637
Вопросы при переходе с версии 7.7
Приложения

Можно ли обращаться к переменным, процедурам и функциям


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

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

639
638
[риложения

нажать «ОК».
Например, форма документа будет поддерживать
функциональность, ориентированную на редактирование документа,
В каком порядке обходятся элементы соответствия циклом Для если в качестве ее основного реквизита выбрано значение типа
каждого. ДокументОбъект.<имя>.
При использовании конструкции Для Каждого ... Из ... Цикл ... Таким образом, при выборе соответствующих типов реквизитов
КонецЦикла элементы соответствия обходятся в произвольном любая форма может использоваться для редактирования и просмотра
любых данных.
порядке.
При создании форм с помощью конструкторов в форме
Можно ли программно «выгонять» пользователей из размещаются реквизиты и элементы управления, в зависимости от ее
1С:Предприятия 8.0? назначения, выбранного в конструкторе, однако при необходимости
разработчик может реализовать в форме любую функциональность.
Да, можно.
Более подробную информацию можно найти в разделах «Данные и
Для этого следует использовать процедуру глобального контекста элементы управления» на странице 502 и «Механизм основных форм»
ПрекратитьРаботуСистемы(). Ее выполнение приведет к тому, что на странице 542.
работа системы будет завершена независимо от наличия модальных
диалогов, открытых редактируемых форм документов, справочников и
Выполняется ли автоматическое обновление списков в формах?
т.д. При этом не будут вызваны процедуры-обработчики событий
Да, выполняется, но не всегда.
завершения работы системы.
В 1С:Предприятии 8.0 автоматическое обновление списков в
формах по умолчанию выполняется, только в том случае, когда данные
Интерфейсные объекты изменяются в текущем сеансе в клиентском приложении.
Если пользователь хочет видеть в списках изменения, вносимые
Чем в 1С:Предприятии 8.0 отличаются формы справочников, другими пользователями, то ему необходимо нажимать кнопку
документов и других объектов? обновления в командной панели списка или установить режим
Механизм форм в 1С:Предприятии 8.0 позволяет в любой форме автоматического обновления списка с определенной периодичностью.
отображать и редактировать любые данные. Принадлежность форм в Этот режим устанавливается в окне настройки списка.
конфигурации к конкретным объектам метаданных необходима для Режим устанавливается для каждого списка независимо.
удобства организации структуры прикладного решения. To есть форма Рекомендуется устанавливать этот режим только для тех списков,
в конфигурации только "принадлежит" объекту метаданных и может которые действительно необходимо периодически обновлять. Это
использоваться в качестве основной формы для просмотра списка, позволить избежать лишней нагрузки на систему, особенно в
редактирования или выбора. Содержимое формы никак не многопользовательском режиме работы.
определяется тем, к какому объекту метаданных относится форма и
выбрана ли форма в качестве основной. Можно ли в формах списков устанавливать отбор и сортировку по
нескольким полям?
Функциональность формы определяется исключительно
реквизитами формы и связанными с ними элементами управления. В Во всех динамических списках программно можно устанавливать
большинстве случаев функциональность формы обеспечивается за отбор и сортировку по любым комбинациям полей. Пользователю по
умолчанию система предлагает набор доступных для установки отбора
счет выбора основного реквизита формы. Он определяет наличие
и сортировки полей, исходя из возможности выполнять отбор и
расширения формы и обеспечивает специфическое поведение формы
для конкретного прикладного объекта.

641
!ложения Вопросы при переходес версии 7.7

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

642 643
риложения Вопросы при переходесверсин 7.7

Чтобы выполнять поиск по другой колонке, нужно сменить Прикладные объекты


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

Пример смены источника данных у табличного поля можно _________________ ЭлементыФормы.СправочникСписок.ТекущиеДанные.Ссылка);


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

645
Приложения Вопросы при переходе свепсии 7 7

При обращении к спискам регистров свойство ТекущаяСтрока Для получения более подробной информации можно посмотреть
будет выдавать уже ключ записи регистра, который состоит из главу «Объект конфигурации регистр сведений» на странице 120, а
нескольких полей. также статьи на диске ИТС: "Периодические регистры сведений" и
Таким образом, свойство ТекущаяСтрока для всех типов данных "Проектирование структуры периодических регистров сведений".
выдает значение, идентифицирующее текущую строку.
Почему в 8.0 нет возможности интерактивно открыть форму
Для чего служит флажок «Автопорядок по коду» у плана счетов? элемента справочника только для просмотра?
В версии 8.0 при открытии формы объекта (документа, элемента
Свойство «Автопорядок по коду» используется для того, чтобы
справочника и т.д.) не выполняется (как раньше) блокировка объекта
указать системе, что упорядочивание по полю «Порядок» должно
от изменения другими пользователями. Поэтому два пользователя
всегда подставляться в тех случаях, когда пользователь или
могут, например, открыть один и тот же документ одновременно.
разработчик выбирает упорядочивание по коду. Его нужно Блокировка устанавливается при начале редактирования данных
использовать, прежде всего, тогда, когда с точки зрения пользователя объекта в форме. Если объект уже заблокирован другим
нужно упорядочивать план счетов по коду с учетом разделителей кода пользователем, то при попытке начала редактирования будет выдано
счета. Например, если упорядочивать по коду счета, то счета будут соответствующее сообщение.
располагаться так:
Таким образом, нет необходимости в специальном режиме
«10.11» открытия форм объектов для просмотра. Форма объекта может быть
«10.2» открыта из любого режима программы (из списка, из отчета в качестве
Это правильно с точки зрения сортировки строк, но не расшифровки и т.д.) без указания того, предполагается ли выполнять
соответствует логическому смыслу кодов. редактирование или нет.
Но если заданы значения поля «Порядок»: «10.11» и «10. 2» и
установлено свойство «Автопорядок по коду», то при выборе
упорядочивания по коду пользователь будет, фактически, получать
порядок, учитывающий разделители:
«10.2»
«10.11».
Если свойство не установить, то нужно будет в явном виде
выбирать упорядочивание по полю «Порядок».

После записи в регистр сведений набора записей в нем пропадают


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

646 647
Универсальные коллекции значений
Глава 2. Приемы разработки, Использование объекта Структура - процедура «РозничнаяЦена»
перечисленные в книге в общем модуле «РаботаСоСправочниками» в разделе «Создание
функции РозничнаяЦена()» на странице 124.
Использование объекта Массив - список документа
Встроенный язык «ОказаниеУслуги» в разделе «Изменение данных табличного поля
путем установки типа значения» на странице 520.
Использование функции КонецДня() - процедура
«РейтингУслуг» в модуле формы отчета «РейтингУслуг» в разделе Интерфейсные объекты
«Отчет Рейтинг услуг» на странице 173.
Вычисляемое значение в поле ввода строки табличного поля -
процедура «МатериалыКоличествоПриИзменении» в модуле формы
Глобальный контекст документа «ПриходнаяНакладная» в разделе «Создание процедуры
Сериализация объектов 1С:Предприятия - процедуры обработки события в модуле формы» на странице 74.
«ЗаписатьСообщениеСИзменениями» Создание обработчиков событий элементов управления -
процедура «МатериалыКоличествоПриИзменении» в модуле формы
и документа «ПриходнаяНакладная» в разделе «Создание процедуры
«ПрочитатьСообщениеСИзменениями» в модуле узла плана обмена обработки события в модуле формы» на странице 74.
«ОбменСФилиалами» в разделе «Создание процедуры записи данных» Обработка нескольких событий одной процедурой - модуль
на странице 407. формы документа «ПриходнаяНакладная» в разделе «Создание
процедуры обработки события в общем модуле» на странице 77.
Использование макета для вывода в табличный документ -
Общие объекты процедура «РеестрДокументовОказаниеУслуги» в модуле формы
Использование объекта ПостроительОтчета - модуль отчета отчета «РеестрДокументовОказаниеУслуги» в разделе «Отчет
«Универсальный» в разделе «Создание универсального отчета» на РеестрДокументовОказаниеУслуги» на странице 166.
странице 211. Управление группировками при выводе в табличный документ
процедура «ВыручкаМастеров» в модуле формы отчета
Чтение и запись XML документов - процедура «ВыручкаМастеров» в разделе «Отчет ВыручкаМастеров» на странице
«ЗаписатьСообщениеСИзменениями» в модуле узла плана обмена 183.
«ОбменСФилиалами» в разделе «Создание процедуры записи данных» Работа с элементом управления Список выбора - модуль формы
на странице 407. отчета «РейтингКлиентов» в разделе «Создание отчета
Работа с объектом Файл - процедуры РейтингКлиентов» на странице 198.
«ЗаписатьСообщениеСИзменениями» Заполнение диаграммы данными - процедура «Сформировать» в
модуле формы отчета «РейтингКлиентов» в разделе «Создание отчета
и РейтингКлиентов» на странице 198.
«ПрочитатьСообщениеСИзменениями» в модуле узла плана обмена
«ОбменСФилиалами» в разделе «Создание процедуры записи данных»
на странице 407.
Работа с объектом ДиалогВыбораФайла - процедуры модуля
формы обработки «ОбменСОтделениями» в разделе «Программный
обмен в распределенной информационной базе» на странице 433.
Использование объекта ОписаниеТипов - список документа
«ОказаниеУслуги» в разделе «Изменение данных табличного поля
путем установки типа значения» на странице 520.
649
Приемы разработки, перечисленные в

Использование сводной таблицы - модуль отчета «ВариантыНоменклатуры» в разделе «Доработка справочника


«Универсальный» в разделе «Создание универсального отчета» на ВариантыНоменклатуры» на странице 269.
странице 211. Использование подключаемых обработчиков изменения
Вывод данных в сводную диаграмму - отчет данных формы - форма элемента справочника
«ВыручкаМастеров2» в разделе «Отчет ВыручкаМастеров2» на «ВариантыНоменклатуры» в разделе «Доработка справочника
ВариантыНоменклатуры» на странице 269.
странице 227.
Заполнение диаграммы Ганта данными - процедура Организация подбора - форма документа «ПриходнаяНакладная»
«КнопкаСформироватьНажатие» в модуле отчета в разделах «Одиночный подбор», «Множественный подбор» и
«Подбор с использованием множественного выбора» на страницах
«ДиаграммаНачислений» в разделе «Создание отчета
488, 490 и 490 соответственно.
ДиаграммаНачислений» на странице 366.
Использование элемента управления Переключатель - список Изменение источника данных табличного поля - список
документа «ПриходнаяНакладная» в разделе «Изменение источника документа «ПриходнаяНакладная» в разделе «Изменение источника
данных табличного поля» на странице 516.
данных табличного поля» на странице 516, и список документа
«ОказаниеУслуги» в разделе «Изменение данных табличного поля Изменение данных табличного поля путем установки типа
путем установки типа значения» на странице 520. значения - список документа «ОказаниеУслуги» в разделе
Работа с панелями и страницами панелей формы - форма «Изменение данных табличного поля путем установки типа значения»
на странице 520.
элемента справочника «Номенклатура» в разделе «Доработка
справочника Номенклатура» на странице 261. Вычисляемая колонка в табличном поле - список справочника
«Номенклатура» в разделе «Вычисляемые колонки в списках» на
Использование связи по типу - форма элемента справочника
странице 524.
«Номенклатура» в разделе «Доработка справочника Номенклатура» на
Оформление строк табличного поля - список справочника
странице261.
«Номенклатура» в разделе «Оформление строк табличного поля» на
Использование связи по владельцу - форма элемента странице 527.
справочника «Номенклатура» в разделе «Доработка справочника
Номенклатура» на странице 261, и форма документа Использование вариантов стандартного оформления макетов -
модуль формы отчета «Универсальный2» в разделе «Отчет
«ПриходнаяНакладная» в разделе «Доработка документа
Универсальный2» на странице 216 .
ПриходнаяНакладная» на странице 271.
Использование связи по регистратору - форма документа Получение итога табличного поля по колонке - форма
документа «ОказаниеУслуги» в разделе «Редактирование формы
«ПриходнаяНакладная» в разделе «Связанные списки» на странице документа ОказаниеУслуги» на странице 114.
512.
Связь одного табличного поля со строкой другого табличного Работа с запросами
поля - форма элемента справочника «Номенклатура» в разделе
«Доработка справочника Номенклатура» на странице 261, и форма Использование ключевого слова ВЫБРАТЬ - процедура
«РеестрДокументовОказаниеУслуги» в модуле формы отчета
документа «ПриходнаяНакладная» в разделе «Связанные списки» на
«РеестрДокументовОказаниеУслуги» в разделе «Отчет
странице 512.
РеестрДокументовОказаниеУслуги» на странице 166.
Связь табличного поля с объектом, в форме которого оно
расположено - форма элемента справочника

650 651
Приемы разработки, перечисленные в книге

Получение данных регистра накопления запросом - процедура


Использование ключевого слова ИЗ - процедура
«РейтингУслуг» в модуле формы отчета «РейтингУслуг» в разделе
«РеестрДокументовОказаниеУслуги» в модуле формы отчета «Отчет Рейтинг услуг» на странице 173.
«РеестрДокументовОказаниеУслуги» в разделе «Отчет
РеестрДокументовОказаниеУслуги» на странице 166. Получение данных регистра сведений запросом - процедура «» в
Использование ключевого слова КАК - процедура модуле формы отчета «ПереченьУслуг» в разделе «Отчет
«РеестрДокументовОказаниеУслуги» в модуле формы отчета ПереченьУслуг» на странице 191.
«РеестрДокументовОказаниеУслуги» в разделе «Отчет Получение данных регистра бухгалтерии запросом - отчет
РеестрДокументовОказаниеУслуги» на странице 166. «ОборотноСальдоваяВедомость» в разделе «Создание отчета
Использование ключевого предложения УПОРЯДОЧИТЬ ПО - ОборотноСальдоваяВедомость» на странице 312.
процедура «РеестрДокументовОказаниеУслуги» в модуле формы Получение данных плана счетов запросом - отчет
отчета «РеестрДокументовОказаниеУслуги» в разделе «Отчет «ОборотноСальдоваяВедомость» в разделе «Создание отчета
РеестрДокументовОказаниеУслуги» на странице 166. ОборотноСальдоваяВедомость» на странице 312.
Использование ключевого предложения ЛЕВОЕ Получение данных перерасчета запросом - отчет «Перерасчет» в
СОЕДИНЕНИЕ ПО - процедура «РейтингУслуг» в модуле формы разделе «Иллюстрация механизмов вытеснения и зависимости от
отчета «РейтингУслуг» в разделе «Отчет Рейтинг услуг» на странице базы» на странице 345, и процедура «ПерерасчитатьНачисления» в
173. общем модуле «ПроведениеРасчетов» в разделе «Выполнение
перерасчета записей регистра» на странице 359.
Использование ключевого слова ГДЕ - процедура
«РейтингУслуг» в модуле формы отчета «РейтингУслуг» в разделе Получение данных графика регистра расчета запросом -
«Отчет Рейтинг услуг» на странице 173. процедура «РасчитатьНачисления» в общем модуле
Использование ключевого слова ИТОГИ - процедура «ПроведениеРасчетов» в разделе «Создание процедуры расчета
записей регистра Начисления» на странице 349.
«РейтингУслуг» в модуле формы отчета «РейтингУслуг» в разделе
«Отчет Рейтинг услуг» на странице 173. Получение данных базы регистра расчета запросом - процедура
Использование ключевого слова ИЕРАРХИЯ - процедура «РасчитатьНачисления» в общем модуле «ПроведениеРасчетов» в
«ПереченьУслуг» в модуле формы отчета «ПереченьУслуг» в разделе разделе «Создание процедуры расчета записей регистра Начисления»
на странице 349.
«Отчет ПереченьУслуг» на странице 191.
Использование ключевого предложения ДЛЯ ИЗМЕНЕНИЯ - Получение данных регистра расчета запросом - отчет
процедура «ОбработкаПроведения» документа «ОказаниеУслуги» в «НачисленияСотрудникам» в разделе «Создание отчета
разделе «Оптимизация документа ОказаниеУслуги» на странице 238. НачисленияСотрудникам» на странице 357.
Получение данных документов запросом - процедура Получение данных фактического периода действия записей
«РеестрДокументовОказаниеУслуги» в модуле формы отчета регистра расчета запросом - процедура
«РеестрДокументовОказаниеУслуги» в разделе «Отчет «КнопкаСформироватьНажатие» в модуле отчета
РеестрДокументовОказаниеУслуги» на странице 166. «ДиаграммаНачислений» в разделе «Создание отчета
Получение данных справочника запросом - процедура ДиаграммаНачислений» на странице 366.
«РейтингУслуг» в модуле формы отчета «РейтингУслуг» в разделе Задание параметров виртуальной таблицы источника -
«Отчет Рейтинг услуг» на странице 173. процедура «РейтингУслуг» в модуле формы отчета «РейтингУслуг» в
разделе «Отчет Рейтинг услуг» на странице 173.

653
652
Приемы разработки, перечисленные в книге

Как выбрать данные из нескольких таблиц - процедура Обход многоуровневых группировок в результате запроса -
«РейтингУслуг» в модуле формы отчета «РейтингУслуг» в разделе процедура «ВыручкаМастеров» в модуле формы отчета
«Отчет Рейтинг услуг» на странице 173. «ВыручкаМастеров» в разделе «Отчет ВыручкаМастеров» на странице
Как выбрать данные, входящие в указанный период - 183.
процедура «РейтингУслуг» в модуле формы отчета «РейтингУслуг» в Получение итогов по всем датам в выбранном периоде -
разделе «Отчет Рейтинг услуг» на странице 173. процедура «ВыручкаМастеров» в модуле формы отчета
Получение данных регистра накопления периодами - процедура «ВыручкаМастеров» в разделе «Отчет ВыручкаМастеров» на странице
«ВыручкаМастеров» в модуле формы отчета «ВыручкаМастеров» в 183.
разделе «Отчет ВыручкаМастеров» на странице 183. Вычисляемое поле в результате запроса - смотри процедуру
Вычисляемое поле в источнике запроса - процедура «Сформировать» в модуле формы отчета «РейтингКлиентов» в
«Сформировать» в модуле формы отчета «РейтингКлиентов» в разделе разделе «Создание отчета РейтингКлиентов» на странице 198.
«Создание отчета РейтингКлиентов» на странице 198. Выгрузка результата запроса в таблицу значений - смотри
Передача списка значений в параметры виртуальной таблицы модуль формы отчета «РейтингКлиентов» в разделе «Создание отчета
- процедура «ОбработкаПроведения» документа «ОказаниеУслуги» в РейтингКлиентов» на странице198.
разделе «Оптимизация документа ОказаниеУслуги» на странице 238, и Выгрузка результата запроса в список значений - смотри
процедура «ОстаткиМатериаловПоСвойствам» в форме отчета обработчик события «ОбработкаПроведения» документа
«ОстаткиМатериаловПоСвойствам» в разделе «Отчет «НачисленияСотрудникам» в разделе «Создание процедуры расчета
ОстаткиМатериаловПоСвойствам» на странице 277. записей регистра Начисления» на странице 349.
Передача результата запроса в параметры виртуальной
таблицы - процедура «ОбработкаПроведения» документа Прикладные объекты
«ОказаниеУслуги» в разделе «Оптимизация документа Обращение к табличной части и данным строки табличной
ОказаниеУслуги» на странице 238. части в форме документа - процедура
Динамическое формирование текста запроса - процедура «МатериалыКоличествоПриИзменении» в модуле формы документа
«ОстаткиМатериаловПоСвойствам» в форме отчета «ПриходнаяНакладная» в разделе «Создание процедуры обработки
события в модуле формы» на странице 74.
«ОстаткиМатериаловПоСвойствам» в разделе «Отчет
ОстаткиМатериаловПоСвойствам» на странице 277. Обход табличной части документа - процедура
Вывод результата запроса в табличный документ - процедура «ОбработкаПроведения» в модуле документа «Приходная накладная»
в разделе «Создание движений документа ПриходнаяНакладная» на
«РеестрДокументовОказаниеУслуги» в модуле формы отчета
странице 89.
«РеестрДокументовОказаниеУслуги» в разделе «Отчет
РеестрДокументовОказаниеУслуги» на странице 166. Формирование и запись движений документа в модуле
Получение промежуточных итогов - процедура документа - процедура «ОбработкаПроведения» в модуле документа
«Приходная накладная» в разделе «Создание движений документа
«ВыручкаМастеров» в модуле формы отчета «ВыручкаМастеров» в
ПриходнаяНакладная» на странице 89.
разделе «Отчет ВыручкаМастеров» на странице 183.
Формирование движений по регистру накопления остатков -
Управление порядком вывода итогов в результате запроса -
процедура «ОбработкаПроведения» в модуле документа «Приходная
процедура «ВыручкаМастеров» в модуле формы отчета накладная» в разделе «Создание движений документа
«ВыручкаМастеров» в разделе «Отчет ВыручкаМастеров» на странице ПриходнаяНакладная» на странице 89.
183.
Приложения

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


- процедура «ОбработкаПроведения» в модуле документа
«ОказаниеУслуги» в разделе «Изменение процедуры проведения
документа ОказаниеУслуги» на странице 157.
Формирование движений документа по регистру бухгалтерии -
процедура «ОбработкаПроведения» в модуле документа
«ПриходнаяНакладная» в разделе «Создание движений документа
ПриходнаяНакладная» на странице 303.
Формирование движений документа по регистру расчета -
смотри процедуру «ОбработкаПроведения» документа
«НачисленияСотрудникам» в разделе «Создание документа
НачисленияСотрудникам» на странице 341.
Получение последних значений ресурсов периодического
регистра сведений на указанную дату - процедура «РозничнаяЦена»
в общем модуле «РаботаСоСправочниками» в разделе «Создание
функции РозничнаяЦена()» на странице 124.
Обращение к значению перечисления - процедура
«ОбработкаПроведения» в модуле документа «ОказаниеУслуги» в
разделе «Изменение процедуры проведения документа
ОказаниеУслуги» на странице 134.
Расчет записей регистра расчета - раздел «Создание процедуры
расчета записей регистра Начисления» на странице 349.
Перерасчет записей регистра расчета - процедура
«ПерерасчитатьНачисления» в общем модуле «ПроведениеРасчетов» в
разделе «Выполнение перерасчета записей регистра» на странице 359.
Организация обмена данными на основе механизма
универсального обмена данными - раздел «Универсальный
механизм обмена данными» на странице 400.
Организация обмена данными на основе механизма
распределенных информационных баз - раздел «Механизм
распределенных информационных баз» на странице 426.
Ввод на основании - документ «ОказаниеУслуги» в разделе «Ввод
на основании» на странице 493.
Использование объекта КритерийОтбора - в разделе «Отбор
объектов, введенных на основании» на странице 497.

Вам также может понравиться

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy