Простой пошаговый курс обучения программированию в 1С для всех [Ильяс Низамутдинов] (pdf) читать онлайн

-  Простой пошаговый курс обучения программированию в 1С для всех  26.11 Мб, 711с. скачать: (pdf) - (pdf+fbd)  читать: (полностью) - (постранично) - Ильяс Низамутдинов

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
  [Оглавление]

НИЗАМУТДИНОВ ИЛЬЯС

ПРОГРАММИРОВАТЬ В 1С ЗА
11 ШАГОВ

ПРОСТОЙ ПОШАГОВЫЙ КУРС ОБУЧЕНИЯ
ПРОГРАММИРОВАНИЮ В 1С ДЛЯ ВСЕХ

ИЖЕВСК
2018 ГОД
© Январь 2018 года. Все права защищены

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

Оглавление
Предисловие……………………………………………………………………………………………………………………………….
Введение……………………………………………………………………………………………………………………………………..
Глава 1. Вводная информация……………………………………………………………………………………………………
Часть 1. Установка платформы и создание пустой базы………………………………………….....
Часть 2. Варианты хранения данных в 1С: файловый вариант и клиент-сервер.
Обычное и управляемое приложение…………………………………………………………………………
Часть 3. 1С: Предприятие и 1C:Конфигуратор……………………………………………………………..
Часть 4. Язык программирования в 1С………………………………………………………………………..
Часть 5. Работа со справкой…………………………………………………………………………………………
Часть 6. Свойства конфигурации………………………………………………………………………………….
Часть 7. Создание внешних обработок………………………………………………………………………..
Часть 8. Отладка……………………………………………………………………………………………………………
Глава 2. Примитивные типы и переменные……………………………………………………………………………….
Часть 1. Примитивные типы…………………………………………………………………………………………
Часть 2. Примитивные операции вывода информации………………………………………………
Часть 3. Переменные типа Булево……………………………………………………………………………….
Часть 4. Переменные типа Число…………………………………………………………………………………
Часть 5. Переменные типа Строка……………………………………………………………………………….
Часть 6. Переменные типа Дата…………………………………………………………………………………..
Часть 7. Функции преобразования и общие функции для примитивных типов………..
Глава 3. Основные операторы……………………………………………………………………………………………………
Часть 1. Условие: Если…Тогда…ИначеЕсли…………………………………………………………………..
Часть 2. Цикл: Для…Цикл……………………………………………………………………………………………..
Часть 3. Цикл: Пока…Цикл. Рекурсия переменных………………………………………………………
Часть 4. Работа с процедурами и функциями……………………………………………………………..
Часть 5. Попытка…Исключение…………………………………………………………………………………….
Глава 4. Основы конфигурирования…………………………………………………………………………………………..
Часть 1. Основы конфигурации…………………………………………………………………………………….
Константы……………………………………………………………………………………………………….
Справочники…………………………………………………………………………………………………..
Предопределенные элементы справочников………………………………………………
Подчиненный справочник……………………………………………………………………………..
Иерархический справочник…………………………………………………………………………..
Документы……………………………………………………………………………………………………..
Ввод на основании…………………………………………………………………………………………
Журнал документов……………………………………………………………………………………….
Перечисления…………………………………………………………………………………………………
Регистр сведений……………………………………………………………………………………………
Регистр накопления………………………………………………………………………………………..
План видов характеристик……………………………………………………………………………..
Обработки……………………………………………………………………………………………………….
Отчеты……………………………………………………………………………………………………………..
Основные метаданные ветки
«Общие»………………………………………………………......................................................
Подсистемы…………………………………………………………………………………………………….
Часть 2. Модули……………………………………………………………………………………………………………
Локальные и глобальные переменные………………………………………………………….

3

7
8
10
10
16
21
26
30
34
38
46
55
55
59
63
71
81
99
114
120
120
127
133
138
152
156
156
157
164
168
170
175
178
182
186
190
193
203
212
224
225
225
240
247
247

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

Модули…………………………………………………………………………………………………………….
Модуль формы………………………………………………………………………………………………..
Модуль объекта……………………………………………………………………………………………….
Модули менеджера объекта…………………………………………………………………………..
Общие модули…………………………………………………………………………………………………
Модуль сеанса…………………………………………………………………………………………………
Модуль приложения……………………………………………………………………………………….
Экспорт процедур и функций………………………………………………………………………….
Глава 5. Работа с формами………………………………………………………………………………………………………….
Часть 1. Конструирование форм……………………………………………………………………………………
Основные формы объектов…………………………………………………………………………….
Создание новых форм…………………………………………………………………………………….
Часть 2. Командный интерфейс формы………………………………………………………………………..
Глобальные команды, добавляемые автоматически……………………………………
Глобальные команды, добавленные вручную……………………………………………….
Локальные команды формы…………………………………………………………………………..
Часть 3. Реквизиты и элементы формы…………………………………………………………………………
Реквизиты формы……………………………………………………………………………………………
Элементы формы…………………………………………………………………………………………….
Часть 4. Программирование управляемых форм…………………………………………………………
Клиент-серверная архитектура……………………………………………………………………….
Директивы компиляции………………………………………………………………………………….
Реквизиты и параметры формы……………………………………………………………………..
Глава 6. Объектные типы……………………………………………………………………………………………………………..
Часть 1. Объекты метаданных……………………………………………………………………………………….
Теоретическая часть………………………………………………………………………………………..
Объекты 1С………………………………………………………………………………………………………
Менеджер Объекта…………………………………………………………………………………………
Ссылка объекта……………………………………………………………………………………………….
Пустая ссылка…………………………………………………………………………………………………..
Ссылка как свойство объекта………………………………………………………………………….
Ссылка на перечисление…………………………………………………………………………………
Получить объект………………………………………………………………………………………………
События объектов……………………………………………………………………………………………
Метод ЭтоНовый…………………………………………………………………………………………….
Пометка на удаление………………………………………………………………………………………
Часть 2. Работа с документами……………………………………………………………………………………..
Проведение документов………………………………………………………………………………...
Оперативное и неоперативное проведение………………………………………………….
Нумерация документов…………………………………………………………………………………..
Проведен………………………………………………………………………………………………………….
Программное создание, запись и проведение документа……………………………
Найти документ……………………………………………………………………………………………….
Изменение имеющихся документов………………………………………………………………
Часть 3. Форма как объект…………………………………………………………………………………………….
Основной реквизит………………………………………………………………………………………….
Данные формы…………………………………………………………………………………………….....
Свойства, методы и события формы…………………………………………………………......
Свойства и события элементов формы…………………………………………………………..
Открытие формы……………………………………………………………………………………………..
Часть 4. Тип «Тип», функции «Тип» и «ТипЗнч»……………………………………………………………
Глава 7. Универсальные коллекции значений…………………………………………………............................

4

250
251
252
255
256
260
262
265
269
269
269
271
276
282
284
284
289
289
294
326
326
331
340
344
344
344
346
347
352
359
360
361
362
364
366
366
376
376
377
380
383
384
390
392
394
394
395
397
406
416
433
436

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

Часть 1. Массивы……………………………………………………………………………………………………………
Конструктор массивов…………………………………………………………………………………….
Обход массива………………………………………………………………………………………………..
Обход с помощью Для каждого… Цикл…………………………………………………………
Методы массивов…………………………………………………………………………………………..
Многомерные массивы………………………………………………………………………………….
Часть 2. Структура…………………………………………………………………………………………………………
Работа со структурой……………………………………………………………………………………..
Изменить значение ключа……………………………………………………………………………..
Количество элементов……………………………………………………………………………………
Обход коллекции…………………………………………………………………………………………….
Тип значений……………………………………………………………………………………………………
Безошибочное получение значения элемента………………………………………………
Очистка структуры и удаление элементов……………………………………………………..
Часть 3. Соответствие…………………………………………………………………………………………………….
Работа с соответствием…………………………………………………………………………………..
Метод «Вставить»……………………………………………………………………………………………
Обход……………………………………………………………………………………………………………….
Очистка соответствия………………………………………………………………………………………
Метод Получить……………………………………………………………………………………………….
Часть 4. Список Значений………………………………………………………………………………………………
Добавление элементов……………………………………………………………………………………
Элемент списка значений……………………………………………………………………………….
Обход коллекции…………………………………………………………………………………………….
Работа с элементом списка значений…………………………………………………………….
Сортировки………………………………………………………………………………………………………
Удаление элементов. Очистка………………………………………………………………………..
Глава 8. Таблицы………………………………………………………………………………………………………………………….
Часть 1. Таблицы значений……………………………………………………………………………………………
Колонки таблицы значений…………………………………………………………………………….
Строки таблицы значений……………………………………………………………………………….
Поиск по таблице значений…………………………………………………………………………….
Работа с таблицей значения……………………………………………………………………………
Работа с таблицей значения на форме…………………………………………………………..
Часть 2. Табличные части справочников и документов……………………………………………….
Работа с табличной частью……………………………………………………………………………..
Работа с табличной частью на управляемой форме………………………………………
Часть 3. Элемент формы «Таблица»……………………………………………………………………………..
Глава 9. Получение данных………………………………………………………………………………………………………….
Часть 1. Понятие выборки……………………………………………………………………………………………..
Выборка справочников……………………………………………………………………………………
Выборка документов………………………………………………………………………………………
Часть 2. Работа с запросами………………………………………………………………………………………….
Получение данных из запроса………………………………………………………………………..
Работа с секцией «ВЫБРАТЬ»………………………………………………………………………….
Условия запроса и передача параметров………………………………………………………
Упорядочивание……………………………………………………………………………………………..
Работа с полями………………………………………………………………………………………………
Объединение запросов…………………………………………………………………………………..
Соединение таблиц в запросе………………………………………………………………………..
Группировка данных……………………………………………………………………………………….
Остальные функции языка запросов 1С………………………………………………………….

5

436
437
438
440
441
446
449
449
451
452
452
452
454
456
457
457
457
459
459
460
462
465
469
471
472
477
480
482
482
483
489
494
497
505
518
519
523
526
535
535
535
548
553
553
559
562
568
570
572
577
587
590

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

Глава 10. Регистры сведений и накоплений……………………………………………………………………………….
Часть 1. Регистры сведений. Работа с записями…………………………………………………………..
Менеджер регистров………………………………………………………………………………………
Менеджер записи……………………………………………………………………………………………
Набор записей………………………………………………………………………………………………….
Часть 2. Регистры сведений. Получение данных………………………………………………………….
Выбрать……………………………………………………………………………………………………………
«Срез последних»……………………………………………………………………………………………
«Срез первых»…………………………………………………………………………………………………
Выборка, «срез последних» и «срез первых» в запросе……………………………….
Часть 3. Регистры накопления. Работа с записями……………………………………………………….
Менеджер регистра накопления…………………………………………………………………….
Набор записей………………………………………………………………………………………………….
Проведение документа…………………………………………………………………………………..
Часть 4. Регистры накопления. Получение данных………………………………………………………
Выбрать……………………………………………………………………………………………………………
Выбрать по регистратору………………………………………………………………………………..
Обороты…………………………………………………………………………………………………………..
Остатки…………………………………………………………………………………………………………….
Виртуальная таблица Остатки…………………………………………………………………………
Виртуальная таблица Обороты……………………………………………………………………….
Виртуальная таблица Остатки и обороты……………………………………………………….
Глава 11. Вывод информации………………………………………………………………………………………………………
Часть 1. Печатные формы………………………………………………………………………………………………
Макет……………………………………………………………………………………………………………….
Макет с несколькими областями……………………………………………………………………
Часть 2. Отчеты………………………………………………………………………………………………………………
Простые отчеты……………………………………………………………………………………………….
Отчеты на СКД………………………………………………………………………………………………….
Часть 3. Динамические списки………………………………………………………………………………………
Заключение…………………………………………………………………………………………………………………………………..

6

600
600
604
604
608
616
616
620
622
624
630
632
633
636
640
640
643
644
648
651
655
660
666
666
666
677
687
687
694
704
711

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

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

7

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

Введение
Дорогие друзья, я начал программировать в 1С в 2008 году, когда пришел в одну фирму
франчайзи 1С. После моего принятия на работу никто не занимался как-то моим обучением, благо
я уже перед этим умел программировать в Pascal и успел проработать 1,5 года в одном из
предприятий моего города. Поэтому какой-то базис у меня был. В той фирме не было какого-то
отдела по обучению учеников, или каких-то специально разработанных программ и методик. Шеф
просто дал мне одну методичку от фирмы 1С и одну толстенную книгу, где объяснялось всё, всё,
всё, вплоть до значения каждого мелкого свойства. И так я начал постигать программирование в
1С путем изучения этой литературы и методичек.
После я ушел из фирмы и начал работать на себя – фрилансить. Это был послекризисный
2009 год. Многое из программирования в 1С мне пришлось изучить самостоятельно по различным
разрозненным статьям в интернете. И в один момент я осознал, что в том обучении, которое я
прошел в 1С-франчайзи, не было никакой структуры, не было системы. Многих вещей я не знал в
принципе, когда там работал, - а должен был! Все эти знания я получил уже тогда, когда работал
на себя, методом проб и ошибок. Поэтому в один прекрасный момент у меня родилась идея
создать методичку, учебник, курс, который поможет начинающим как можно быстрее въехать в
профессию программиста 1С. И который собрал бы в себя все те знания, которые необходимы
именно начинающим разработчикам, тем, кто только хочет прикоснуться к этой профессии.
И прежде чем начать изучать материал этой книги, рекомендую Вам ознакомиться с
основными положениями, соблюдение которых поможет легче его усвоить.

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

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

8

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

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

9

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Часть 1. Установка платформы и создание пустой базы
Если Вы еще ни разу не имели дело с программой 1С, то Вам нужно скачать и установить
платформу 1С (в противном случае сразу переходите ко второй части этой главы, изучив только
создание пустой базы). Фирма 1С предоставляет возможность скачать бесплатную учебную
версию платформы по этой ссылке:
http://online.1c.ru/catalog/free/18610119/
Вам необходимо будет ввести свое ФИО и e-mail. Через какое-то время Вам на почту,
указанную при регистрации, придёт архив с дистрибутивом на установку платформы. Скачайте его
на жесткий диск Вашего компьютера и распакуйте.
Зайдите в распакованном архиве в папку platform_8_3_8_1933 (номер может отличаться) и
найдите среди множества файлов файл под названием Setup.
Вот он.

Рис. 1.1.1
Запускаем данный файл, дважды кликнув по нему левой клавишей мышки (у пользователя
Windows должны быть административные права). После запуска должно открыться окно
установки учебной версии платформы 1С.

10

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.1.2
Нажимаем кнопку «Далее».

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

11

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.1.4
На следующей закладке надо установить язык интерфейса. Я рекомендую его не менять и
оставлять тот, который по умолчанию. Это либо Русский, либо Системные установки. Мы ничего
менять не будем и нажмем кнопку «Далее».

Рис. 1.1.5
В этот раз нажимаем кнопку «Установить». Платформа начнет устанавливаться. Вам
необходимо дождаться окончания установки.

12

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.1.6
Все, платформа установлена. Нажимаем кнопку «Готово».

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

13

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.1.8
В следующих двух окнах выбираем пункты «Создание новой информационной базы» и
«Создание информационной базы без конфигурации…».

Рис. 1.1.9

Рис. 1.1.10

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

14

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.1.11

Рис. 1.1.12

В последнем окне ничего не меняем и нажимаем кнопку «Готово». База будет создана и
появится в списке.

Рис. 1.1.13

15

Рис. 1.1.14

Низамутдинов Ильяс

Глава 1. Вводная информация

Часть 2. Варианты хранения данных 1С: файловый вариант и клиентсервер. Обычное и управляемое приложение
Варианты хранения данных
Платформа 1С поддерживает два варианта хранения данных – это Файловый вариант
работы и Клиент-серверный вариант.
Файловый вариант предназначен для работы одного или нескольких пользователей в
рамках небольшой сети. В этом варианте работы все данные располагаются в одном файле, так
называемой файловой СУБД.

Рис. 1.2.1
Этот файл имеет расширение 1CD и название 1Cv8. Если название или расширение будет
другое, то платформа не найдет эту базу!
При подключении базы в стартере 1С необходимо указывать путь расположения файла
базы, как это было сделано выше (см. рис. 1.1.12). При выделении уже подключенной базы в окне
стартера 1С внизу будет путь к папке, в которой находится файл базы.

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

16

Низамутдинов Ильяс

Глава 1. Вводная информация

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

17

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.2.4. Схема работы SQL варианта
В этой книге мы будем рассматривать работу только файлового варианта.
Обычное и управляемое приложение
После выхода платформы 8.2. программа 1С может работать в двух режимах: в режиме
обычного приложения и в режиме управляемого приложения. Мы очень кратко разберем
особенности работы в них. Более подробно отличия этих приложений даются в первой части
книги «Основы разработки в 1С: Такси. Разработка в управляемом приложении за 12 шагов».
В обычном приложении интерфейс пользовательского режима «1С:Предприятия» имеет
следующий вид:

18

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.2.6
Из формы списка пользователь может открыть форму документа или справочника (см. рис.
1.2.7).

Рис. 1.2.7

19

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.2.8
А форма документа выглядит следующим образом:

Рис. 1.2.9
В этом труде будет дан минимум по работе с управляемым приложением, кто же
заинтересуется особенностями разработки управляемого приложения, может ознакомиться с
моей книгой «Основы разработки в 1С: Такси. Разработка в управляемом приложении за 12
шагов».
Все примеры в этой книге приведены под управляемым приложением и на управляемых
формах.

20

Низамутдинов Ильяс

Глава 1. Вводная информация

Часть 3. 1С: Предприятие и 1C:Конфигуратор
Система программ «1С: Предприятие» стоит на двух столпах. Это технологическая
платформа и прикладные решения.
Технологическая платформа - это, по сути, оболочка, в которой существуют прикладные
решения. Сами по себе прикладные решения существовать не могут. Но и платформа без
прикладного решения нужна только разработчикам. Конечным пользователям она ни к чему.
Прикладное решение - это автоматизация определенной области хозяйственного учета.
Например, такие конфигурации как «Бухгалтерия предприятия», «Управление торговлей» и
«Зарплата и управление персоналом» являются прикладными решениями, разработанными
фирмой 1С. Прикладные решения разрабатываются в основном фирмой 1С, но их могут создавать
и сторонние организации. Например, когда Вы научитесь программировать в 1С, то тоже сможете
разработать собственное прикладное решение на базе платформы 1С и продавать его. Иногда
прикладное решение еще называют конфигурацией. Конфигурация «1С: Бухгалтерия
предприятия», конфигурация «1С: Управление торговлей» и т.д.
Платформа 1С может работать в двух режимах: в режиме «1С:Предприятие» и в режиме
«1С:Конфигуратор». Режим «1С:Предприятие» предназначен непосредственно для работы
конечных пользователей. В дальнейшем в книге режим работы конечных пользователей я буду
называть или «1С:Предприятие», или пользовательский режим.
Начиная с платформы 8.2 режим «1С:Предприятие» может работать в трех видах
клиентских приложений - это «Толстый клиент», «Тонкий клиент» и «Веб-сервис». Работа тонкого
клиента и веб-клиента возможна только в управляемом приложении. В обычном приложении
возможна работа только под толстым клиентом. Под толстым клиентом можно работать как
в обычном, так и в управляемом приложении.
В платформах 8.0 и 8.1 была возможность работы только под толстым клиентом. Тогда
это был обычный и единственный вид клиентского приложения и так не назывался. Почему
появилась необходимость разделения обычного клиентского приложения на три вида – «тонкий»,
«толстый» и «веб-клиент»? Виной этому развитие технологий вообще и интернета в частности.
Очень часто стала появляться необходимость в работе с «1С:Предприятием» через сеть Internet, и
это стало накладывать определенные ограничения, поскольку пропускная способность сети
Internet гораздо уже, чем обычной локальной сети. Поэтому те технологии платформы, которые
существовали при редакциях 8.0 и 8.1, стали неприменимы в новых реалиях. Как следствие, была
разработана платформа 8.2, в которой приложение разделилось на три вида: толстый, тонкий и
веб-клиент.
Толстый клиент - это обычный клиент «1С:Предприятия». Под этим клиентом возможна
работа только в локальной сети Ethernet. Это отдельное приложение, которое устанавливается на
компьютер пользователя. Посредством этого приложения можно получить доступ к базам с
прикладными решениями, как на компьютере пользователя, так и к базам в локальной сети
Ethernet. Только под приложением для толстого клиента возможна разработка, т.е. есть доступ
в конфигуратор 1С!

21

Низамутдинов Ильяс

Глава 1. Вводная информация

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

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

22

Низамутдинов Ильяс

Глава 1. Вводная информация

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

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

23

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.3.5
Тогда у Вас откроется прикладное решение, в котором Вы сможете вносить и
обрабатывать данные, согласно алгоритмам, которые созданы разработчиками. Если у Вас еще

24

Низамутдинов Ильяс

Глава 1. Вводная информация

нет никаких метаданных (как в нашем случае), то просто откроется окно 1С:Предприятия (см. рис.
1.3.6):

Рис. 1.3.6

25

Низамутдинов Ильяс

Глава 1. Вводная информация

Часть 4. Язык программирования в 1С
Вся разработка в 1С осуществляется при помощи встроенного языка программирования в
1С. Посредством этого языка разрабатываются различные алгоритмы поведения программы
(расчеты, проведение документов и т.п.). В этой части мы рассмотрим базовые основы языка
программирования 1С.
Программный модуль
И начнем мы с программного модуля. Что такое программный модуль? Программный
модуль - это место, где непосредственно пишется исполняемый код.
В отличие от остальных языков, в 1С программный модуль не является самостоятельной
программой и функционирует только в рамках конфигурации 1С, т.к. он является частью этой
конфигурации, или это модуль внешней обработки или отчета (модуль формы внешней
обработки(отчета)), которые тоже не могут самостоятельно существовать, а работают только в
программе «1С:Предприятие».
Программный модуль – это среда, в которой пишется текст на встроенном языке
программирования 1С. Этот текст содержит процедуры и функции (их еще называют одним
словом Методы), описывающие те или иные алгоритмы работы программы, которые вызываются
системой в определенные моменты (например, при нажатии на кнопку).
Всего существует 11 видов программных модулей, но мы в этой книге затронем только некоторые
из них: модуль формы, модуль объекта и т.д. Этого будет вполне достаточно для изучения языка
программирования 1С.

Рис. 1.4.1. Модуль объекта (внешней обработки)

26

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.4.2. Модуль формы
Более подробно программные модули будем разбирать в четвертой главе.
Исходный текст программного модуля состоит из операторов и комментариев.

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

Рис. 1.4.3
Как Вы видите на рис. 1.4.3, пишутся две наклонные вправо черты, после них весь текст
будет зеленого цвета. Хорошим тоном программирования считается написание исчерпывающих
комментариев к каждому действию. Обращаю Ваше внимание, что после того как Вы стали писать
комментарий, на этой строке нельзя поставить какой-либо оператор, только на следующей строке.
Многострочных комментариев в 1С нет. Но есть способ закомментировать сразу несколько
строк. Для этого надо выделить текст и выбрать команду «Текст»-«Блок»-«Добавить
комментарий» (см. рис. 1.4.4 и 1.4.5):

27

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.4.4

Рис. 1.4.5
Операторы

Разберем основной столп языка программирования 1С. Это операторы.
Что такое оператор? Оператор - это наименьшая автономная часть языка программирования.
Любая программа представляет собой последовательность операторов. Операторы 1С можно
поделить на две группы: это Операторы объявления переменных и Исполняемые операторы.
Операторов объявления переменных два - это Оператор явного объявления переменных:
Перем А;
и Оператор неявного объявления - Оператор присваивания:
А = 1;
Оператор присваивания может не только объявлять переменную, но и присваивать
имеющейся переменной какое-нибудь значение.
Перем А;
А = 1;
В данном примере переменная уже объявлена, и затем ей присваивается значение.

28

Низамутдинов Ильяс

Глава 1. Вводная информация

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

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

Например, можно назвать переменные так:
Перем НашаПеремА,А1, п2, V3,weфв_3;
Но платформа выдаст ошибку, назови Вы переменные следующим образом:
Перем НашаПерем%,А#, п2?, V*3,weфв_3-4;

29

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.5.1
Окно справки состоит из трех закладок: «Содержание», «Индекс» и «Поиск».

Рис. 1.5.2

30

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.5.3
Другие закладки более универсальные.
К примеру, Вы забыли, как работает функция «Найти» по работе со строками. Вы можете
зайти на закладку «Индекс» и в окне поиска написать слово «Найти».

Рис. 1.5.4

31

Низамутдинов Ильяс

Глава 1. Вводная информация

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

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

Рис. 1.5.6

32

Низамутдинов Ильяс

Глава 1. Вводная информация

Закладка «Поиск» выводит все объекты, у которых есть метод «Найти».

Рис. 1.5.7
Не очень-то удобный способ поиска, поэтому я в основном предпочитаю поиск по индексу.

33

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.6.1
В правой части рабочего стола разработчика откроется палитра свойств конфигурации (см.
рис. 1.6.2).

34

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.6.3
Мы оставим у нашей конфигурации свойство «Управляемое приложение». Работа под
обычным приложением подробно рассматривается в моей книге «Программирование в 1С за 9
шагов».
Из остальных свойств конфигурации нас интересует свойство «Режим использования
модальности», в котором необходимо установить значение «Использовать» (см. рис. 1.6.4).

35

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.6.4
После того, как Вы измените что-либо в конфигурации, то в окне конфигурации рядом с
заголовком «Конфигурация» появится символ * (см. рис. 1.6.5).

Рис. 1.6.5
Это значит, что Ваша конфигурация отредактирована и её необходимо сохранить.
Сохранить конфигурацию можно нажав на кнопку «Сохранить» или комбинацией клавиш Ctrl+S
(см. рис. 1.6.6).

Рис. 1.6.6
После рядом с заголовком «Конфигурация» появится символ «!», это означает, что
изменения в конфигурацию внесены, но еще не попали в базу. Для того, чтобы все изменения
попали в базу и пользователь начал с ними работать, нужно нажать на кнопку «Обновить
конфигурацию базы данных» или клавишу F7 (см. рис. 1.6.7).

36

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.6.7
Только после этого все изменения будут внесены в базу данных и Вы сможете на них
посмотреть в пользовательском приложении.

37

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.7.1
Выбираем в имеющемся списке «Внешняя обработка» и нажимаем кнопку «ОК».

Рис. 1.7.2
Открылась вновь созданная внешняя обработка.

38

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.7.3
Назовите как-нибудь Вашу обработку. Я рекомендую Вам в дальнейшем давать имена им
по номеру главы, части и примера.

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

39

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.7.5
Нажмите правую кнопку мышки и выберите пункт «Добавить».

Рис. 1.7.6
В открывшемся окне ничего не меняйте и нажмите кнопку «Готово».

Рис. 1.7.7
Открылась Ваша вновь созданная форма.

40

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.7.8
Перейдем на закладку «Команды» в правом верхнем окне, и в подзакладке «Команды
формы» создадим новую команду, нажав на кнопку «Добавить». Команда будет создана, а справа
откроется палитра свойств этой команды (см. рис. 1.7.9).

Рис. 1.7.9
Назовем нашу команду «ПриветМир», для этого изменим свойство «Имя» (см. рис. 1.7.9).
А после поместим её на форму в виде кнопки. Делается это так: выделяем команду мышкой и
«тащим» ее в левое верхнее окно в закладку «Элементы» в командную панель формы (см. рис.
1.7.10 и 1.7.11).

41

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.7.10

Рис. 1.7.11
Нам осталось создать обработчик команды «ПриветМир». Для этого необходимо опять
зайти в палитру свойств команды (чтобы палитра открылась, необходимо кликнуть по команде
мышкой, палитра свойств откроется в правой части рабочего стола) и у свойства «Действие»
нажать на кнопку «Лупа» (см. рис. 1.7.12).

Рис. 1.7.12

42

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.7.13

Рис. 1.7.14
После этого в модуле формы будет создана процедура «ПриветМир» (см. рис. 1.7.15).

Рис. 1.7.15
Напишем в ней следующий код (см. листинг 1.7.1).

43

Низамутдинов Ильяс

Глава 1. Вводная информация

&НаКлиенте
Процедура ПриветМир(Команда)
Предупреждение("Привет, мир!!!");
КонецПроцедуры

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

Рис. 1.7.16
Вы увидите, что сразу выйдет окно «1С:Предприятия». В этом окне откройте Вашу только
что созданную обработку. Идем: «Главное меню» - «Файл» - «Открыть» (см. рис. 1.7.17),
находим файл внешней обработки в том месте, куда Вы ее сохранили. Открываем. Нажимаем
кнопку «Привет мир» (см. рис. 1.7.18) - и выйдет Ваше первое предупреждение (см. рис. 1.7.19).

Рис. 1.7.17

44

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.7.18

Рис. 1.7.19

45

Низамутдинов Ильяс

Глава 1. Вводная информация

Часть 8. Отладка
Очень часто бывает необходимо посмотреть, как работает тот или иной код в программе:
какие значения принимают те или иные переменные, как выполняется обход цикла, срабатывают
условия и тому подобное. Для этого существует отладка. Для того, чтобы программа остановилась
на нужном нам участке кода, достаточно поставить на этот участок точку останова.
Научимся работать с отладкой на примере той обработки, которую сделали в предыдущей
части («Привет, Мир»). Для этого переделаем код в команде «ПриветМир» формы обработки.
Присвоим переменным некоторые значения.
&НаКлиенте
Процедура ПриветМир(Команда)
А = 10;
B = "Текст";
Предупреждение("Привет, мир!!!");
КонецПроцедуры

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

Рис. 1.8.1. Начать отладку

Рис. 1.8.2. Продолжить отладку
Иногда бывают ситуации, когда нужно отладить уже запущенное приложение. В
конфигураторе можно посмотреть, подключены какие-либо сеансы к отладке или нет. Для этого
нужно воспользоваться окном «Предметы отладки». Открыть это окно можно через «Главное
меню» - «Отладка» - «Подключение».

46

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.8.3
Окно разделено на две части: в верхней части все доступные сеансы, а в нижней те сеансы,
которые уже подключены к отладке.

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

Рис. 1.8.5

47

Низамутдинов Ильяс

Глава 1. Вводная информация

В открывшемся окне установите в параметры Откладка в текущем сеансе и Откладка
при перезапуске значение Разрешена (протокол TCP/IP). А после нажмите кнопку «Применить».

Рис. 1.8.6
Если окно «Предметы отладки» уже открыто, то нажмите кнопку «Обновить» (см. рис.
1.8.7), чтобы подключенный сеанс появился в верхнем окне (см. рис. 1.8.8).

Рис. 1.8.7

Рис. 1.8.8
У нас они без пользователя, потому что мы его не завели, позже, когда научимся создавать
пользователей (в четвертой главе), колонка Пользователь будет заполнена. У нас две строки с

48

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.8.9
Можете спокойно работать с отладкой. Если же пользовательские сеансы не запущены, то
их можно запустить из конфигуратора, нажав на кнопку «Начать отладку».

Рис. 1.8.10
Итак, мы научились подключать отладку, теперь научимся с ней работать. Запустим сеанс
«1С:Предприятия», используя кнопку «Начать отладку». А после этого в конфигураторе откроем
модуль формы предыдущей обработки и установим точку останова в начале процедуры
«ПриветМир». Для этого нужно установить курсор на первую строку тела процедуры (где
начинается текст А = 10;, см. листинг 1.8.1) и нажать на кнопку панели «Точка останова» (см. рис.
1.8.11) или в меню «Главное меню» - «Отладка» - «Точка останова» (см. рис. 1.8.12).

Рис. 1.8.11

49

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.8.12
После этих действий на поле слева напротив нужной строки кода появится красный
кружок, это и есть точка останова.

Рис. 1.8.13
Учитывайте следующий момент: точку останова нужно устанавливать на строке, где
написан какой-то код. Если установите точку останова на пустой строке (или где
комментарий), то она не сработает.
Если сейчас мы перейдем в запущенное «1С:Предприятие», откроем обработку и нажмем
на кнопку «Привет, мир», то в конфигураторе, рядом с этой точкой останова появится стрелочка
(см. рис. 1.8.14). Это значит, что точка останова сработала и Вы можете начать отладку процедуры.
В это время работа «1С:Предприятия» остановится (как бы зависнет).

Рис. 1.8.14
Передвигаться по коду можно с помощью кнопок панели:

50

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.8.15
«Шагнуть через» (F10) – переходим на следующую строку кода. Если в текущей строке
метод, созданный разработчиком, то не заходим в этот метод.

Рис. 1.8.16
«Шагнуть из» (Shift + F11) – если нам не посчастливилось зайти в собственный метод, то
при помощи этой кнопки можно из него выйти.

Рис. 1.8.17
«Идти до курсора» (Shift + F10) – можно установить курсор на любой строке кода, и после
нажатия на эту кнопку отладка перейдет на неё.

Рис. 1.8.18
Заметьте, код выполнится только после того, как мы пройдем его! Т.е. если мы сейчас
на строке, где переменной А присваивается значение 10, то оно еще не присвоилось. Для
выполнения этого кода (присвоение значения), нужно перейти на следующую строку.

51

Низамутдинов Ильяс

Глава 1. Вводная информация

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

Рис. 1.8.19
Посмотреть значения той или иной переменной можно двумя способами. Первый используя окно «Вычислить выражение». Путь к этому окну: «Главное меню» - «Отладка» «Вычислить выражение».

Рис. 1.8.20
В открывшемся окне введите нужную переменную и нажмите на кнопку «Рассчитать».

52

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.8.21
Второй способ узнать значение нужной переменной - используя Табло. Оно открывается
по следующему пути: «Главное меню» - «Отладка» - «Табло».

Рис. 1.8.22
Табло откроется внизу конфигуратора, и Вы можете в него вводить любые переменные (в
колонку Выражение).

53

Низамутдинов Ильяс

Глава 1. Вводная информация

Рис. 1.8.23
И в табло, и в «Вычислить выражение» можно производить различные действия над
переменными.

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

54

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Глава 2. Примитивные типы и переменные
Часть 1. Примитивные типы
Сначала рассмотрим примитивные типы, используемые в языке программирования 1С.
Всего существует пять основных примитивных типов языка программирования 1С: число,
строка, дата, булево (истина-ложь), а также типы Неопределенно и NULL.
Примитивные типы
Число
Строка
Дата
Булево
Неопределено
NULL

Рис. 2.1.1
Для тех, кто изучал другие языки программирования: в языке программирования 1С не
надо явно задавать тип переменной. Достаточно просто указать для данной переменной какоенибудь значение (число, строку, булево значение), и она автоматически присвоит себе данный
тип. В то же время при создании реквизитов объектов конфигурации необходимо тип задать явно,
но об этом Вы узнаете в четвертой главе.
Итак, первый примитивный тип Число. Это могут быть любые числа: целые и дробные
числа, положительные и отрицательные.
Например: 23; 23.4; 233.33333. Можно использовать любые цифры, дробная часть
разделяется символом «.» (точка). По справочной информации, максимальная разрядность числа
38 знаков. Так как основные задачи в 1С не связаны с астрономическими расчетами и т.п., то этой
разрядности будет достаточно.
Над типом Число определены главные математические операции: сложение, вычитание,
умножение, деление. Вот как они выглядят:

Рис. 2.1.2

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

55

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Второй примитивный тип - это тип Строка. Строка - это любой набор символов
заключенный в кавычки:

. Строки могут быть однострочные и многострочные (текст).

Однострочная строка будет выглядеть так:

Рис. 2.1.3
А многострочная строка задается следующим образом:

Рис. 2.1.4
Т.е. каждая из строк не заканчивается кавычкой, а каждая последующая начинается с
символа «|» (вертикальная черта).
Для строк есть операция сложения, выполняемая оператором «Плюс» (+). Это значит, что
при сложении строки «Мама мыла » и строки «раму» получится строка "Мама мыла раму":
"Мама мыла" + "раму" = "Мама мыла раму".
Пустая строка задаётся следующим образом: "" (две сдвоенных кавычки без пробела).
Подробнее об операциях со строками Вы узнаете в части 5 этой главы.
Третий примитивный тип – это тип Дата. Значения данного типа содержат дату
григорианского календаря с 1 января 1 года нашей эры. Так что если кто-то изобретет машину
времени, то сможет на языке 1С написать программу для ведения бухгалтерии Понтия Пилата.
Дата в языке программирования 1С задается в виде строки цифр в следующем формате
'ГГГГММДДччммсс',
где:
ГГГГ – четыре цифры года включая тысячелетие и век, например, 2013 или 1997;
ММ - две цифры месяца, например, 02 – это февраль, а 12 – декабрь;
ДД - две цифры даты, например, 01 – первое число, или 23 – двадцать третье число;
чч - две цифры часов в 24-часовом формате, к примеру: 01 – час ночи, 13 – час дня;
мм – две цифры минут, к примеру: 30 – 30 минут, 01 – 1 минута;
сс – две цифры секунд, 20 - это 20 секунд, и так далее.
Также дату можно задавать в таком виде: 'ГГГГММДД'. При данном формате часы, минуты
и секунды будут равны нулю.

56

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Пустая дата задается следующим образом: '00000000000000' .
Таким образом, если Вы родились 20 января 1989 г., то задать данную дату на языке
программирования 1С можно двумя способами:
'19890120' или '19890120000000'. А если Вы хотите просто задать время 1 час 30 минут, то будет
следующий вид: '00010101013000'. Подробно об операциях с датами Вы узнаете в части 6 этой
главы.
Четвертый примитивный тип - это тип Булево. Булево - это логический тип, у которого
всего два значения - Истина и Ложь.

Рис. 2.1.5
На данном этапе обучения этого достаточно. Более подробно об операциях с данным
типом Вы узнаете в соответствующей части настоящей главы.
Ну и напоследок осталось два типа - это NULL и Неопределено.
Тип NULL – значения данного типа используются исключительно для определения
отсутствующих значений при работе с запросами. С языком запросов мы научимся работать в
девятой главе.
Тип Неопределено применяется, когда надо использовать пустое значение, не
принадлежащее ни к одному другому типу. Данный тип так и задается.
А = Неопределено;

Итак, мы разобрали примитивные типы языка программирования 1С.

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

57

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

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

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

58

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Часть 2. Примитивные операции вывода информации
В этой части Вы узнаете о самых простых способах вывода информации в программе 1С.
Процедура «Сообщить»
Первый пример, который мы рассмотрим, будет хрестоматийным, с него начинают
изучение почти все языки программирования. Это вывод сообщения «Привет, Мир!». Сейчас
текст «Привет, Мир!» мы выведем в окно сообщений программы 1С. И сделаем мы это с
помощью оператора Сообщить.
Создайте обработку, форму, команду формы «ВывестиСообщение», разместите команду
на форме, и создайте обработчик этой команды на клиенте (подробно об этом см. глава 1, часть 7,
стр. 38), напишите в обработчике команды следующий код:
&НаКлиенте
Процедура ВывестиСообщение(Команда)
Сообщить("Привет, мир!");
КонецПроцедуры

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

Рис. 2.2.1
Таким образом мы видим, что процедура Сообщить - это встроенная процедура
Конфигуратора 1С, которая выводит текстовую информацию в окно сообщений.

59

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Процедура «Предупреждение»
Еще один интересный оператор вывода информации - это процедура Предупреждение.
Данная процедура выводит на экран окно предупреждения с нужным Вам текстом.
Обращаю Ваше внимание, что данная процедура работает только тогда, когда в
свойство конфигурации «Режим использования модальности» установлено значение
«Использовать» (см. глава 1, часть 6, стр. 34). Иначе нужно использовать процедуру
«ПоказатьПредупреждение». На данном этапе обучения Вам не стоит особо обращать
внимание на этот режим. Более подробно о работе с выключенным режимом использования
модальности рассказывается в моей книге «Основы разработки в 1С: Такси».
Создайте новую команду формы «ВывестиПредупреждение», разместите её на форме,
создайте обработчик команды и внутри обработчика команды «ВывестиСообщение» напишите
следующий код:
&НаКлиенте
Процедура ВывестиПредупреждение(Команда)
Предупреждение("Привет, мир!");
КонецПроцедуры

Листинг 2.2.2
Теперь перейдите в «1С:Предприятие», запустите обработку и нажмите кнопку «Вывести
предупреждение».

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

60

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Это таймаут и заголовок окна. Таймаут задает время в секундах, в течение которого окно
будет открыто, а заголовок - это непосредственно заголовок данного окна. По умолчанию таймаут
равен 0, это означает, что время не ограничено.
Измените обработку.
&НаКлиенте
Процедура ВывестиПредупреждение(Команда)
Предупреждение("Привет, мир!",5,"Наш заголовок");
КонецПроцедуры

Листинг 2.2.3
Запустите ее заново и посмотрите, что получилось:

Рис. 2.2.3
Окно откроется, и через несколько секунд закроется.
А можно написать и так:
&НаКлиенте
Процедура ВывестиПредупреждение(Команда)
Предупреждение("Привет, мир!",,"Наш заголовок");
КонецПроцедуры

Листинг 2.2.4
Обращаю Ваше внимание, что пока пользователь не нажмет кнопку «ОК», дальнейшее
выполнение кода программы не происходит. Для того чтобы это увидеть, напишите процедуру
«Сообщить» после процедуры «Предупреждение»:
&НаКлиенте
Процедура ВывестиПредупреждение(Команда)
Предупреждение("Привет, мир!",5,"Наш заголовок");
Сообщить("Привет, мир!");
КонецПроцедуры

Листинг 2.2.5

61

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

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

62

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Часть 3. Переменные типа Булево
Перед тем, как мы начнем изучать числа, строки и даты более подробно, нам нужно будет
освоить одну маленькую, но очень важную тему. Это переменные типа Булево. Создайте новую
обработку, форму, команду формы и т.д.
Булево - это признак истинности или ложности какого-нибудь утверждения.
Например, утверждение «5 меньше 7» истинно.
А утверждение, что 5 = 7 ложно.
Как же присваиваются значения переменным типа булево? Делается это очень просто.
Первый способ:
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
А = Ложь;
Б = Истина;
Сообщить(А);
Сообщить(Б);
КонецПроцедуры

Листинг 2.3.1
Посмотрите, как выводится все это в окно сообщений.

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

63

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

&НаКлиенте
Процедура ВыполнитьКоманду2(Команда)
А = 5 > 7;
Б = 5 < 7;
Сообщить(А);
Сообщить(Б);
КонецПроцедуры

Листинг 2.3.2
Смотрим, что выйдет в окно сообщений.

Рис. 2.3.2
Ответьте, почему вышли такие сообщения?

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

Понять функционирование данной операции Вам поможет следующая таблица:
А

Б

Истина

Ложь

Ложь

Истина
Табл. 2.3.1

64

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

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

Понять функционирование данной операции Вам поможет следующая таблица:
С=АИБ

А

Б

Истина

Истина

Истина

Ложь

Ложь

Истина

Ложь

Истина

Ложь

Ложь

Ложь

Ложь

Табл. 2.3.2
Третья операция – ИЛИ, дизъюнкция. Операция ИЛИ возвращает истину тогда, когда хотя
бы одно значение истинно.

Понять функционирование данной операции Вам поможет следующая таблица:
С = А ИЛИ Б

А

Б

Истина

Истина

Истина

Истина

Ложь

Истина

Истина

Истина

Ложь

Ложь

Ложь

Ложь

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

65

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
А = Ложь;
Б = Истина;
С = Не А;
Сообщить(С);
С = А И Б;
Сообщить(С);
С = А Или Б;
Сообщить(С);
КонецПроцедуры

Листинг 2.3.3
Смотрим, что получилось.

Рис. 2.3.3
Теперь самостоятельно выполните все операции из таблиц и проверьте, правда ли там
написана.
А можно ли выполнять данные операции подряд?
Да, можно, данные операции будут выполняться слева направо. И иметь следующий уровень
старшинства:
Первый: в первую очередь выполняются операции в скобках
Второй: Операция НЕ
Третий: Операция И
Четвертый: Операция ИЛИ.
Чтобы не путаться в операциях, я советую Вам использовать скобки где только возможно.
Рассмотрим пример.
&НаКлиенте
Процедура ВыполнитьКоманду2(Команда)
А = Ложь;
Б = Истина;

66

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

С = Ложь;
Д = А и С или Б;
Сообщить(Д);
КонецПроцедуры

Листинг 2.3.4
В данном случае сначала будет работать операция И между А и С.
Смотрим таблицу А – Ложь, С – Ложь, результат А И С будет Ложь.
Следующим шагом будет выполнение операции ИЛИ между Ложью (Результат
предыдущей операции) и значением Б, которое Истина.
Результат будет Истина.

Рис. 2.3.4.
А если нам надо, чтобы прошла сначала операция ИЛИ между С и Б, а потом только
операция И между А и тем, что получилось, то для этого необходимо использовать скобки.
Смотрим:
&НаКлиенте
Процедура ВыполнитьКоманду2(Команда)
А = Ложь;
Б = Истина;
С = Ложь;
Д = А и (С или Б);
Сообщить(Д);
КонецПроцедуры

Листинг 2.3.5
Результат диаметрально противоположный. Почему?

67

Низамутдинов Ильяс

Глава 2. Примитивные типы и переменные

Сейчас разберем. Благодаря скобкам сначала выполняется операция и между С и Б,
т.к. С - Ложь, а Б – Истина, результат будет Истина (см табл. 1.3.3). Потом между значением А
(которое Ложь) и значением Истина (результатом предыдущей операции) выполняется
операция И. Результат будет Ложь (см табл. 1.3.2).

Рис. 2.3.5
Рассмотрим еще один пример со скобками и операцией НЕ
&НаКлиенте
Процедура ВыполнитьКоманду3(Команда)
А = Ложь;
Б = Истина;
Д = Не А Или Б;
Сообщить(Д);
Д = Не (А Или Б);
Сообщить(Д)
КонецПроцедуры

Листинг 2.3.6
Посмотрите, какой будет результат, и попробуйте сами его объяснить, используя
вышеприведенные таблицы (табл. 1.3.1 – 1.3.3).

Операторы сравнения
Теперь мы рассмотрим более подробно операции сравнения. Это:

Больше: >
Меньше: <
Больше или равно: >=
Меньше или равно: 5;
Сообщить("5 > 5 это - ");
Сообщить(Д);
Д = 5 >= 7;
Сообщить("5 >= 7 это - ");
Сообщить(Д);
Д = 6 < 8;
Сообщить("6 < 8 это - ");
Сообщить(Д);
Д = 7 5) И (5 >= 7);
Сообщить(Д);
Д = (6 < 8) Или (7 0 тогда
Сообщить("Число " + Число1);
Сообщить("Больше нуля");
КонецЕсли;
КонецПроцедуры

Листинг 3.1.1

120

Низамутдинов Ильяс

Глава 3. Основные операторы

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

Рис. 3.1.1
Это самый примитивный вариант использования данного оператора.
Условие для данного оператора может быть каким угодно, главное, чтобы возвращалось
значение типа Булево.
Например, может быть такой вариант:
Если Число1 > 1 и Число1 < 10 тогда….
Или такой вариант:
Условие = Число1 > 1 и Число1 < 10;
Если Условие тогда…
И так далее, более подробно про работу с булевыми операторами смотрите главу 2, часть
3 (см. стр. 63).
Продолжаем изучать дальше конструкцию «Если…». Что если нам надо выполнить какиенибудь операции, когда выполняется наше условие, и другие операции, когда оно не
выполняется? Для этого нам помогает оператор условия Иначе.

121

Низамутдинов Ильяс

Глава 3. Основные операторы

Рассмотрим схему:
Если тогда
[Операция1];
………..
[ОперацияN];
Иначе
[Операция_2];
……….
[Операция_N]
КонецЕсли;
В данном случае выполнение программы после оператора Иначе будет, когда Условие
примет значение Ложь.
Доработайте Ваш пример:
&НаКлиенте
Процедура ВыполнениеКоманды2(Команда)
Перем Число1;
ВвестиЧисло(Число1,"ВведитеЧисло");
Если Число1 > 0 тогда
Сообщить("Число " + Число1);
Сообщить("Больше нуля");
иначе
Сообщить("Число " + Число1);
Сообщить("Равно нулю или меньше нуля");
КонецЕсли;
КонецПроцедуры

Листинг 3.1.2
В вышеприведенном коде мы вводим некоторое число в программу, после, как в
предыдущем примере, пишем условие, что если это число больше нуля, то выводим
соответствующее сообщение. Но также пишем оператор Иначе, после которого сообщаем, что
число меньше или равно нулю. Запустите данную обработку и посмотрите, как она работает.
Опять усложним текущий пример. Что если нам необходимо вывести сообщение, когда
число равно нулю, или, к примеру, равно 10?
Для этого мы используем условную конструкцию ИначеЕсли …Тогда.

122

Низамутдинов Ильяс

Глава 3. Основные операторы

Рассмотрим схему:
Если тогда
[Операция1];
………..
[ОперацияN];
ИначеЕсли тогда
[Операция_2];
………..
[Операция_2N];
ИначеЕсли тогда
[Операция_2];
………..
[Операция_2N];
.
Иначе
[Операция_N];
……….
[Операция_NN]
КонецЕсли;
Операторов ИначеЕсли…Тогда внутри условия может быть бесконечное множество,
оператор Иначе всегда должен быть один и идти после всех операторов ИначеЕсли…Тогда.
Теперь усложните Ваш пример:
&НаКлиенте
Процедура ВыполнениеКоманды3(Команда)
Перем Число1;
ВвестиЧисло(Число1,"ВведитеЧисло");
Если Число1 >= 1 тогда
Сообщить("Число " + Число1);
Сообщить("Больше или равно единицы");
ИначеЕсли Число1 >0 и Число1 < 1 тогда
Сообщить("Число " + Число1);
Сообщить("Меньше 1, но больше 0");
ИначеЕсли Число1 = 0 тогда

123

Низамутдинов Ильяс

Глава 3. Основные операторы

Сообщить("Число " + Число1);
Сообщить("Равно нулю");
иначе
Сообщить("Число " + Число1);
Сообщить("Меньше нуля");
КонецЕсли;
КонецПроцедуры

Листинг 3.1.3
В данном примере мы проверяем, больше или равно единицы введенное нами число,
если да, то сообщаем об этом. Потом проверяем, входит ли оно в интервал от 0 до 1, если да, то
сообщаем. Следующим шагом проверяем, равно ли оно нулю, если да, то сообщаем. И если число
не удовлетворяет всем вышеприведенным условиям, т.е. число меньше нуля, выводим
сообщение об этом.

Рис. 3.1.2
Обращаю Ваше внимание, что условия ИначеЕсли будут выполняться только в том случае,
когда не выполнились все предыдущие условия. Подправьте для примера Ваш код:
Перем Число1;
ВвестиЧисло(Число1,"ВведитеЧисло");
Если Число1 > 0 тогда
Сообщить("Число " + Число1);
Сообщить("Больше или равно единицы");
ИначеЕсли Число1 >0 и Число1 < 1 тогда
Сообщить("Число " + Число1);
Сообщить("Меньше 1, но больше 0");
ИначеЕсли Число1 = 0 тогда
Сообщить("Число " + Число1);
Сообщить("Равно нулю");
иначе
Сообщить("Число " + Число1);
Сообщить("Меньше нуля");
КонецЕсли;

Листинг 3.1.4

124

Низамутдинов Ильяс

Глава 3. Основные операторы

Если мы изменим первое условие, что Число1 больше 0, то программа никогда не зайдет
во второе условие. Так как, к примеру, число 0.6 больше нуля, и выполнится код под этим
условием, после чего происходит выход из оператора.
Обратите внимание на один момент, если в Условии идет сразу переменная типа булево,
то не надо писать так:
Если НашеУсловие = Истина тогда…

Если НашеУсловие = Ложь тогда…
Достаточно просто написать условие, например:
Если НашеУсловие тогда…
Или
Если Не НашеУсловие тогда….
Теперь переделайте предыдущий пример. Создайте переменную типа булево с нужным
условием и подставляйте ее в конструкцию Если…Тогда.
Закончим разбирать данный оператор. Попробуйте сами усложнить последний пример
(листинг 3.1.4), добавив различные дополнительные сравнения.
Теперь изучим похожий оператор, но несколько упрощенный – Вычислить выражение по
условию. Он имеет следующий синтаксис:
?(,,)
Где:
«Условие» – это логическое выражение, в зависимости от результата которого будет возвращено
либо Выражение1, либо Выражение2;
«Выражение1» – возвращается, если логическое выражение Истина;
«Выражение2» – возвращается, если логическое выражение Ложь;
Рассмотрим пример. Вводим некоторое число, и надо вывести сообщение, больше оно
нуля или меньше.
&НаКлиенте
Процедура ВыполнениеКоманды4(Команда)
Перем Число1;
ВвестиЧисло(Число1,"Введите число");

0");

Сообщение = ?(Число1 > 0,"Число " + Строка(Число1) + " больше 0",
"Число " + Строка(Число1) + " меньше или равно

125

Низамутдинов Ильяс

Глава 3. Основные операторы

Сообщить(Сообщение);
КонецПроцедуры

Листинг 3.1.5
В изучаемом примере первый параметр оператора «?» это наше условие: Число1 >0,
второй параметр – строка с текстом, что наше число больше нуля, оно будет возвращаться, если
первый параметр будет Истина. И третий параметр – строка с текстом, что наше число ноль или
меньше нуля, оно будет возвращаться, если первый параметр будет Ложь.
Посмотрите, как она работает.
Сделайте еще один пример: пользователь вводит некоторое число, нужно извлечь из него
корень, для этого оно всегда должно быть положительным.
&НаКлиенте
Процедура ВыполнениеКоманды5(Команда)
Перем Число1;
ВвестиЧисло(Число1,"Введите число");
ЧислоДляКорня = ?(Число1 < 0, Число1*(-1),Число1);
Корень = Окр(Sqrt(ЧислоДляКорня),5);
Сообщить("Корень из модуля числа " + Строка(Число1) + " равен " +
Строка(Корень));
КонецПроцедуры

Листинг 3.1.6
Разберите данный пример самостоятельно.
Резюме
В этой части Вы изучили один из основных операторов языка программирования 1С. Если
Вам не понятно его действие, то смотрите, как работает программа в отладке. Вы должны хорошо
владеть данным оператором, чтобы перейти к дальнейшему изучению языка программирования
1С.

126

Низамутдинов Ильяс

Глава 3. Основные операторы

Часть 2. Цикл: Для…Цикл
Итак, начнем изучать циклы. Что такое вообще Цикл? Цикл – действие, выполняемое
определенное количество раз. Под действием понимается один или несколько операторов.

Рис. 3.2.1
Изучите рисунок 3.2.1, он как раз применим к осваиваемой теме. Пока идет перечисление
какого-нибудь параметра от одного значения до другого, то выполняются определенные
действия. Как только параметр достигает максимального значения, мы выходим из цикла и
продолжаем выполнение программы.
Первый цикл который мы изучим, будет цикл Для…Цикл.
Данный оператор имеет следующий синтаксис (пока мы его рассмотрим в самом общем виде,
а углублять будем по мере изучения):
Для ИмяПеременной = Выражение1 по Выражение2 цикл
//операторы
КонецЦикла.
Где:
«ИмяПеременной» – это переменная счетчик цикла, его значение увеличивается на единицу
при каждом повторении цикла;
«Выражение1» – числовое выражение, оно задает начальное значение, которое
присваивается счетчику цикла при первом обходе. Может быть любое целое число;
«Выражение2» – максимальное значение счетчика цикла. Когда переменная ИмяПеременной
становится больше Выражение2, программа выходит из цикла, т.е. операторы внутри конструкции
Для …Цикл больше не выполняются. Может быть любое целое число;
«Цикл» – ключевое слово, которое открывает тело цикла;
«КонецЦикла» – ключевое слово, которое закрывает тело цикла;

127

Низамутдинов Ильяс

Глава 3. Основные операторы

Итерация – каждый обход цикла.
Все, что находится между ключевыми словами Цикл и КонецЦикла, будет выполняться, пока
ИмяПеременной находится в интервале от Выражение1 до Выражение2.
Обращаю внимание, что Выражение1 всегда должно быть меньше или равно Выражение2.
Создайте самостоятельно обработку, форму, и в обработчике команды формы напишите
следующий код:
&НаКлиенте
Процедура ВыполнитьКоманду1(Команда)
Для

н = 1 по 10 цикл;
Сообщить("н = " + н);
КонецЦикла;
КонецПроцедуры

Листинг 3.2.1
В данном примере мы создали цикл Для…Цикл, где счетчик цикла называется «н», и
начальное его значение равно 1, а конечное его значение равно 10.
И при каждом обходе цикла, выводим сообщение о том, чему равно «н».
Сохраните обработку, запустите и посмотрите, что у Вас выйдет в окно сообщений.
Циклы можно вкладывать друг в друга. Сделайте следующий пример:
&НаКлиенте
Процедура ВыполнитьКоманду2(Команда)
Для н = 1 по 5 цикл
Для к = 1 по 3 Цикл
Сообщить("н.к = " + н + "." + к );
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Листинг 3.2.2
Как работает такой цикл? Сначала выполняется внешний цикл, т.е. переменной «н»
присваивается значение 1, потом полностью выполняется внутренний цикл, т.е. значение «к»
проходит от 1 до 7, после этогоуправление передается опять на внешний цикл.
Сохраните обработку и посмотрите, что получится.

128

Низамутдинов Ильяс

Глава 3. Основные операторы

Рис. 3.2.2
Если Вам трудно понять очередность внешнего и внутреннего цикла, поставьте
самостоятельно сообщения перед внутренним циклом, и после него, тогда все встанет на свои
места.
Значения Выражение1 и Выражение2 могут задаваться пользователем в виде переменных.
Сделайте следующий пример:
&НаКлиенте
Процедура ВыполнитьКоманду3(Команда)
Перем Выражение1, Выражение2;
ВвестиЧисло(Выражение1,"Введите выражение1",2,0);
ВвестиЧисло(Выражение2,"Введите выражение2 (больше выражение1)",2,0);
Если Выражение1 > Выражение2 тогда
Предупреждение("Выражение1 должно быть больше выражение2");
иначе
Для н = Выражение1 по Выражение2 цикл
Сообщить(" н = " + н);
КонецЦикла;
КонецЕсли;
КонецПроцедуры

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

129

Низамутдинов Ильяс

Глава 3. Основные операторы

С данным оператором конструкция цикла будет иметь следующий вид:
Для ИмяПеременной = Выражение1 по Выражение2 цикл
//операторы
Прервать.
//операторы
КонецЦикла.
Сделайте пример, который нам объяснит использование данного оператора.
&НаКлиенте
Процедура ВыполнитьКоманду4(Команда)
Для н = 1 по 10 цикл
к = 1/н;
Сообщить("к = " + Окр(к,3));
Прервать;
КонецЦикла;
КонецПроцедуры

Листинг 3.2.4
Сохраните обработку и посмотрите, как она работает. Должен быть следующий результат:

Рис. 3.2.3
Как видно из результата выполнения данной обработки, произошел только первый шаг,
дальше цикл не стал продолжаться. Как правило, данный оператор ставят внутри определенного
условия.
Смотрим еще один пример:
&НаКлиенте
Процедура ВыполнитьКоманду5(Команда)
Для н = - 10 по 10 цикл
Если н = 0 тогда
Прервать;
КонецЕсли;
к = 1/н;
Сообщить("к = " + Окр(к,3));
КонецЦикла;
КонецПроцедуры

Листинг 3.2.5

130

Низамутдинов Ильяс

Глава 3. Основные операторы

В этом примере наш цикл следует от -10 до 10, в том случае, когда счетчик цикла равняется
нулю, мы выходим из цикла, чтобы не сгенерировалась исключительная ситуация.
Напоследок, мы разберем оператор Продолжить. Еще углубим схему конструкции.
Для ИмяПеременной = Выражение1 по Выражение2 цикл
//операторы
Продолжить;
//операторы
Прервать.
//операторы
КонецЦикла.
Оператор Продолжить передает управление в начало цикла, после этого происходит
вычисление и проверка условий выполнения цикла. Все, что следует за данным оператором, на
этой итерации цикла выполняться не будет.
Операторы Прервать и Продолжить применимы во всех циклах платформы 1С!
Сделайте следующий пример, и посмотрите результат его работы:
&НаКлиенте
Процедура ВыполнитьКоманду6(Команда)
Для н = 1 по 10 цикл
к = 1/н;
р = 1/(Pow(н,2));
Сообщить("1/н
= " + Окр(к,3));
КонецЦикла;
КонецПроцедуры

Листинг 3.2.6
А теперь подправьте наш пример:
&НаКлиенте
Процедура ВыполнитьКоманду6(Команда)
Для н = 1 по 10 цикл
к = 1/н;
р = 1/(Pow(н,2));
Сообщить("1/н
= " + Окр(к,3));
Продолжить;
Сообщить("--------------------");
Сообщить("1/н^2 = " + Окр(р,3));
КонецЦикла;
КонецПроцедуры

Листинг 3.2.7

131

Низамутдинов Ильяс

Глава 3. Основные операторы

Выполните обработку. Как видите, сообщение о делении единицы на «н» в квадрате не
выходит, потому что оператор Продолжить передал управление в начало цикла.
Также оператор Продолжить можно выполнять внутри условия.
Сделайте следующий пример:
&НаКлиенте
Процедура ВыполнитьКоманду7(Команда)
Для н = - 10 по 10 цикл
Если н = 0 тогда
Продолжить;;
КонецЕсли;
к = 1/н;
Сообщить("1/н = " + Окр(к,3));
КонецЦикла;
КонецПроцедуры

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

132

Низамутдинов Ильяс

Глава 3. Основные операторы

Часть 3. Цикл: Пока…Цикл. Рекурсия переменных
Рассмотрим еще один цикл, это цикл с условием. Принцип его работы мы разберем на
следующей схеме:

Рис. 3.3.1
Посмотрите на данную схему: перед телом цикла задается какое-нибудь условие, пока
данное условие истинно, выполняется тело цикла, в противном случае программа выходит из
цикла. Рассмотрим синтаксис данного оператора в программе 1С.
Пока Цикл
//операторы
Продолжить;
//операторы
Прервать;
КонецЦикла;
Разберем данный оператор. Ключевое слово Пока задает некоторое условие, оно должно
иметь тип булево, после данного условия следует ключевое слово Цикл, открывающее тело цикла,
а закрывает тело цикла ключевое слово КонецЦикла.
Операторы Продолжить и Прервать обладают теми же функциями, как и в предыдущем
цикле Для…Цикл. Это переход в начало цикла и выход из цикла соответственно.
Перед тем, как рассматривать примеры цикла Пока...Цикл, мы изучим Рекурсию
переменных.

133

Низамутдинов Ильяс

Глава 3. Основные операторы

Рекурсия – определение нового значения параметров при помощи старого значения,
используя единый идентификатор.
Посмотрим, как это выглядит.
и = 0;
и = и + 1;
В этом случае переменная «и» увеличивает сама себя на 1.
Сделаем самый элементарный пример, и на нем же изучим рекурсию и цикл Пока…Цикл.
Пример таков: нам необходимо вывести ряд чисел от 0 до 100 с шагом 5 (0,5,10,15 и т.д.).
Циклом Для…Цикл, который мы изучали в предыдущей части, сделать этот пример можно:
нужно при помощи оператора % определять, кратен ли текущий счетчик цикла 5 или нет, и исходя
из этого выводить сообщение. Но гораздо проще и понятнее будет сделать данную задачу,
используя цикл Пока...Цикл.
Создайте самостоятельно обработку, форму и в обработчике команды формы напишем
следующий код:
&НаКлиенте
Процедура ВыполнитьКоманду1(Команда)
н = 0;
Шаг = 5;
Пока н 0 тогда
НачалоФакториала = 1;
Итерация = 0;
Пока Итерация < н цикл
Итерация = Итерация + 1;
НачалоФакториала = НачалоФакториала*Итерация;
КонецЦикла;
Сообщить(Строка(н) + "! = " +
Строка(НачалоФакториала));
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Листинг 3.3.2
Разберем его. Получаем интерактивно некоторое целое число, проверяем, ввели мы его
или нет, записываем введенное число в переменную «н».
Если число ввели, и если оно больше нуля, задаем переменную НачалоФакториала,
которая равна единице и которая будет рекурсивно увеличиваться, и переменную Итерация.
Определяем наш цикл, он будет работать пока переменная Итерация меньше
переменной «н». Т.е. если мы «н» задали равным 5, то цикл будет выполняться при следующих
значениях переменной Итерация : 0,1,2,3,4.
Сразу же в начале тела цикла увеличиваем переменную Итерация на 1.
И последний шаг: внутри цикла рекурсивно вызываем переменную Факториал, умножая
ее на переменную Итерация.
Т.е. в первом шаге цикла: НачалоФакториала = 1 * 1.
Во втором шаге цикла: НачалоФакториала = 1 * 2.
В третьем шаге цикла: НачалоФакториала = 2 * 3.
И так далее.
В конце выводим сообщение.
Разберите данный пример, если он Вам не понятен. Разберите его в отладке, посмотрите,
как изменяются переменные.
Самостоятельно измените пример так, чтобы Итерация начиналась с 1, поменяйте
условие цикла или место рекурсии переменной Итерация, чтобы пример работал правильно.

135

Низамутдинов Ильяс

Глава 3. Основные операторы

Сделайте еще один пример на цикл Пока…Цикл.
Мы имеем две даты, вторая дата старше первой, надо вывести все даты в промежутке
между ними.
&НаКлиенте
Процедура ВыводДат(Команда)
Перем ДатаНач, ДатаКон;
ДатаНачВведена = ВвестиДату(ДатаНач,"Введите начальную дату",
ЧастиДаты.Дата);
ДатаКонВведена = ВвестиДату(ДатаКон,"Введите конечную дату",
ЧастиДаты.Дата);
Если ДатаНачВведена и ДатаКонВведена тогда
Если ДатаНач < ДатаКон тогда
Пока ДатаНач = 0 тогда
КореньА = Sqrt(А);
Сообщить("Корень из числа А = " + Окр(КореньА,5));
иначе
СообщениеОНеправильномЧисле();
КонецЕсли;
КонецЕсли;
Если ВвестиЧисло(Б,"Введите число Б") тогда
Если Б >= 0 тогда
КореньБ = Sqrt(Б);
Сообщить("Корень из числа Б = " + Окр(КореньБ,5));
иначе
СообщениеОНеправильномЧисле();
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Листинг 3.4.2

139

Низамутдинов Ильяс

Глава 3. Основные операторы

Разберем данный пример.
Мы вводим некоторое первое число А, проверяем на то, что оно введено. Я сразу написал
функцию ВвестиЧисло как параметр оператора Если, чтобы оптимизировать код программы.
Потом мы проверяем больше или равно нуля наше число, если да - то вычисляем корень, если нет
- пишем вновь созданную процедуру, которая выводит целый ряд сообщений. Точно такие же
действия проделываем с числом Б.
Запустите обработку и посмотрите, как работает данный код.
Сейчас пытливый читатель спросит: ведь эти два отрезка кода, когда вводим первое число
и вычисляем корень, а потом второе число и вычисляем корень, очень похожи. Нельзя ли и их
каким-нибудь образом сделать в виде процедуры? Да, можно.
Напишите в модуле формы следующую процедуру:
&НаКлиенте
Процедура ИнтерактивноВВестиКореньИВычислить()
Перем А;
Если ВвестиЧисло(А,"Введите число") тогда
Если А >= 0 тогда
КореньА = Sqrt(А);
Сообщить("Корень из числа " +
А + " = " + Окр(КореньА,5));
иначе
Сообщить("Введенное число меньше нуля");
Сообщить("Вычисление не будет произведено");
Сообщить("Задайте другие числа");
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Листинг 3.4.3
А в обработчике команды код:
&НаКлиенте
Процедура ВыполнитьКоманду2(Команда)
ИнтерактивноВВестиКореньИВычислить();
ИнтерактивноВВестиКореньИВычислить();
КонецПроцедуры

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

140

Низамутдинов Ильяс

Глава 3. Основные операторы

Сделать это можно двумя способами. Первый: сделать эту переменную глобальной и
передавать в процедуру. О глобальных и локальных переменных мы узнаем в четвертой главе.
Либо передать эту переменную в качестве параметра.
А для этого мы рассмотрим наш более усложненный синтаксис. Обратите внимание: все,
что касается параметров, справедливо и для процедур, и для функций. Просто сейчас мы
рассмотрим данный вопрос на примере процедур.
Процедура ИмяПроцедуры(Параметр1, Параметр2, ….,ПараметрN)

КонецПроцедуры
После названия процедуры внутри скобок идет описание параметров, которые будут
передаваться в процедуру. Из основного кода параметры должны передаваться в той
последовательности, в которой описаны в процедуре. Названия параметров внутри процедуры
должны совпадать с названиями в скобках.
Переделайте Ваш пример.
Измените процедуру ВычислитьКореньИВывести следующим образом:
&НаКлиенте
Процедура ВычислитьКореньИВывести(ЧислоПодКорнем, НазваниеЧисла)
Если ЧислоПодКорнем >= 0 тогда
КореньА = Sqrt(ЧислоПодКорнем);
Сообщить("Корень из числа " + НазваниеЧисла + " = " +
Окр(КореньА,5));
иначе
Сообщить("Число " + НазваниеЧисла + " меньше нуля");
Сообщить("Вычисление не будет произведено");
Сообщить("Задайте другие числа");
КонецЕсли;
КонецПроцедуры

Листинг 3.4.5
И создадим новую команду формы, в обработчике которой напишем следующий код:
&НаКлиенте
Процедура ВычислитьКорень(Команда)
Перем А,Б;
А = 10.11;
ВычислитьКореньИВывести(А,"А");
Если ВвестиЧисло(Б, "Введите число Б") Тогда
ВычислитьКореньИВывести(Б,"Б");
КонецЕсли;
КонецПроцедуры

Листинг 3.4.6

141

Низамутдинов Ильяс

Глава 3. Основные операторы

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

Компилятор выдаст ошибку.
С параметрами должно быть понятно, но есть один момент. Когда мы передаем параметр
в процедуру, то мы передаем не просто само по себе число, строку или какой-то объект, а, по
сути, передаем ссылку на данное число, строку или объект. Это значит, что если внутри процедуры
мы изменим данный параметр, то поменяется и сама та переменная, которая передается в виде
параметра в нашу процедуру.
Звучит несколько сложно, но один простой пример прояснит картину.
Сделаем новую процедуру ВычислитьКореньПоМодулюИВывести:
&НаКлиенте
Процедура ВычислитьКореньПоМодулюИВывести(ЧислоПодКорнем, НазваниеЧисла)
ЧислоПодКорнем = ?(ЧислоПодКорнем >=0,ЧислоПодКорнем,ЧислоПодКорнем*(-

1));

КореньА = Sqrt(ЧислоПодКорнем);
Сообщить("Корень из модуля числа " +
НазваниеЧисла + " = " +
Окр(КореньА,5));

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

Листинг 3.4.7

142

Низамутдинов Ильяс

Глава 3. Основные операторы

Создадим новую команду «ВычислитьКореньПоМодулю» и в её обработчике напишем
следующий код:
&НаКлиенте
Процедура ВычислитьКореньПоМодулю(Команда)
Перем А;
Если ВвестиЧисло(А, "Введите число А") Тогда
Сообщить("Число А = " + А);
ВычислитьКореньПоМодулюИВывести(А,"А");
Сообщить("Число А = " + А);
КонецЕсли;
КонецПроцедуры

Листинг 3.4.8
В данном примере если ЧислоПодКорнем меньше нуля, то мы его рекурсивно умножаем
на минус единицу.

Рис. 3.4.1
Запустите данный пример. И при вводе отрицательного числа будет изменено само число,
которое Вы ввели.
В каких-то случаях Вас это не будет сильно волновать, но в других случаях Вы захотите,
чтобы переменная, которую передаете в процедуру или функцию, оставалась прежней. Как это
сделать? Смотрим следующий синтаксис:
Процедура ИмяПроцедуры(Знач Параметр1, Знач Параметр2, ….,Знач ПараметрN)
КонецПроцедуры
Ключевое слово Знач перед параметром означает, что данный параметр передается в
процедуру по значению, т.е. изменение параметра внутри процедуры никак не повлияет на
значение фактического параметра, который был передан в процедуру. Ключевое слово Знач
является необязательным, т.е. переменная может передаваться как ссылочно, так и по значению.
Теперь измените Ваш предыдущий пример. Подправьте процедуру
«ВычислитьКореньПоМодулюИВывести»
Процедура ВычислитьКореньПоМодулюИВывести(Знач ЧислоПодКорнем, НазваниеЧисла)
ЧислоПодКорнем = ?(ЧислоПодКорнем >=0,ЧислоПодКорнем,ЧислоПодКорнем*(-1));
КореньА = Sqrt(ЧислоПодКорнем);
Сообщить("Корень из модуля числа " +
НазваниеЧисла + " = " +
Окр(КореньА,5));
КонецПроцедуры

Листинг 3.4.9

143

Низамутдинов Ильяс

Глава 3. Основные операторы

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

Рис. 3.4.2
Продолжим рассматривать передачу параметров в процедуры и функции. Мы уже знаем,
что все параметры, которые мы передаем в процедуру или функцию, обязательны, т.е. когда Вы в
коде задаете процедуру, то обязаны перечислить их все, но есть возможность создать параметр
по умолчанию, тогда у Вас не будет обязанности перечислять его в процедуре.
Рассмотрим синтаксис.
Процедура ИмяПроцедуры(Параметр1 = Умол1, Параметр2 = Умол2, ….,ПараметрN =
УмолN)

КонецПроцедуры
Разберем данный синтаксис. Такая форма описания параметра означает, что данный
параметр имеет значение по умолчанию и тем самым он становится необязательным, т.е. когда
мы будем писать данную процедуру в модуле, то вольны не указывать этот параметр.
Доработайте пример. В этот раз мы вычисляем корень числа и выводим его на экран с
точностью до 5-го знака, но пользователь может менять точность.
Создадим новую процедуру «ВычислитьКореньИВывестиСОкруглением»
&НаКлиенте
Процедура ВычислитьКореньИВывестиСОкруглением(Знач ЧислоПодКорнем,
НазваниеЧисла, Точность = 5)
1));

ЧислоПодКорнем = ?(ЧислоПодКорнем >=0,ЧислоПодКорнем,ЧислоПодКорнем*(КореньА = Окр(Sqrt(ЧислоПодКорнем),Точность);
Сообщить("Корень из модуля числа " + НазваниеЧисла + " = " + КореньА);

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

Листинг 3.4.10
Опять создадим новую команду «ВычислитьКореньСОкруглением», и в её обработчике
напишем следующий код:

144

Низамутдинов Ильяс

Глава 3. Основные операторы

&НаКлиенте
Процедура ВычислитьКореньСОкруглением(Команда)
Перем А;
Если ВвестиЧисло(А, "Введите число А") Тогда
ВычислитьКореньИВывестиСОкруглением(А,"А");
ВычислитьКореньИВывестиСОкруглением(А,"А",7);
КонецЕсли;
КонецПроцедуры

Листинг 3.4.11
Разберем данный пример. Мы переделали нашу процедуру
ВычислитьКореньСОкруглением, добавив параметр Точность, который по умолчанию равен 5.
Его мы используем для округления числа, которое получилось при извлечении квадратного корня.
После этого мы используем процедуру два раза. Первый раз без третьего параметра, а второй раз
с третьим параметром.
Сохраните обработку и запустите ее. И введите любое число.

Рис. 3.4.3
Как Вы видите, в первый раз значение вышло с точностью до 5-го знака, а второй до 7-го.
Обращаю Ваше внимание, что параметр, который передается по значению, также может
быть и параметром по умолчанию.
Рассмотрим следующий синтаксис:
Процедура ИмяПроцедуры(Знач Параметр1 = Умол1, Знач Параметр2 = Умол2, ….,
Знач ПараметрN = УмолN)

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

145

Низамутдинов Ильяс

Глава 3. Основные операторы

&НаКлиенте
Процедура ВычислитьКореньИВывестиТочностьПять(Знач ЧислоПодКорнем,
НазваниеЧисла, Знач Точность = 5)
1));

ЧислоПодКорнем = ?(ЧислоПодКорнем >=0,ЧислоПодКорнем,ЧислоПодКорнем*(-

Точность = ?(Точность < 5, 5, Точность);
КореньА = Sqrt(ЧислоПодКорнем);
Сообщить("Корень из модуля числа " +
НазваниеЧисла + " = " +
Окр(КореньА,Точность));

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

Листинг 3.4.12
Опять создадим новую команду «ВычислитьКореньСТочностьюПять», и в её
обработчике напишем следующий код:
&НаКлиенте
Процедура ВычислитьКореньСТочностьюПять(Команда)
Перем А;
Если ВвестиЧисло(А, "Введите число А") Тогда
ВычислитьКореньИВывестиТочностьПять(А,"А");
ВычислитьКореньИВывестиТочностьПять(А,"А",3);
КонецЕсли;
КонецПроцедуры

Листинг 3.4.13
Разберите данный пример самостоятельно.
Рассмотрим последний оператор, который применим просто к процедурам, а не к их
параметрам. Это оператор Возврат.
Рассмотрим синтаксис.
Процедура ИмяПроцедуры(Параметр1, Параметр2, ….,ПараметрN)

///операторы
Возврат;
//операторы

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

146

Низамутдинов Ильяс

Глава 3. Основные операторы

После того, как мы написали имя процедуры, перечислили параметры, пишем наши
действия. И когда в ходе выполнения процедуры встретится ключевое слово Возврат, то
программа тут же выйдет из нее и ее выполнение прекратится. После этого действия работать
будут операторы, следующие после ключевого слова КонецПроцедуры.
Сделайте пример. В этом примере Вы также будете вычислять квадратный корень числа,
но если число отрицательное, то будет выполнен выход из процедуры (см. рис. 3.4.4).
Создадим процедуру «ВычислитьКореньТолькоПоложительныхЧисла»:
&НаКлиенте
Процедура ВычислитьКореньТолькоПоложительныхЧисла(ЧислоПодКорнем,
НазваниеЧисла)
Если ЧислоПодКорнем < 0 тогда
Предупреждение("Нельзя извлекать квадратный корень из отрицательного
числа!");
Возврат;
КонецЕсли;
КореньА = Sqrt(ЧислоПодКорнем);
Сообщить("Корень из числа " + НазваниеЧисла + " = " + Окр(КореньА,5));
КонецПроцедуры

Листинг 3.4.14
Опять создадим новую команду «ВычислитьКореньПоложительногоЧисла» и в её
обработчике напишем следующий код:
&НаКлиенте
Процедура ВычислитьКореньПоложительногоЧисла(Команда)
Перем А;
Если ВвестиЧисло(А, "Введите число А") Тогда
ВычислитьКореньТолькоПоложительныхЧислел(А,"А");
КонецЕсли;
КонецПроцедуры

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

147

Низамутдинов Ильяс

Глава 3. Основные операторы

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

148

Низамутдинов Ильяс

Глава 3. Основные операторы

&НаКлиенте
Функция Сигнум(ЧислоА)
Перем Сигн;
Если ЧислоА > 0 тогда
Сигн = 1;
ИначеЕсли ЧислоА = 0 тогда
Сигн = 0
ИначеЕсли ЧислоА < 0 тогда
сигн = -1
КонецЕсли;
Возврат Сигн;
КонецФункции

Листинг 3.4.16
Опять создадим новую команду «ВычислитьСигнумЧисла» и в её обработчике напишем
следующий код:
&НаКлиенте
Процедура ВычислитьСигнумЧисла(Команда)
Перем А;
Если ВвестиЧисло(А, "Введите число А") Тогда
В = Сигнум(А);
Сообщить("Signum (" + А + ") = " + В);
КонецЕсли;
КонецПроцедуры

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

149

Низамутдинов Ильяс

Глава 3. Основные операторы

&НаКлиенте
Функция л_Сигнум(ЧислоА)
Если ЧислоА > 0 тогда
Возврат 1;
ИначеЕсли ЧислоА = 0 тогда
Возврат 0;
Иначе
Возврат -1
КонецЕсли;
КонецФункции

Листинг 3.4.18
Как видно из данного примера, после каждого результата сравнения мы возвращали
нужное нам значение.
Еще одной особенностью функций является то, что необязательно какой-то переменной
присваивать значение функции. Эту функцию можно использовать в качестве процедуры.
Сделаем пример, с помощью которого Вы поймете данный тезис. В этом примере мы
будем вычислять квадратный корень из числа и возвращать значение в виде параметра, а сама
функция будет возвращать Истина, если удалось вычислить, и Ложь, если нет.
Напишите в модуле формы следующую функцию:
Функция ВычислитьКвадратныйКорень(НазваниеЧислаПодКорнем, ЧислоПодКорнем,
КореньЧисла)
Если ЧислоПодКорнем < 0 тогда
Сообщить("Нельзя вычислять корень из отрицательного числа");
Возврат Ложь;
иначе
КореньЧисла = Окр(Sqrt(ЧислоПодКорнем),5);
Сообщить("Корень из числа " + НазваниеЧислаПодКорнем + " = " +
КореньЧисла);
Возврат Истина;
КонецЕсли;
КонецФункции

Листинг 3.4.19
Опять создадим новую команду «ВычислитьКореньЧислаФункцией» и в её обработчике
напишем следующий код:
&НаКлиенте
Процедура ВычислитьКореньЧислаФункцией(Команда)
Перем А,Б;
Если ВвестиЧисло(А, "Введите число А") Тогда
ВычислитьКвадратныйКорень("А",А,Б);
КонецЕсли;
КонецПроцедуры

Листинг 3.4.20

150

Низамутдинов Ильяс

Глава 3. Основные операторы

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

151

Низамутдинов Ильяс

Глава 3. Основные операторы

Часть 5. Попытка…Исключение
В заключительной части третьей главы мы рассмотрим очень нужный и полезный
оператор Попытка… Исключение. В чем суть этого оператора? Как Вы уже заметили из
предыдущих примеров, в ходе выполнения программы могут возникать ошибки, такие как
деление на ноль, корень из отрицательного числа и прочие. Мы эти ошибки обходили
конструкцией Если...Тогда, но не всегда возможно применить данную конструкцию, чтобы обойти
исключительную ситуацию. Поэтому в языке программирования 1С существует оператор
Попытка…Исключение.
Рассмотрим его синтаксис.
Попытка
//операторы попытки
Исключение
//операторы исключения.
КонецПопытки
Разберем данный синтаксис.
Ключевое слово Попытка открывает список операторов, выполнение которых может
привести к исключительной ситуации, все операторы между ключевыми словами Попытка и
Исключение это Операторы попытки.
Ключевое слово Исключение открывает список операторов, которые будут выполняться в
том случае, если вызвана исключительная ситуация операторами попытки. Т.е. если во время
выполнения программы один из операторов попытки вызвал ошибку выполнения программы
(исключительную ситуацию), то выполнение данного оператора прерывается и управление
передается на первый Оператор исключения. Причем обращаю Ваше внимание, что управление
будет передано и в том случае, если исключительную ситуацию вызвали функции и процедуры,
разработанные программистом и применяемые в качестве операторов попытки. Естественно, что
если ошибка произошла в процедуре или функции, то ее выполнение будет прервано.
Создайте обработку, форму, команду на форме и в обработчике команды сделайте
следующий пример:

152

Низамутдинов Ильяс

Глава 3. Основные операторы

&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
Перем А;
Если ВвестиЧисло(А,"Введите число А") тогда
Попытка
КореньЧислаяА = Sqrt(А);
Сообщить("Квадратный корень числа А = " + Окр(КореньЧислаяА,5));
Исключение
Сообщить("Попытка извлечь корень из отрицательного числа");
КонецПопытки;
КонецЕсли;
КонецПроцедуры

Листинг 3.5.1
Разберем данный пример.
Как обычно, вводим интерактивно число, после чего пытаемся вычислить квадратный
корень данного числа. Используем ключевые слова Попытка, Исключение, КонецПопытки. Эти
ключевые слова всегда должны быть в наличии и представлены в такой очередности, как мы
видим. Таким образом, в Вашем примере вычисление квадратного корня и вывод сообщения
являются операторами попытки. Между словом Исключение и КонецПопытки располагаются
операторы исключения. На эти операторы перейдет программа после вызова исключения.
Операторы попытки, следующие после строки, когда, где была инициализирована ошибка,
исполняться не будут.
Запустите вновь созданную обработку и посмотрите, как она работает.
Если Вы все сделали правильно, то увидите, что никакой ошибки не возникает, просто
вышло сообщение о корне из отрицательного числа. А что если нам нужно, чтобы все-таки ошибка
вышла? Для этого есть оператор ВызватьИсключение.
Переделайте Ваш пример.
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
Перем А;
Если ВвестиЧисло(А,"Введите число А") тогда
Попытка
КореньЧислаяА = Sqrt(А);
Сообщить("Квадратный корень числа А = " + Окр(КореньЧислаяА,5));
Исключение
Сообщить("Попытка извлечь корень из отрицательного числа");
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
КонецПроцедуры

Листинг 3.5.2
В данном примере после операторов исключения пишем оператор ВызватьИсключение.

153

Низамутдинов Ильяс

Глава 3. Основные операторы

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

Рис. 3.5.1
Как видите, оператор исключения отработал, и сразу вышла ошибка о неправильном
параметре.
Оператор ВызватьИсключение особенно удобно использовать на этапе отладки, когда
исключительная ситуация может сложиться в различных случаях и необходимо точно знать, где
она произошла и в результате чего она произошла.
Теперь сделаем пример, когда исключительная ситуация будет происходить внутри
функции, которая используется в качестве оператора попытки.
Данный пример будет следующим: вычислим квадратный корень некоторого числа с
округлением, потом возведем в квадрат и посчитаем погрешность: вычтем из заданного числа
получившийся квадрат.
Напишите в модуле формы следующую функцию:
&НаКлиенте
Функция ВычеслитьИОкруглитьКорень(ЧислоПодКорнем,Точность = 5)
КореньЧисла = Окр(Sqrt(ЧислоПодКорнем),Точность);
Возврат КореньЧисла;
КонецФункции

Листинг 3.5.3
Создадим команду «ПолучитьПогрешностьОкругления» и в обработчике команды
напишем следующий код:
&НаКлиенте
Процедура ПолучитьПогрешностьОкругления(Команда)
Перем А;
Если ВвестиЧисло(А,"Введите число А") тогда
Попытка
А2 = Pow(ВычеслитьИОкруглитьКорень(А,10),2);

154

Низамутдинов Ильяс

Глава 3. Основные операторы

ПогрешностьОкругления = А - А2;
Сообщить("Погрешность окуругления = " + ПогрешностьОкругления);
Исключение
Сообщить("Ошибка при вычислении");
КонецПопытки;
КонецЕсли;
КонецПроцедуры

Листинг 3.5.4
Сохраните и запустите Вашу обработку.
Если сделано все правильно, то Вы увидите, что при введении положительного числа
выходит результат, а в случае отрицательного числа – сообщение об ошибке.
Разберите данный пример самостоятельно.
Сейчас мы рассмотрели оператор Попытка…Исключение. Теперь Вы сможете избегать
неприятных ситуаций с возникновением ошибок. Особенно желательно использовать данный
оператор в критических моментах выполнения кода, например, при записи чего-либо в базу.

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

155

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Часть 1. Основы конфигурации

Рис. 4.1.1

156

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

157

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.3
Откроется окно "Свойства константы" (или палитра свойств констант).

Рис. 4.1.4

158

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

В этой форме вводим Имя константы (назовем ее НазваниеОрганизации) и Синоним –
аналог имени, который будет отображаться пользователю. Тип константы (мы пока знаем
только 4 типа) - выберем тип Строка. Длина - это длина строки, сделаем ее равной ста.

Рис. 4.1.5
Допустимая длина может быть либо фиксированной, либо переменной. Переменная
отличается от фиксированной тем, что если в первом случае Вы ввели при длине 100 символов
строку из 20 символов, то в базе будет храниться строка из 20 символов, а в фиксированном
случае будут храниться все 100 символов, остальные 80 заполнятся пробелами.
Вот мы создали первую константу. Создайте самостоятельно следующие константы:
ДатаНачалаРаботыОрганизации (тип Дата, состав даты Дата, см. рис. 4.1.6),
ПроцентНалогаНаПрибыль (тип Число с точностью до одной сотой).

Рис. 4.1.6
В итоге у Вас должен получиться следующий набор констант:

Рис. 4.1.7

159

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Для констант можно создать собственную форму.

Рис. 4.1.8
В открывшемся конструкторе формы оставляем все без изменения и нажимаем кнопку
«Готово». Вышла форма констант, которая появилась в ветке «Общие»-«Общие формы».

Рис. 4.1.9

160

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.10
Более подробно работу с формами мы рассмотрим в пятой и шестой главе.
После того, как Вы создадите константы и форму констант, у окна конфигурации появится
знак * (см. рис. 4.1.11), это значит, что Ваша конфигурация отредактирована, но не сохранена.
Чтобы ее сохранить, нужно нажать на кнопку «Сохранить» (см. рис. 4.1.12).

Рис. 4.1.11

Рис. 4.1.12

161

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

После сохранения, у окна конфигурации появится знак «!» (см. рис. 4.1.13). Это значит, что
Ваша конфигурация сохранена, но не загружена в базу.

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

Рис. 4.1.14

Рис. 4.1.15

162

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Мы обновим базу данных (рис. 4.1.14) и запустим «1С:Предприятие», нажав на кнопку
«Начать отладку» (см. рис. 4.1.16).

Рис. 4.1.16
В верхней панели у Вас появится меню «Сервис», раскрыв которое, Вы увидите пункт
«Форма констант» (см. рис. 4.1.17).

Рис. 4.1.17
После нажатия на этот пункт откроется форма, которую мы создали ранее (см. рис. 4.1.18).

Рис. 4.1.18

163

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Введите в неё какие-нибудь данные и нажмитена кнопку «Записать», тем самым Ваши
константы запишутся в базу данных. Почему так произошло, мы изучим позже, когда будем
проходить объектные типы (шестая глава).

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

Рис. 4.1.19

164

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Открылся конструктор справочника. Вводим название справочника МаркиАвтомобилей и
синоним (то, что будет видеть пользователь) Марки автомобилей.

Рис. 4.1.20
В этом справочнике не будет реквизитов, поэтому сразу идем на закладку «Данные» и
выставляем длину кода 3, а длину наименования 10.

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

165

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

случае (3), длину наименования сделаем 50. Теперь создаем реквизиты. Первый реквизит
ГодВыпуска, тип Дата (состав даты Дата), второй ГосНомер, тип Строка (длина 10).

Рис. 4.1.22
И третье, самое интересное, мы создаем реквизит Марка, тип которого Ссылка на
справочник МаркаАвтомобиля.

Рис. 4.1.23
Точно так же добавьте реквизит Модель, тип которого Ссылка на справочник
МоделиАвтомобилей.
Более подробно ссылочные типы мы будем разбирать в следующей главе. Напоследок
создаем табличную часть и назовем ее ДополнительныеОпции. В табличной части создаем
реквизит Опция с типом ссылка на справочник Опции (создайте самостоятельно, без реквизитов,
длина кода 3, длина наименования 50).

166

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.25
Обновите базу данных.

Рис. 4.1.26
Теперь посмотрим, как выглядит наш справочник. И заполним его парой элементов.
Запустите «1С:Предприятие». Все справочники появились в верхней панели (см. рис. 4.1.27).

167

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Предопределенные элементы
У любого справочника можно создать Предопределенный элемент - это элемент,
который создан в конфигураторе, и с ним можно работать как с обычным элементом. Этот
элемент есть всегда, в платформе 8.2 его нельзя было пометить на удаление и удалить, в
платформе 8.3. предопределенные объекты можно удалять в пользовательском режиме.
Создадим два предопределенных элемента для справочника Марки автомобилей - «Российские»
и «Иномарки».
Зайдите в форму справочника, для этого кликнув правой кнопкой мышки по справочнику
Марки автомобилей, и выберете в открывшемся меню «Открыть предопределенные данные»

Рис. 4.1.28
В открывшемся списке добавьте новый элемент.

168

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.29
Точно так же создадим элемент «Иномарка».

Рис. 4.1.30

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

Рис. 4.1.31
Если мы создадим новый элемент в «1С:Предприятии» (см. рис. 4.1.32), то он отличаться от
предопределенного будет по значку рядом с наименованием (см. рис. 4.1.33).

169

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.32

Рис. 4.1.33

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

170

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.34
Список владельцев пустой. Нажмите на карандаш, должно открыться окно выбора
объектов, ставим флажок возле справочника «Марки автомобилей» и нажимаем «ОК».

Рис. 4.1.35
Использование подчинения оставляем Элементы.

Рис. 4.1.36
Сохраните конфигурацию и запустите «1С:Предприятие». Откроем справочник «Марки
автомобилей» и зайдем в элемент, который создали в прошлом подразделе - Ford.

171

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.38

Рис. 4.1.39
Теперь создадим новую марку (пусть это будет KIA) и добавим для неё новую модель
(пусть это будет Rio).

172

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.40
А теперь попробуем создать новый элемент справочника Автомобили, где выберем
какую-нибудь марку (пусть будет Ford), и попробуем выбрать модель.

Рис. 4.1.41

173

Низамутдинов Ильяс

Глава 4. Основы конфигурирования
Рис. 4.1.42

Как видите, в форме выбора модели есть выбор и моделей Ford, и моделей KIA, что
согласитесь, немного неудобно. Как же сделать так, чтобы в форме выбора были модели только
для той марки, которая выбрана в реквизите элемента справочника. Для этого нам понадобится
зайти в конфигураторе в свойства реквизита «Модель» справочника «Автомобили» (дважды
кликнув левой клавишей мышки по реквизиту в дереве конфигурации). В открывшейся палитре
свойств нас интересует свойство «Связи параметров выбора».

Рис. 4.1.43
При помощи этого свойства можно настроить зависимость выбираемых параметров от
значений других реквизитов. Откроем форму «Связи параметров выбора», нажав на кнопку «…».

Рис. 4.1.44
Поскольку нам нужно установить связь реквизита Модель с реквизитом Марка, то
перетащим этот реквизит из левой части в правую.

174

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.45
Нажмем кнопку «ОК» формы связи параметров выбора.

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

Рис. 4.1.47
Как видите, вышла только одна модель, у которой владелец марка Ford.

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

175

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Сделаем справочник Гаражи иерархическим. Для этого переходим на закладку
«Иерархия» конструктора справочника и установим флаг «Иерархический».

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

Рис. 4.1.49
Как видите, в форме списка появилось две команды. «Создать» и «Создать группу». При
выполнении команды «Создать» будет открыта форма на создание нового элемента, а при
выполнении команды «Создать группу» - форма на создание группы (папки).
Создадим каталог Авто база 1.

176

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.50
Пишем наименование «База 1». Родитель пустой. Нажмем кнопку «Записать и закрыть»,
группа будет создана. Зайдите в папку, кликнув на нее два раза, и добавьте элемент. В этот раз
выполним команду «Создать».

Рис. 4.1.51
Открылась форма, где уже родитель заполнен. Назовем элемент Гараж № 1.
Сохраним элемент.

Рис. 4.1.52
Как Вы видите, данный гараж находится в группе Авто база.

177

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

178

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.54
Перейдите на закладку «Данные» и создайте три реквизита: Автомобиль, Гараж и Дата
прибытия.

Рис. 4.1.55
Первый реквизит будет иметь тип Ссылка на справочник Автомобили, второй - тип Ссылка
на справочник Гараж, а третий – Дата (состав Дата и время).

179

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.56
Точно так же создайте документ Выбытие из гаража. Реквизиты – Автомобиль, Гараж и
ДатаВыбытия. Типы реквизитов аналогичны типам в документе Прибытие в гараж.
Теперь создайте документ Заправка топлива. Поначалу действуйте все так же. Создайте
два реквизита: ДатаЗаправки с типом Дата (состав даты Дата) и ТипТоплива (ссылка на
справочник ТипыТоплива, справочник ТипыТоплива создайте самостоятельно, без реквизитов,
длина кода 3, длина наименования 10).
Создайте табличную часть Автомобили, где будет два реквизита: Автомобиль (тип Ссылка
на справочник Автомобили) и Количество (тип Число(10,2)). Для этого идите в закладку Данные и
кликните правой кнопкой мышки на Табличную часть. После нажмите на кнопку «Добавить».

Рис. 4.1.57
Табличная часть будет создана, переименуйте ее в «Автомобили» (сделать это можно в
палитре свойств табличной части, чтобы в неё зайти, нужно дважды кликнуть мышкой по нужной
табличной части).

180

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.58
И добавьте новый реквизит данной табличной части.

Рис. 4.1.59
Назовите его Автомобиль и присвойте тип Ссылка на справочник Автомобили.

Рис. 4.1.60
Точно так же добавьте реквизит Количество с типом Число (длинна 10, точность 0).
В дальнейшем число с длинной X, а точностью Y будем писать так: Число (X,Y).
Осталось создать документ «Отчет о расходе топлива», сделайте это самостоятельно, в
этом документе будет точно такой же набор полей, как и в документе «Заправка топлива»,
только вместо ДатаЗаправки будет поле ДатаОтчета.

181

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

182

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.62
В верхнем окне «Вводится на основании» нажмите на карандаш, откроется окно выбора
объектов.

Рис. 4.1.63
В окне выбора объектов, установите флажок напротив документа Прибытие в гараж и
нажмите кнопку «ОК».
После этого в верхнем окне закладки «Ввод на основании» появится название выбранного
документа:

183

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.64
А если Вы зайдете в аналогичную закладку менеджера документа «Прибытие в гараж», то
увидите, что заполнено окно «Является основанием».

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

184

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.66
Откроется конструктор, в котором необходимо заполнить реквизиты Автомобиль и
Гараж.

Рис. 4.1.67
В правом верхнем окне показаны реквизиты документа основания (Прибытие в гараж), а в
нижнем окне реквизиты текущего документа Выбытие из гаража. При установке курсора на
строку нужного поля нижнего в верхнем левом окне зеленым флажком будут отмечены реквизиты
документа основания, тип которых совпадает с типом выделенного поля (см. рис. 4.1.67).
Чтобы совместить реквизит основного документа с реквизитом документа основания,
необходимо выделить строку с нужным реквизитом в нижней таблице и дважды кликнуть на
соответствующий реквизит левой верхней таблицы. Мы совместим реквизиты «Автомобиль –
Автомобиль» и «Гараж – Гараж».

185

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.68
Нажмите «ОК», и процедура заполнения на основании будет создана автоматически.

Рис. 4.1.69
Сохраните конфигурацию и создайте документ Выбытие из гаража на основании
документа Прибытие в гараж.

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

186

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.70
Откроется форма журнала, где Вы назовете его ПрибытиеВыбытиеАвтомобилей.

Рис. 4.1.71
Осталось задать регистрирующие документы. Для этого заходим в закладку «Данные».

Рис. 4.1.72
Окошко «Регистрирующие документы» пустое, заполните его. Необходимо нажать на
кнопку «Редактировать элемент списка» в виде карандашика, и в открывшемся окне выберите
документы ПрибытиеВГараж и ВыбытиеИзГаража.

187

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.74
Из формы журнала Вы видите, что у нас только номер, дата и тип документа, что,
согласитесь, иногда бывает недостаточно. Добавим в журнал еще две колонки, это Гараж и
Автомобиль. Для этого воспользуемся окном «Графы» на закладке конструктора журнала
документов (см. рис. 4.1.75).

Рис. 4.1.75

188

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Добавим новую графу в журнал документов. Для этого нажмем на кнопку «Добавить» окна
«Графы».

Рис. 4.1.76
Графа добавилась, теперь нам необходимо задать, какие поля документов будут
отображаться в этой графе. Для этого в палитре свойств графы нужно нажать на кнопку «…» у
свойства «Ссылки», после этого откроется окно, где нужно указать реквизиты документов
журнала, которые должны отобразиться в данной графе (см. рис. 4.1.77).

Рис. 4.1.77
Графу можно переименовать.

Рис. 4.1.78

189

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.79
Самостоятельно добавьте новую графу, чтобы журнал выглядел следующим образом:

Рис. 4.1.80

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

Рис. 4.1.81
У Вас откроется меню элемента перечисления. Назовите его КоробкаПередач.

190

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.83
Значение создалось, назовите его Ручная.

Рис. 4.1.84
Точно так же создайте второе значение - Автоматическая.
Теперь перейдите в Ваш справочник Автомобили и добавьте новый реквизит Коробка
передач, тип которого будет Ссылка на перечисление Коробка Передач.

191

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.85
В «1С:Предприятии» в уже созданных элементах справочника «Автомобили» заполните
новый реквизит «Коробка передач».

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

192

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

193

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.87
Открывается форма регистра сведений, где Вы введите название
ОсновнойГаражАвтомобиля, периодичность выберете Непериодический, а режим записи
Независимый.

Рис. 4.1.88
Перейдите на закладку «Данные», где необходимо создать измерение Автомобиль, тип
которого будет Ссылка на справочник Автомобили. Это будет Ваше единственное измерение.
Добавьте ресурсы Гараж, тип Ссылка на справочник Гаражи.

Рис. 4.1.89

Рис. 4.1.90

194

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Рис. 4.1.92

195

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.93

Рис. 4.1.94
И мы не сможем добавить еще один основной гараж автомобиля. Выйдет ошибка.

Рис. 4.1.95
Перейдем к периодическим регистрам сведений. Для этого создадим периодический
регистр сведений «Цены на топливо» с периодичностью – день.

196

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.96
С двумя измерениями «ТипТоплива» (ссылка на справочник «ТипыТоплива») и
«ПоставщикТоплива» (ссылка на справочник «ПоставщикиТоплива», создайте самостоятельно
(без реквизитов, длина кода 3, длина наименования 100)). И одним ресурсом – цена (число
(10,2)).

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

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

197

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.99
А если цена будет по дню меняться несколько раз? Как быть? Можно создать более
маленькую периодичность (секунда). А можно сделать режим записи – подчиненный
регистратору, а периодичность – по позиции регистратора.

Рис. 4.1.100
В этом случае мы сможем создавать сколько угодно регистраторов, пусть даже с одним и
тем же временем, и наш регистр будет нормально заполняться (удалите все созданные ранее
записи регистра сведений «Цены на топливо»).
Для этого создадим новый документ «Установка цен на топливо» со следующими
данными и настройками.

198

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.101

Рис. 4.1.102
Не забудьте поставить везде, где нужно ссылочные типы (определите это самостоятельно).
Более подробно работу с документами будем проходить в шестой главе.
Сейчас при помощи конструктора движений создадим обработку проведения по нашему
регистру. Чтобы он открылся, нажмите на кнопку «Конструктор движений» в закладке
«Движения».

Рис. 4.1.103

199

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.104
Подберем в измерение «ТипТоплива» и ресурс «Цена» соответствующие реквизиты из
табличной части, а в измерение «ПоставщикТоплива» реквизит «Поставщик» из шапки.

Рис. 4.1.105

200

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Рис. 4.1.107

Рис. 4.1.108

201

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.109

Рис. 4.1.110

Рис. 4.1.111

202

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.112

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

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

203

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Основная функция регистра накопления заключается в суммировании ресурсов, т.е. если
какая-либо информация хранится в регистре накопления, то Вы можете в любой момент извлечь
сумму всех ресурсов по любым измерениям, которые Вам интересны.
Регистр накопления не может существовать без Регистратора, т.е. документа, который
при проведении создает записи данного регистра.
Регистры накопления бывают двух видов. Это Оборотные регистры и Регистры
остатков. Оборотные регистры просто фиксируют наличие движения по данному регистру, без
разницы, был ли приход или расход. Регистры остатков фиксируют движения двух видов:
приход и расход.
Ярким примером сущности, которая может храниться в оборотном регистре, является
прибыль: она может только появиться, нам интересен только сам факт наличия прибыли, к
примеру, сколько прибыли было за предыдущий месяц. Поэтому если разрабатывать регистр
накопления, который вел бы учет прибыли, то он должен быть оборотным. В нашей конфигурации
в оборотном регистре будет храниться пробег автомобиля. Пробег не может «прийти» или «уйти»,
он всегда накапливается, и нам нужно знать, какой пробег у автомобиля был за неделю, месяц,
год.
Другое дело товар: он приходит и уходит, и нам необходимо знать остатки товара на
складе или в организации, поэтому регистр накопления, который ведет учет товара, должен иметь
вид регистра остатков. В нашем случае мы будем вести учет топлива: сколько заправили топлива в
автомобиль, и сколько его автомобиль израсходовал.
Это общая информация о регистрах. Теперь перейдем к их строению. Разберем сначала,
что такое Измерения. Часто информацию нужно хранить в нескольких разрезах.
Например, нам необходима информация о наличии топлива в автомобилях. Само по себе
топливо уже будет измерение, но просто сведения о топливе будут неполными. Нам необходимо
знать, куда именно заправлено наше топливо, поэтому мы вводим еще одно измерение –
автомобиль. Пусть топливо будет Аи95 и Аи92 (измерение Топливо), а автомобиль – Директора и
Гл. инженера (измерение Автомобиль). Смотрим на таблицу 4.1.1*.
Топлива

Автомобиль

Количество, л.

Аи95

Директора

1

Аи92

Гл. инженер

2

Аи95

Гл. инженер

5

Табл. 4.1.1
* упростим, что разные виды топлива можно заправлять в один автомобиль, и вести по ним учет
Согласно таблице 3.1.1, топливо типа Аи95 заправлено в автомобили Директора и Гл.
инженера, всего топлива этого вида заправлено 6 литров. А в автомобиль Гл. инженера

204

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

заправлено топливо Аи92 и Аи95, всего 7 литров. Таким образом, мы подошли к важной функции
измерений - возможности суммировать нужный ресурс по любому значению измерения.
Сейчас мы создадим регистр накопления. Это будет регистр оборотов
ПробегАвтомобиля, у него будет одно измерение - Автомобиль, соответствующего типа, и один
ресурс – Пробег типа число (10,0).
Для этого кликаете правой кнопкой мышки по пункту «Регистры накопления» и
нажимаете «Добавить».

Рис. 4.1.114
Откроется форма регистра накопления. Введите наименование, синоним. Вид регистра
установите Обороты.

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

Рис. 4.1.116

205

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.117
В реквизиты документа «Прибытие в гараж» добавьте реквизит Пробег, с точно таким же
типом, как и у ресурса Пробег вновь созданного регистра накопления (число (10,0)).
Для удобства и скорости можете этот ресурс просто «скопировать», а потом «вставить» в
реквизиты документа «Прибытие в гараж», или вообще «перетащить»

Рис. 4.1.118
Закройте конструкторы регистра и документа.
Теперь необходимо прописать сами движения, которые должны возникнуть при
проведении документа.
Для этого в дереве документов выделяете нужный Вам документ (это будет Прибытие в
гараж), кликаете правой кнопкой мыши и находите в меню подменю «Конструкторы», по нему
перейдите в «Конструкторы движений» и запустите конструктор.

206

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.119
Открылась соответствующая форма, в которой Вы проставите соответствие измерений и
ресурсов регистра с реквизитами документа.

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

207

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.121

Рис. 4.1.122
Сейчас создайте регистр накопления ТопливоВАвтомобилях. Это будет регистр остатков,
у него будет два измерения – ТипТоплива и Автомобиль, соответствующих типов, и один ресурс –
Количество типа число (10,2).

Рис. 4.1.123

Рис. 4.1.124
Регистраторами данного регистра будут документы «Заправка топлива» и «Отчет о расходе
топлива».

208

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.125
Закройте конструктор регистра, сейчас пропишем движения, которые должны возникнуть
при проведении документа «Заправка топлива». Уже знакомым Вам способом (рис. 4.1.119)
откройте конструктор движений документа «Заправка топлива»

Рис. 4.1.126
У этого документа данные для движений по регистру накопления будем брать из
табличной части Автомобили. Поэтому в поле «Табличная часть» конструктора выберем
«Автомобили».

Рис. 4.1.127

209

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Нажимаем кнопку «ОК», и будет создана обработка проведения с соответствующим
кодом.
То же самое проделайте с документом «Отчет о расходе топлива», только ставим Тип
движения регистра - Расход.

Рис. 4.1.129

210

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.130
А также документ «Отчет о расходе топлива».

Рис. 4.1.131
И посмотрим, какие движения сделали эти документы.

Рис. 4.1.132

211

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

План видов характеристик
Рассмотрим такой интересный объект конфигурации, как план видов характеристик.
Часто при разработке прикладных решений могут появляться задачи добавления
дополнительных характеристик для различных объектов учета. Например, у нас есть справочник
Гаражи, вполне возможно, что в процессе работы нам понадобится хранить такую информацию,
как место гаража, длина, ширина, тип гаража и т.д.
Всю дополнительную информацию можно хранить в реквизитах этого справочника, и это
решение вполне имеет право на жизнь, но только в том случае, когда состав характеристик всегда
будет один и тот же, и он заранее известен. Если же состав реквизитов будет постоянно меняться,
то нам каждый раз придется переписывать конфигурацию: добавлять новый реквизит со всеми
вытекающими последствиями (переписывание форм и т.п.).
Может быть и иная ситуация: у разных объектов может быть разный состав характеристик.
Например, для какого-то гаража важно указать длину и ширину, а для какого-то эта информация
не столь критична. Тогда часть реквизитов будут лишними.
Во всех этих случаях гораздо рациональнее использовать планы видов характеристик, в
которых хранится дополнительная информация объектов аналитического учёта. Что такое план
видов характеристик? По сути это такой справочник, в котором элементы (характеристики) могут
быть различных типов. Например, есть характеристика Высота гаража, тип которой Число.В
характеристику Высота гаража, можно записать только число и не более. Причем у одного плана
видов характеристик могут быть характеристики разных типов. Таким образом, можно
резюмировать: если у обычного справочника все элементы одного типа (ссылка на этот
справочник), то у плана видов характеристик элементы могут быть разных типов, в зависимости от
того, как настроено в конфигурации.
Реализуем следующую задачу: создадим возможность хранения различных характеристик
справочника Гаражи. Характеристики могут быть в виде примитивных типов (например,
количество мест в гараже), а также и в виде каких-то значений (например, расположение гаража:
«Север», «Юг» и т.д.), которые могут создавать сами пользователи.
Для этого создадим план видов характеристик – ДополнительныеСвойстваГаражей.

Рис. 4.1.133

212

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.134
В конструкторе плана видов характеристик на закладке «Основные» обратите внимание на
поле «Тип значения характеристик», в этом поле необходимо задать тип (или типы).
Характеристики нашего нового плана вида характеристик будут только тех типов, которые указаны
в этом поле. Если нажать на кнопку «…» данного поля, то выйдет окно редактирования типа
данных.

Рис. 4.1.135
Где можно задать как конкретный тип, который будет у всех характеристик объекта, так и
перечень типов (установить флаг «Составной тип данных»). Мы зададим все примитивные типы.

213

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.136
Но, в условиях задачи было сказано, что характеристики могут храниться в виде каких-то
определенных значений, и у пользователя должна быть возможность выбрать одно из этих
значений. Причем эти значения пользователь может задать самостоятельно. Где наиболее
оптимально хранить значения той или иной характеристики? Причем так, чтобы эти значения не
пересекались.
К примеру, если есть характеристика «Расположение гаража», которая содержит
произвольные значения расположения гаража («Север», «Юг», «Запад» и т.д.), а также есть
характеристика «Тип гаража», которая содержит произвольные значения типа гаража
(«Кирпичный», «Железный» и т.д.), значения этих характеристик не должны пересекаться. Если
мы выбрали характеристику «Расположение гаража», то должны видеть только значения
расположения, но никак не значения типа гаража.
Можно, конечно, создать отдельные справочники «Расположение гаража» и «Тип гаража»,
но мы не можем быть уверены, что потом не добавятся еще какие-либо новые характеристики,
которые будут содержать произвольные значения, и нам опять не придется менять
конфигурацию. Самым оптимальным решением будет создать единый справочник для хранения
всех значений подобных характеристик. Этот справочник должен быть подчинен плану видов
характеристик «ДополнительныеСвойстваГаражей». В этом случае у любой характеристики
(элемента плана видов характеристик), тип которой «ссылка на подчиненный справочник», будет
свой набор значений, ни с чем не пересекающийся.
Немного запутанно? Сейчас все станет понятно.
Создадим такой справочник и назовем его СвойстваГаражей (создайте самостоятельно,
длина кода – 3, длина наименования -50). На закладке «Владельцы» установим единственного
владельца, план видов характеристик «Дополнительные свойства гаражей» (см. рис. 4.1.137).
После создания справочника перейдем в план видов характеристик «Дополнительные
свойства гаражей» и в поле «Тип значения характеристик» закладки «Основные» добавим новый
тип – ссылку на справочник «Свойства гаражей» (см. рис. 4.1.138). Теперь мы сможем создать
элементы (характеристики) нашего плана видов характеристик с этим типом, а также создать
элементы справочника «Свойства Гаражей», подчиненные нужной характеристике.

214

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1. 137

Рис. 4.1. 138
Но это еще не всё, в плане видов характеристик нужно указать, что значения характеристик
хранятся именно в справочнике «Свойства гаражей». Указывается это в свойстве
«Дополнительные значения характеристик» закладки «Основные».

215

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Тип гаража
Тип гаража

Каменный
Железный

216

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.141

Рис. 4.1.142
У измерения «Гараж» установите свойство Ведущее.
И создадим ресурс «Значение», тип которого будет характеристика плана видов
характеристик «Дополнительные свойства гаражей».

217

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.144
Самостоятельно точно также создайте характеристику Ширина, тип которой также будет
Число.
Создадим свойство Расположение, тип которого будет ссылка на справочник «Свойства
гаражей».

218

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.146
Аналогично создадим характеристику «Вид гаража» с типом ссылка на справочник
«Свойства гаражей», и с некоторыми значениями.

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

219

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.148
Попробуем при помощи регистра «Значение свойств гаражей» привязать какую-нибудь
характеристику и её значение к определенному гаражу. Заходить в сам регистр не нужно,
достаточно зайти в элемент справочника Гаражи и выполнить команду «Значение свойств
гаражей», которая расположена вверху формы элемента.

Рис. 4.1.149
Создадим новую запись регистра, в которой выберем свойство «Вид гаража».

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

220

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.151
Когда мы выберем тип «Свойства гаражей», то будут предложены значения всех свойств,
что тоже очень неудобно.

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

221

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.153

Рис. 4.1.154
При помощи свойства Связи параметров выбора настраивается зависимость одних
реквизитов от других (в нашем случае зависимость ресурса от измерения). В открывшейся форме

222

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Рис. 4.1.156

Рис. 4.1.157

223

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Обработки
С Обработками Вы уже знакомы. Мы с вами работаем с внешними обработками, но могут
быть и обработки в составе конфигурации.

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

Рис. 4.1.159

224

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.160
Еще Вы можете вставить уже имеющуюся обработку в конфигурацию. Для этого кликнем
правой кнопкой мышки по пункту конфигурации «Обработки» и выберем пункт «Вставить
внешнюю обработку, отчет…».

Рис. 4.1.161
И найдите любую недавно созданную Вами обработку (из предыдущих глав) и выберете
ее. Она станет в составе конфигурации. Сохраните конфигурацию и откройте обработку из меню
операции.
Отчеты
Отчеты необходимы для анализа информации о деятельности предприятия. Более
подробно отчеты Вы будете изучать в 11-й главе. Пока замечу, что отчеты могут быть сами по себе
(внешние отчеты), а могут и входить в состав конфигурации.

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

225

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Рис. 4.1.162
В правой части экрана откроется палитра свойств параметра сеанса, где укажем название,
синоним и тип (Строка (50)).

Рис. 4.1.163
Определяются параметры сеанса в модуле сеанса, который мы будем проходить ниже
(часть вторая текущей главы, стр. 247), где и научимся определять имя текущего компьютера.

Определяемые типы
Кроме примитивных и ссылочных типов (ссылочные типы будем проходить в шестой
главе), в конфигураторе 1С можно задать предопределяемый тип. Например, у нас много где
встречается такой реквизит как цена, которые имеет всегда тип «Число» (длина 10, точность 2).
Чтобы никогда не задумываться о параметрах числа для реквизитов, где будут храниться цены,
можно создать предопределенный тип, который назовем, как вариант, ТипДляЦен. И этот тип
можно использовать во всех подобных реквизитах.
Создадим такой тип: выделим ветку «Определяемые типы» и нажмем кнопку «Добавить».

226

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.164
В правой части откроется палитра свойств определяемого типа, где мы зададим такие
параметры как «Имя», «Синоним» и «Тип определяемого типа».

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

Рис. 4.1.166
Поменяйте тип у всех оставшихся реквизитов «Цена» самостоятельно.

227

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.167
После добавления общего реквизита справа откроется палитра свойств этого реквизита,
где зададим имя, синоним и тип (неограниченная строка).

Рис. 4.1.168
Применение реквизита в объектах данных задается в категории Использование палитры
свойств реквизита. Где нас интересуют два свойства – Состав и Автоиспользование. Разберемся
со свойством Автоиспользование. Именно при помощи этого свойства мы определяем, как будет
использоваться общий реквизит по умолчанию. Если установлено значение Использовать, то
значит, что реквизит используется везде, и нужно задать объекты, в которых не нужно применять
этот реквизит (при помощи свойства Состав). Если же установлено значение Не использовать, то

228

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

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

229

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.171

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

Объект метаданных
Марки автомобилей
Модели автомобилей
Опции
Автомобили
Гаражи
Свойства гаражей
Тип топлива
Поставщик топлива

Права
Справочники:
Полные

Чтение, просмотр
Документы
Полные

Прибытие в гараж
Выбытие из гаража
Заправка топлива
Чтение, просмотр
Отчет о расходе топлива
Установка цен на топливо
Журналы документов
Прибытие-выбытие автомобилей Чтение, просмотр
ПВХ
Дополнительные свойства
Полные
гаражей
Регистры сведений
Основной гараж автомобиля
Полные

230

Низамутдинов Ильяс

Учетчик топлива

Глава 4. Основы конфигурирования
Значение свойств гаражей
Цены на топливо
Чтение, просмотр
Регистры накопления
Пробег автомобиля
Полные
Топливо в автомобилях
Чтение, просмотр
Константы
Все константы
Чтение, просмотр
Ветка «Общие»
Параметры сеанса
Получение, установка
Общие реквизиты
Просмотр, редактирование
Форма констант
Просмотр
Справочники:
Марки автомобилей
Чтение, просмотр
Модели автомобилей
Опции
Автомобили
Гаражи
Свойства гаражей
Тип топлива
Полные
Поставщик топлива
Документы
Прибытие в гараж
Чтение, просмотр
Выбытие из гаража
Заправка топлива
Полные
Отчет о расходе топлива
Установка цен на топливо
Журналы документов
Прибытие-выбытие автомобилей Чтение, просмотр
ПВХ
Дополнительные свойства
Чтение, просмотр
гаражей
Регистры сведений
Основной гараж автомобиля
Чтение, просмотр
Значение свойств гаражей
Цены на топлива
Полные
Регистры накопления
Пробег автомобиля
Чтение, просмотр
Топливо в автомобилях
Полные
Константы
Все константы
Чтение, просмотр
Ветка «Общие»
Параметры сеанса
Получение, установка
Общие реквизиты
Просмотр, редактирование
Форма констант
Просмотр
Табл. 4.1.2

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

231

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.172
У нас сразу же откроется палитра свойств роли и конструктор прав.

Рис. 4.1.173
Новую роль назовем ПолныеПрава. Для того, чтобы установить у этой роли права на все
объекты, воспользуемся меню «Действия» конструктора прав, где нажмем на пункт «Установить
все права».

232

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.175
В списке прав конфигурации установим все права (флаг «Отметить все элементы»).

233

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.176
Всё! Роль с полными правами создана. Теперь создадим пользователя с полными
правами. Перед этим необходимо обновить конфигурацию базы данных.
Для создания пользователя базы данных в конфигураторе нужно войти в список
пользователей. Список пользователей доступен по следующему пути: «Главное меню» –
«Администрирование» – «Пользователи».

Рис. 4.1.177

234

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.178
Введем имя «Администратор», все остальное оставим как есть и перейдем на закладку
«Прочее».

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

Рис. 4.1.180

235

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.181
Теперь необходимо для ряда объектов установить полные права (см. табл. 4.1.2), а для
ряда – урезанные: только для чтения и просмотра.
В рамках этой книги мы не будем подробно разбирать смысл того или иного права,
изучим только общие моменты.

Установим у роли «Диспетчер» для справочника «Марки автомобилей» полные права
(кроме интерактивного удаления). Найдем нужный справочник в дереве конфигурации
конструктора прав роли.

236

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.183

237

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.184
А для справочника «Тип топлива» дадим права только на чтение и просмотр, в этом случае
будет следующий набор прав:

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

238

Низамутдинов Ильяс

Глава 4. Основы конфигурирования
Общие картинки

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

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

Рис. 4.1. 187
После выбора картинка появится в конструкторе.

239

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.188
И соответствующий пункт появится в ветке «Общие картинки».

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

240

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Учет топлива

НСИ

Объект конфигурации
Справочники:
Марки автомобилей
Модели автомобилей
Опции
Автомобиль
Гаражи
Свойства гаражей
Документы:
Прибытие в гараж
Выбытие из гаража
Журнал:
Прибытие-выбытие автомобилей
Планы видов характеристик:
Дополнительные свойства гаражей
Регистры сведений:
Основной гараж автомобиля
Значение свойств гаражей
Регистры накопления:
Пробег автомобиля
Справочники:
Тип топлива
Поставщик топлива
Документы:
Заправка топлива
Отчет о расходе топлива
Установка цен на топливо
Регистры сведений:
Цены на топливо
Регистры накопления:
Топливо в автомобилях
Справочники:
Марки автомобилей
Модели автомобилей
Опции
Автомобиль
Гаражи
Свойства гаражей
Тип топлива
Поставщик топлива
Планы видов характеристик:
Дополнительные свойства гаражей
Регистры сведений:
Основной гараж автомобиля
Значение свойств гаражей
Константы и форма констант, перечисления,
общие картинки, параметры сеанса,
предопределяемые типы, роли
Табл. 4.1.3

241

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.190
Откроется окно редактора подсистем, где мы вводим название и, самое главное,
оставляем включенным флаг «Включать в командный интерфейс».

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

242

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Рис. 4.1.194

243

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.1.195
Для отображения разделов необходимо добавить соответствующую панель.

Рис. 4.1.196

244

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.1.197

Рис. 4.1.198

245

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

246

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Локальные и глобальные переменные
Рассмотрим такое важное понятие в языке программирования, как Локальные и
Глобальные переменные.
Что такое Локальные переменные? Это любые переменные, описанные внутри процедуры
или функции. Как задаются переменные внутри процедур и функций, мы знаем: либо через слово
Перем, либо если переменной сразу будет присвоено какое-нибудь значение (см. листинг 4.2.1).
Процедура НашаПроцедура()
Перем А,Б;
В = 10;
Г = "Привет, мир!"
КонецПроцедуры

Листинг 4.2.1
В листинге 4.2.1 переменные А и Б заданы явным способом, а В через значение.
Локальные переменные создаются при запуске процедуры или функции и уничтожаются, когда
процедура или функция заканчивает свою работу. Т.е. Вы не сможете к переменным, заданным в
процедуре НашаПроцедура, обратиться в другой процедуре или просто в модуле.
Теперь - как задать переменные глобально. Рассмотрим пример в рамках модуля формы
(создайте новую обработку и форму). Для этого в самом верху модуля формы пишем слово Перем
и перечисляем переменные через запятую, а в конце пишем точку с запятой. Так же, как и в случае
процедур или функций, в модуле формы управляемого приложения перед переменными
необходимо указывать директивы компиляции &НаКлиенте или &НаСервере. В этой части все
переменные и методы в модуле формы будут выполняться в клиентском контексте (под
директивой &НаКлиенте).
Директивы компиляции будем изучать в пятой главе.
Смотрите листинг 4.2.1. Переменные А,Б,В – заданы локально, а переменные А0,Б0,В0 –
глобально.

247

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

&НаКлиенте
Перем А0, Б0;
&НаКлиенте
Перем В0;
&НаКлиенте
Процедура НашаПроцедура()
Перем А,Б;
В = 100;
КонецПроцедуры

Листинг 4.2.2
После того, как мы задали глобальные переменные в начале модуля, мы можем
обращаться к ним в любой процедуре или функции модуля. Выполните пример с листинга 4.2.3.
Самостоятельно создайте команду и обработчик команды в модуле формы.
&НаКлиенте
Перем А, Б;
&НаКлиенте
Процедура ИзменитьЗначенияПеременных()
А = А + 100;
Б = А;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
Сообщить("А = " + А);
Сообщить("Б = " + Б);
ИзменитьЗначенияПеременных();
Сообщить("А = " + А);
Сообщить("Б = " + Б);
КонецПроцедуры
А = 10;
Б = -100;

Листинг 4.2.3
Разберем данный код. В начале нашего модуля мы задаем переменные А и Б. В конце
модуля присваиваем им значения. Почему значения присваиваются в конце модуля? Потому что
процедуры и функции должны описываться непосредственно перед кодом, который пишется в
самом модуле. Да, в модуле формы мы можем написать почти любой код, и он выполнится во
время открытия формы.
После мы создаем процедуру ИзменитьЗначенияПеременных, в которой манипулируем с
нашими переменными. И в обработчике команды ВыполнитьКоманду работаем с нашими
глобальными переменными.

248

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.2.1
Т.е. сначала переменные А и Б были такими, какими Вы задали их в конце модуля, но
после выполнения процедуры ИзменитьЗначенияПеременных они изменились.
А что будет, если имея глобальную переменную, внутри процедуры или функции задать
локальную переменную с таким же именем?
Выполните пример из листинга 4.2.4, и Вы увидите, что как А была равна 1, так и осталась.
Потому что, задав явно переменную внутри процедуры, мы создали локальную переменную,
пусть с тем же названием, но абсолютно другую. Как только процедура выполнилась, данная
локальная переменная уничтожилась.
Задание локальных переменных работает только в том случае, если Вы ее задали
именно явно, через ключевое слово Перем.
&НаКлиенте
Перем А;
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
Сообщить("А = " + А);
ИзменитьПеременную();
Сообщить("А = " + А);
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьПеременную()
Перем А;
А = 10000;
КонецПроцедуры
А = 1;

Листинг 4.2.4

Рис. 4.2.2

249

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

250

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.2.3
А чтобы увидеть список всех процедур и функций модуля формы, необходимо
сфокусироваться на модуле формы и выполнить команду «Процедуры и функции» в меню «Текст»
(«Главное меню» – «Текст»).

Рис. 4.2.4

251

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

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

252

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.2.6
Для внешних отчетов и обработок: находясь непосредственно в менеджере обработки,
нажимаем на кнопку «Действия» и выбираем «Модуль объекта».

Рис. 4.2.7

253

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.2.8
Вы увидите все имеющиеся процедуры.

Рис. 4.2.9
Значками в левой части списка будут обозначены уже созданные процедуры и функции (в
том числе обработчики событий), а треугольными скобками (< >) выделяются еще не созданные
обработчики событий объекта.
Если Вам надо будет создать какую-нибудь процедуру обработчик события, просто
выберите ее в этом списке и дважды кликните левой клавишей мышки.
Обращаю Ваше внимание, что для документов и справочников, если Вы будете делать
какие-нибудь проверки при записи объекта или проверки на заполнение реквизитов при
сохранении объекта, делайте это все на уровне объекта, а не формы. Поскольку возможны
случаи, когда Вам придется записывать этот документ программно, и тогда Ваша проверка
на форме не сработает.

254

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

В случае, когда процедура печати в модуле объекта, код для печати будет выглядеть так:
ОбъектСправочника = СправочникСсылка.ПолучитьОбъект();
ОбъектСправочника.Печать();

А когда процедура печати в модуле менеджера объекта, код будет следующий:
Документы.ВыбытиеИзГаража.Печать(СсылкаНаДокумент);

4.2.11).

Получить доступ в модуль менеджера объекта можно двумя способами (см. рис. 4.2.10 и

Рис. 4.2.10

255

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Общие модули
Общие модули можно найти в отдельной ветке конфигурации:

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

256

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.2.13
Модуль будет создан и сразу же откроется окно свойств, где мы можем назвать его какимнибудь именем (назовете его Основной) и установить некоторые настройки модуля.

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

257

Низамутдинов Ильяс

Глава 4. Основы конфигурирования
Основной.ПроцедураРасчета();

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

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

258

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

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

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

259

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

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

260

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

Рис. 4.2.18
В открывшемся окне выделяем единственную процедуру и нажимаем кнопку «Перейти».

Рис. 4.2.19
Будет создана процедура «УстановкаПараметровСеанса»

Рис. 4.2.20
Напишем в новой процедуре следующий код:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
ПараметрыСеанса.ИмяТекущегоКомпьютера = ИмяКомпьютера();
КонецПроцедуры

Листинг 4.2.5

261

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Рис. 4.2.21

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

262

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.2.22
Второй. Зайти в палитру свойств конфигурации и нажать на гиперссылку «Открыть»
свойства «Модуль управляемого приложения».

Рис. 4.2.23

263

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

Листинг 4.2.7
Вы видите, что у метода ПередНачаломРаботыСистемы есть параметр «Отказ», это
значит, что у нас есть возможность отказаться от запуска программы. В этот метод можно ставить
различные проверки (например, проверка лицензирования программы).

264

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Листинг 4.2.8
Метод ПередЗавершениемРаботыСистемы возникает перед завершением работы
управляемого приложения до закрытия главного окна. В этом методе есть параметр Отказ,
который имеет тип Булево. Если данному параметру установить значение Истина, то работа
программы не будет завершена.
Метод ПриЗавершенииРаботыСистемы вызывается самым последним. В этом методе
необходимо выполнять действия, которые необходимы при выходе из программы: запись логов и
т.п.

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

Рис. 4.2.26

265

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

МодульЧисла = ?(ЧислоПодКоронем >= 0, ЧислоПодКорнем,ЧислоПодКорнем*(-

Возврат Sqrt(МодульЧисла);
КонецФункции

Листинг 4.2.9
Естественно, возникнет вопрос: как обратиться к этой функции на какой-либо форме? Для
этого необходимо сделать функцию экспортной. Осуществляется это посредством написания
слова Экспорт после параметров, функция должна выглядеть так:

Функция КореньМодуляЧисла(ЧислоПодКорнем) Экспорт
1));

МодульЧисла = ?(ЧислоПодКоронем >= 0, ЧислоПодКорнем,ЧислоПодКорнем*(-

Возврат Sqrt(МодульЧисла);
КонецФункции

Листинг 4.2.10
Теперь создадим обработку, в которой будем вычислять квадратный корень модуля числа,
используя функцию из общего модуля. Сделайте все как Вы уже умеете: создайте обработку,
форму, команду формы (разместите её на форме), а также обработчик для этой команды. Перед
этим не забудьте сохранить конфигурацию и обновить Вашу базу данных.
В обработчике команды будем получать некоторое число при помощи метода
«ВвестиЧисло», вычислять корень этого числа и выводить сообщение.
&НаКлиенте
Процедура ВычислитьКореньЧисла(Команда)
Перем ЧислоПодКорнем;
Если ВвестиЧисло(ЧислоПодКорнем,"Введите число") Тогда
КореньЧисла =
МатематическиеВычисления.КореньМодуляЧисла(ЧислоПодКорнем);
Сообщить(Окр(КореньЧисла,2));
КонецЕсли;
КонецПроцедуры

Листинг 4.2.11

266

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

Рис. 4.2.27
Экспорт переменных осуществляется точно так же, как экспорт функций и процедур:
задается переменная в начале модуля и после описания переменной пишется слово Экспорт,
после ставится точка с запятой.
Создадим в модуле управляемого приложения переменную «РазрядностьПоУмолчанию»,
в которой будем указывать число знаков дробной части при округлении. Присваивать значение
этой переменной будем в процедуре ПриНачалеРаботыСистемы (см. листинг 4.2.12).
Перем РаздрядностьПоУмолчанию Экспорт;
Процедура ПриНачалеРаботыСистемы()
РаздрядностьПоУмолчанию = 3;
КонецПроцедуры

Листинг 4.2.12
Переделаем код из листинга 4.2.11:
&НаКлиенте
Процедура ВычислитьКореньЧисла(Команда)
Перем ЧислоПодКорнем;
Если ВвестиЧисло(ЧислоПодКорнем,"Введите число") Тогда
КореньЧисла =
МатематическиеВычисления.КореньМодуляЧисла(ЧислоПодКорнем);
Сообщить(Окр(КореньЧисла,РаздрядностьПоУмолчанию));
КонецЕсли;
КонецПроцедуры

Листинг 4.2.13

267

Низамутдинов Ильяс

Глава 4. Основы конфигурирования

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

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

268

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

Основные формы объектов
У всех объектов есть определенный перечень основных форм. Причем количество и состав
основных форм может отличаться в зависимости от прототипа объекта. Например, у справочников
это – форма элемента, форма списка, форма группы, форма выбора и форма выбора группы
(причем, форма группы и форма выбора группы будут доступны только иерархическим
справочникам!). А у документов – форма документа, форма списка и форма выбора. По сути, для
каждого типа формы должна быть одна основная форма. Но в то же время форм одного типа
может быть несколько. Например, можно создать несколько форм списков справочника
Автомобили и выбрать одну из этих форм основной.
Для чего необходимо устанавливать основные формы объекта? Основная форма всегда
будет отображаться пользователю при выполнении стандартных команд (команды, которые
определяют основные действия с объектом (подробнее см. «Основы разработки в 1С: Такси»,
часть 2, глава 2). Говоря простым языком: основная форма будет всегда открываться по
умолчанию из интерфейса «1С:Предприятия». Например, основная форма списка справочника
Автомобили отобразится, когда будет выполнена стандартная команда навигации, которая
открывает форму списка номенклатуры (см. рис. 5.1.1).

269

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.1.2
На рис. 5.1.2 все поля основных форм пустые, потому что для справочника
«Автомобили» не была создана ни одна форма.

270

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Создание новых форм
Что такое основные формы, мы узнали. Теперь научимся создавать различные типы форм.
Начнем мы с форм справочников и документов. Все формы создаются с помощью конструктора
форм. Для каждого прототипа объекта (документы, справочники и т.д.) есть свой конструктор
форм. Для документов – конструктор форм документов, для справочников – конструктор форм
справочников и т.д. Вызвать этот конструктор можно несколькими способами (см. рис. 5.1.3, 5.1.4,
5.1.5), но в любом случае вызывать его нужно из того объекта, для которого Вы создаете форму.
Рассмотрим три способа вызова конструктора:
1) В дереве конфигурации выделить узел «Формы» ветки нужного объекта, вызвать
контекстное меню и нажать кнопку «Добавить» (см. рис. 5.1.3);
2) В дереве конфигурации выделить нужный объект, вызвать контекстное меню, найти
подменю «Добавить» и в этом подменю нажать на кнопку «Форма» (см. рис. 5.1.4);
3) В редакторе объекта, на закладке «Формы», в дереве форм нажать кнопку «Добавить»
(см. рис. 5.1.5).

Рис. 5.1.3

Рис. 5.1.4

271

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.1.5
После вызова откроется конструктор формы. Для разных типов объектов конструктор
может быть разной формы. Например, на рис. 5.1.6 представлен конструктор формы для
справочника, а на рис. 5.1.7 – для документа.

Рис. 5.1.6

Рис. 5.1.7

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

272

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

273

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.1.9
Обратите внимание: после того, как мы создали форму элемента, в свойство «Основная
форма документа» записалась наша вновь созданная форма (см. рис. 5.1.10).

Рис. 5.1.10
Вы можете создавать какое угодно количество форм справочников и документов разных
типов. Платформа также предоставляет возможность создания форм копированием. Для этого
нужно выделить нужную форму, вызвать контекстное меню и в этом контекстном меню выбрать
пункт «Копировать» (см. рис. 5.1.11). После этого будет создана новая форма, аналог
скопированной, но под другим именем (см. рис. 5.1.12). В этом случае редактор создания форм
открываться не будет. И новая форма не станет основной. Если разработчик желает сделать новую
форму основной, то ему необходимо перевыбрать форму в соответствующем поле закладки
формы редактора объекта (см. рис. 5.1.13).

274

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.1.11

Рис. 5.1.12

Рис. 5.1.13
С созданием форм все. Создайте самостоятельно форму справочника «Автомобили». А
после приступайте ко второй части этой главы, где мы будем изучать командный интерфейс
формы.

275

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

276

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

277

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.2.2
Посмотрим, что из себя представляют эти объекты на форме в пользовательском виде (см.
рис. 5.2.3).
Для того, чтобы появилась панель навигации на форме, необходимо установить флаг
«Видимость» для ветки «Цены на топливо» узла «Панель навигации» (см. рис. 5.2.2).

Рис. 5.2.3. Панель навигации и командная панель на
форме (1 – панель навигации, 2 - командная панель)
В закладке «Командный интерфейс» формы помимо колонки, где расположены узлы
панель навигации и командная панель, есть еще три колонки - «Видимость», «Автовидимость» и
«Автоположение». Разберем, для чего они нужны.
При установке флажка в колонке «Видимость» команда, для которой поставлен этот флаг,
будет однозначно всегда показываться на форме (если у пользователя есть соответствующее
право).

278

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

Рис. 5.2.5

279

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.2.6
Установим флаг Видимость (флаг Автовидимость автоматически снимется), сохраним
конфигурацию, обновим базу данных и посмотрим на панель навигации формы документа
Прибытие в гараж:

Рис. 5.2.7
Как Вы видите, в панели навигации формы документа Прибытие в гараж появилась
ссылка, по которой можно увидеть движения этого документа по регистру накопления Пробег
автомобиля.

280

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.2.8
Если в панели навигации мы можем размещать только команды навигации (глобальные),
то в командной панели (см. рис. 5.2.9) формы мы можем размещать исключительно команды
действия (создания на основании, печать отчетов и т.п.). Это могут быть как глобальные команды,
так и локальные.

Рис. 5.2.9
В предыдущей главе мы создали возможность ввода документа Прибытие в гараж на
основании документа Выбытие из гаража (см. стр. 182). Поэтому в командную панель формы
автоматически должна добавиться глобальная команда создания на основании (см. рис. 5.2.10).

Рис. 5.2.10
Обратите внимание: флаг «Видимость» для команды создания на основании
устанавливается автоматически.

281

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Подробно о принципах формирования панели навигации и командной панели см. 2-ю
часть книги «Основы разработки в 1С: Такси».

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

Рис. 5.2.11
В открывшемся конструкторе оставим переключатель на «Форма элементов справочника»,
а флаг «Назначить форму основной» оставим включенным.
Больше нам ничего от этого конструктора не нужно. Нажмем кнопку «Готово».
Во вновь созданной форме сразу перейдем на закладку «Командный интерфейс» и
увидим, что в панели навигации, в группе «Перейти» уже есть команда, для которой, кстати,
видимость по умолчанию включена (см. рис. 5.2.12). Разберемся, почему эта команда попала в
панель навигации.

Рис. 5.2.12

282

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.2.13
Объекты и ссылки на объекты будем изучать в следующей главе.
Почему же добавилась команда на открытие формы списка с отбором по регистратору
регистра накопления ПробегАвтомобиля на форму элемента документа ПрибытиеВГараж?
Потому что документ ПрибытиеВГараж является регистратором вышеупомянутого регистра и
поэтому существует стандартная параметризируемая глобальная команда на открытие формы
списка регистра накопления с отбором по регистратору, которая и добавилась в командный
интерфейс формы документа (с выключенной по умолчанию видимостью). Создайте
самостоятельно формы документов ЗаправкаТоплива и ОтчетОРасходеТоплива, и в командном
интерфейсе формы Вы обнаружите глобальную параметризируемую команду на открытие формы
списка регистра накопления ТопливоВАвтомобилях с отбором по регистратору (см. рис. 5.2.14).
Регистратор - это ссылка на документ, форма которого будет открыта.

Рис. 5.2.14

283

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

Рис. 5.2.16

284

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.2.17
В закладке Команды формы перечислены команды, созданные разработчиком
самостоятельно. Разработчик может создать собственную локальную команду формы. Для этого
необходимо на закладке Команды формы нажать на кнопку «Добавить» (+), после этого вновь
созданная команда отобразится в списке и справа появится палитра свойств новой команды (см.
рис. 5.2.18).

Рис. 5.2.18
В этой палитре свойств пользователь может изменить имя команды (имена должны быть
уникальны в пределах формы), установить картинку, заголовок, но самое главное - это привязать
какое-то действие к команде.
Назовем нашу команду «ВывестиСообщение».

Рис. 5.2.19

285

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

В свойстве Действие указывается процедура, которая должна сработать, когда
пользователь выполнит команду. Можно выбрать имеющуюся процедуру, а можно создать
новую, нажав на кнопку «Лупа» свойства «Действие» (см. рис. 5.2.20).

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

Рис. 5.2.21

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

286

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.2.23

Рис. 5.2.24
После размещения кнопка, соответствующая команде, появится или на командной панели
(см. рис. 5.2.25), или среди элементов формы (см. рис. 5.2.26).

Рис. 5.2.25

287

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.2.26
При нажатии на эту кнопку выполнится код, который описан в процедуре, указанной в
свойстве Действие связанной с этой кнопкой команды.

Рис. 5.2.27

288

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

289

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Создадим несколько разных реквизитов для основной формы документа
УстановкаЦенНаТопливо. Для того чтобы создать новый реквизит, необходимо нажать на кнопку
«Добавить реквизит» закладки реквизитов (см. рис. 5.3.2).

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

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

290

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.4
Замечу, что при присвоении реквизиту формы таких типов, как ссылки, объекты и т.п.,
реквизит в окне отобразится в виде дерева. Где корнем будет название реквизита, а ветками этого
дерева – реквизиты объекта выбранного типа.
Например, на рисунке 5.3.5 мы назначили новому реквизиту тип
«ДокументСсылка.УстановкаЦенНаТопливо». И в списке реквизитов можно увидеть, что
«Реквизит1» приобрел древовидную структуру, где в ветках дерева можно наблюдать реквизиты
и табличную часть документа Установка цен на топливо.

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

291

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.6
Вернемся к свойствам реквизитов (см. рис. 5.3.7). Следующим после типа идет свойство
«Сохраняемые данные». Если это свойство установлено, то при попытке редактирования
элемента, связанного с этим реквизитом, будет установлен признак модифицированности формы
(символ * рядом с названием).

Рис. 5.3.7
Ещё одно интересное свойство – это «Проверка заполнения» (см. рис. 5.3.8).

292

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

293

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

294

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.11. Элементы формы (1) и вид формы (2)
Для тех, кто работал с обычными формами: нельзя работать с элементами формы
(перемещать, удалять, растягивать и т.п.) непосредственно в графическом отображении
формы. Вся работа с элементами ведется в закладке «Элементы».
Всего существует несколько видов элементов:








Форма;
Поле формы;
Группа формы;
Декорация формы;
Таблица формы;
Кнопка формы;
Командные панели.

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

Рис. 5.3.12

295

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Кнопка Добавить – первая кнопка на командной панели (см. рис. 5.3.12). При нажатии на
неё открывается окно с выбором типа элемента (см. рис. 5.3.13).

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

296

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.14
время.

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

Элемент форма
Самый главный элемент, без которого не обходится ни одна форма, это элемент «Форма».
Данный элемент всегда располагается в верхней части дерева элементов и является родителем
для всех элементов формы (см. рис. 5.3.15).

Рис. 5.3.15

297

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

298

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.17
Если используется режим Блокировать окно владельца (см. рис. 5.3.18), то форма
открывается «поверх» окна, где было инициировано её открытие. Блокирует это окно, но в то же
время пользователь сможет спокойно осуществлять навигацию по всему интерфейсу.

Рис. 5.3.18
Например, на рис. 5.3.19 мы открыли форму документа УстановкаЦенНаТопливо из
списка документов с режимом Блокировать окно владельца. У нас есть возможность
перемещаться по интерфейсу, открыть еще одно окно, но чтобы вернутся в список документов,
необходимо закрыть окно документа.

299

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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





Формы элементов и групп справочников
Формы элементов и групп планов видов характеристик
Форма счета
Форма задачи и т.д.

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

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

300

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

таблице формы (эту группу мы изучим, когда будем проходить таблицы на форме, см. глава 8,
часть 1, стр. 509).

Рис. 5.3.20

Обычная группа (обычная группа без отображения)
Добавим на нашу форму документа УстановкаЦенНаТопливо обычную группу.

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

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

301

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

и «тащится» в группу. Я перенесу в группу элементы «Номер» и «Дата», и на рис. 5.3.23 можно
увидеть, как это отобразится на нашей форме.

Рис. 5.3.23
Элементы в «Группа1» расположились согласно свойствам группы по умолчанию. Сейчас
мы перейдем в палитру свойств группы и узнаем, какие свойства за что отвечают. Для того, чтобы
перейти в палитру свойств группы, необходимо или дважды кликнуть мышкой по группе, или в
контекстном меню группы выбрать пункт «Свойства». В открывшейся палитре (см. рис. 5.3.24) нас
в основном интересуют свойства из закладки «Основные».

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

302

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.3.25
Зададим заголовок группы, назовем её «Номер и дата» (см. рис. 5.3.26).

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

Рис. 5.3.27
Объем этой книги не позволяет изучить все свойства групп, да и на данном этапе обучения
это не нужно. Пока научитесь работать со свойствами «Вид» (о других значениях позже),
«Группировка», «Заголовок» и «Отображать заголовок».

303

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами
Страницы

Рассмотрим следующий очень интересный вид группы - это страницы. С помощью этой
группы можно создавать различного рода закладки и размещать по ним элементы. Например,
нашу форму документа УстановкаЦенНаТопливо можно реализовать в таком виде:

Рис. 5.3.28

Рис. 5.3.29

Реализуем интерфейс формы документа УстановкаЦенНаТопливо с закладками как на
рис. 5.3.28 и 5.3.29. Поставим курсор на узел «Форма», нажмем на кнопку «Добавить» командной
панели закладки «Элементы» и выберем элемент с названием «Группа - Страницы» (см. рис.
5.3.30)

Рис. 5.3.30
После этого в дереве «Форма» закладки Элементы добавится строка с уже знакомой Вам
пиктограммой «папка». Только свойство Вид этой группы будет Страницы (см. рис. 5.3.31).

Рис. 5.3.31

304

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.3.32
Подобные действия нужно осуществить столько раз, сколько страниц в группе Вы хотите
сделать (в нашем случае две). После этого элемент Группа2 в дереве формы приобретет
иерархический вид (см. рис. 5.3.33, самостоятельно переместите элемент Группа2 в верх формы).

Рис. 5.3.33
Обратите внимание, что в группах с видом «Страница» тоже можно устанавливать
различные группировки с помощью свойства «Группировка» (см. рис. 5.3.34).

Рис. 5.3.34

305

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Нам осталось с помощью мышки «перетащить» нужные элементы по нужным страницам,
и наша форма примет вид почти как на рис. 5.3.28 и 5.3.29

Рис. 5.3.35
Вы заметили, что на рис. 5.3.35 наша группа без страниц. Это потому, что мы не задали
заголовки элементам Группа3 и Группа4. Дадим имя заголовку элемента Группа3 – «Шапка» (см.
рис. 5.3.36), а Группа4 – «Таблица». После этого наша таблица примет более красивый вид (см.
рис. 5.3.37).

Рис. 5.3.36

Рис. 5.3.37

306

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами
Командная панель

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

Рис. 5.3.38
Добавим новую группу с видом Командная панель в страницу Шапка. Для этого
необходимо установить курсор на элемент Группа3 (поскольку именно он является закладкой
Шапка) и нажать на кнопку «Добавить» (см. рис. 5.3.39).

Рис. 5.3.39
После добавления новой группы, переместите её вверх над элементом Группа1.
В открывшейся палитре свойств добавленной группы нам нужно указать источник команд.
В нашем случае три источника, это команды формы, глобальные команды командной панели
формы и команды таблицы «Цены топлива» (см. рис. 5.3.40). Мы выберем источник – «Форма». И
после этих действий наша группа сразу же заполнится стандартными командами формы (см. рис.
5.3.41).

307

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.40

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

Для дальнейшей работы самостоятельно приведите форму в первоначальный вид.

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

308

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.42
Второй способ заключается в перетаскивании нужного реквизита из закладки «Реквизиты»
на форму или в группу формы (см. рис. 5.3.43).

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

Рис. 5.3.44
При простом добавлении поля ввода (первый способ) на отображении формы никакое
поле не появится. Так произойдет потому, что свойство ПутьКДанным элемента формы Поле не
заполнено (см. рис. 5.3.45). Если же мы будем перетаскивать реквизит формы, то это свойство
заполнится автоматически (см. рис. 5.3.46), и как следствие он сразу отобразится на экране.

309

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.45

Рис. 5.3.46
Разработчик имеет возможность самостоятельно отредактировать свойство ПутьКДанным
поля: можно выбрать или реквизит формы или, если у реквизита формы ссылочный (объектный)
тип, реквизит реквизита формы (см. рис. 5.3.47).

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

310

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами
Вид «Поле ввода»

И самый нужный вид элемента Поле это – Поле ввода (см. рис. 5.3.48). С помощью поля с
этим видом мы можем вводить практически любые значения: примитивные (строка, число, дата,
булево) и ссылочные (ссылка на справочники, документы и т.д.).

Рис. 5.3.48
Внешний вид поля на форме будет зависеть от того, какой тип имеет реквизит, указанный
в свойстве поля ПутьКДанным. Для реквизита с типом строка внешний вид поля показан на рис.
5.3.49. Для типов число, булево и дата – на рис. 5.3.50, 5.3.51, 5.3.52. А для ссылочного типа
(«СправочникСсылка.ТипыТоплива») – на рис. 5.3.53.

Рис. 5.3.49

Рис. 5.3.50

Рис. 5.3.51

311

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.52

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

Рис. 5.3.54
Еще одна интересная возможность Поля с типом Поле ввода - это возможность выбирать
какие-либо значения из заранее созданного списка. Для реализации такой возможности нам
понадобятся два свойства, это – РежимВыбораИзСписка, его нужно включить, и свойство
СписокВыбора. После нажатия на кнопку «…» свойства СписокВыбора откроется окно, в которое
можно внести все варианты выбора (см. рис. 5.3.55).

312

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.3.56

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

313

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.57
Реквизит «ЦеныТоплива» с текущими данными в окне выбора реквизитов будет только
тогда, когда на форме размещена таблица «ЦеныТоплива».
Установим свойства Заголовок и Вид (см. рис. 5.3.58).

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

Рис. 5.3.59

314

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами
Вид «Поле флажка»

Для реквизитов с типом Булево можно задать два вида поля – Поле ввода и Поле флажка.
Как выглядит поле ввода для реквизита с типом Булево можно посмотреть на рис. 5.3.60.

Рис. 5.3.60
Такой вариант интерфейса применим, но не всегда удобен, гораздо практичнее
использовать вид поля – Поле флажка (см. рис. 5.3.61).

Рис. 5.3.61
В этом случае поле приобретает более компактный вид.
Но самое интересное, можно установить два вида флажка, это вид – Флажок, который Вы
видите на рис. 5.3.61 и вид «Тумблер» (см. рис. 5.3.62).

Рис. 5.3.62
Такой вид флажка более удобен для восприятия пользователя. Надписи Истина и Ложь
можно заменить более понятными с помощью свойства поля флажка ФорматРедактирования.
После нажатия на кнопку «…» этого свойства откроется конструктор редактирования форматной
строки, где на закладке «Булево» можно задать представление значений Истина и Ложь (см. рис.
5.3.63).

315

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.3.64

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

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

316

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.66
Чтобы узнать программно, какое значение выбрано, достаточно прочитать реквизит
формы. Позже (см. стр. 387) мы узнаем, как это делать.
С помощью свойства КоличествоКолонок можно задать различные расположение
переключателя на форме (см. рис. 5.3.67 и 5.3.68). Если свойство КоличествоКолонок равно 0, то
все переключатели идут в один ряд в зависимости от места на форме.

Рис. 5.3.67

Рис. 5.3.68
И точно так же, как и в случае с флажком, у переключателя есть свойство
ВидПереключетеля, которое может принимать три значения – Авто, Переключатель и Тумблер.
Отображение переключателя с видом Тумблер на форме в конфигураторе (см. рис. 5.3.69)
и в «1С:Предприятии» такое же, как и для флажка.

317

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

Рис. 5.3.70
Второй способ: перетащить команду на форму (см. рис. 5.3.71).

Рис. 5.3.71

318

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.3.72

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

319

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.74
Привяжем вновь созданную кнопку к локальной команде формы Команда1. Из рис. 5.3.75
Вы видите, что кнопка на форме отобразилась. Она будет и в пользовательском режиме. Просто
при нажатии на неё не произойдет никаких действий.

Рис. 5.3.75
Разберем основные и самые интересные свойства элемента Кнопка. И самое первое
свойство это Вид. У кнопки есть два вида, это «Обычная кнопка» (см. рис. 5.3.75) и «Гиперссылка»
(см. рис. 5.3.76).

Рис. 5.3.76
Обычно на кнопке какой-нибудь текст. Этот текст берется или из имени команды, которая
привязана к кнопке, или из свойства Заголовок команды (если оно заполнено), или из свойства
Заголовок кнопки (если оно заполнено).

320

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

Рис. 5.3.78
И нам осталось сделать так, чтобы наша команда работала. Для этого в палитре свойств
команды нажмем на пиктограмму «Лупа» свойства Действие и в открывшемся окне выбора
вариантов оставим переключатель на варианте «Создать на клиенте» (см. рис. 5.3.79).

321

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.79
В созданной автоматически процедуре на клиенте напишем код, который просто выведет
сообщение.
&НаКлиенте
Процедура Команда1(Команда)
Сообщить("Эмуляция печати");
КонецПроцедуры

Листинг 5.3.1
Сохраним конфигурацию, перезапустим «1С:Предприятие» и посмотрим, как отрабатывает
наша кнопка (см. рис. 5.3.80).

Рис. 5.3.80

322

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.3.81
Элемент Декорация имеет два вида, это Надпись и Картинка. Когда выбираете тип
«Декорация - надпись» или «Декорация - картинка», то свойство Вид уже заполнено, но его
можно при необходимости поменять (см. рис. 5.3.82)

Рис. 5.3.82
Если выбран вид «Надпись», то в свойстве «Заголовок» можно написать любое сообщение.
Причем у свойства есть кнопка «Лупа», нажав на которую, откроется окно ввода строки, где
можно ввести как обычную строку (см. рис. 5.3.83), так и форматированную (см. рис. 5.3.84 и
5.3.85).

323

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.83

Рис. 5.3.84

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

324

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

Рис. 5.3.87
Теперь Вам просто нужно выбрать или общую картинку из конфигурации (закладки «Из
библиотеки» - «Из конфигурации»), или стандартную картинку, или загрузить картинку из
файловой системы. Выберем картинку из конфигурации (см. рис. 5.3.88).

325

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.3.88
Самостоятельно при помощи группы (или групп) разместите декорации следующим
образом (см. рис. 5.3.89).

Рис. 5.3.89
На этом мы закончим изучать элементы формы. В дальнейшем при углублении материала
мы изучим еще один нужный элемент – «Таблица».

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

Клиент-серверная архитектура
Принцип работы «1С:Предприятия 8.3» под управляемым приложением имеет клиентсерверный характер. Не будем углубляться в дебри, отмечу только, что это значит, что какой-то
код выполняется в контексте сервера, а какой-то код в контексте клиента. Причем, при разработке
управляемого приложения, разделение контекста выполнения программного кода на клиентский
и серверный стало очень критичным. Узнаем, что означает клиентский контекст выполнения кода,
а что - серверный.
Для этого рассмотрим классическую трехзвенную архитектуру «1С:Предприятия». У Вас
есть клиентские компьютеры, где работают все пользователи, есть кластер серверов
«1С:Предприятия», где выполняются все вычисления, и есть SQL-база (СУБД), где хранятся все
данные (см. рис. 5.4.1).

326

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

327

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

328

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

329

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.4.4
Т.е. та же ТаблицаЗначений вполне работает в клиентском контексте, но только в режиме
толстого клиента.
Что же из себя представляет форма в клиент-серверном понимании? Форма - это
программный объект, который создается на сервере согласно настройкам, сделанным в
конфигураторе (если формы нет в конфигураторе, то она генерируется автоматически
платформой), а потом выводится в клиентском приложении. Таким образом, форма

330

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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






&НаКлиенте
&НаСервере
&НаСервереБезКонтекста
&НаКлиентеНаСервереБезКонтекста
&НаКлиентеНаСервере

В этой книге мы изучим только первые три директивы.
&НаКлиенте – когда процедура или функция предварена этой директивой, то данный метод будет
выполняться в клиентском контексте. Это значит, что он будет выполняться на той машине, где в
данный момент функционирует клиентское приложение. Из такой процедуры или функции будут
доступны все данные формы, а также из неё можно вызывать любую процедуру или функцию
текущего модуля. Под этой директивой будет доступен весь клиентский контекст формы, т.е. мы
можем вызывать любые функции под директивой &НаКлиенте.
Все обработчики команд всегда выполняются на клиенте. Для того, чтобы проверить это,
разместите на любой форме (я для этой цели создал новую обработку) произвольную команду (я
её назвал «Нажатие кнопки») и нажмите на кнопку «Лупа» свойства «Действие» этой команды
(см. рис. 5.4.5).

Рис. 5.4.5

331

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.4.6
Мы выберем пункт «Создать на клиенте», и после нажатия кнопки «ОК» в модуле формы
автоматически появится код, как на листинге 5.4.1.
&НаКлиенте
Процедура НажатиеКнопки(Команда)
// Вставить содержимое обработчика.
КонецПроцедуры

Листинг 5.4.1

Имейте в виду, все обработчики элементов формы должны всегда выполняться под этой
директивой (см. листинг 5.4.1). Другими словами обработка событий всех элементов формы имеет
клиентский контекст.
Любая процедура или функция, которая написана под директивой &НаКлиенте, может
использовать все методы этой формы под директивами &НаКлиенте, &НаСервере,
&НаСервереБезКонтекста и &НаКлиентеНаСервереБезКонтекста. Поэтому, код, показанный на
листинге 5.4.2, будет успешно выполняться и не вызовет ошибки.
&НаКлиенте
Процедура НажатиеКнопки(Команда)
ПроцедураВыполняемаяНаКлиенте();
КонецПроцедуры
&НаКлиенте
Процедура ПроцедураВыполняемаяНаКлиенте()
//....
КонецПроцедуры

Листинг 5.4.2

332

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.4.7
После этих действий автоматически будут созданы две процедуры. Одна на сервере, а
другая на клиенте (см. листинг 5.4.3).
&НаСервере
Процедура НажатиеКнопкиНаСервере()
// Вставить содержимое обработчика.
КонецПроцедуры
&НаКлиенте
Процедура НажатиеКнопки(Команда)
НажатиеКнопкиНаСервере();
КонецПроцедуры

Листинг 5.4.3
В этом листинге процедура клиентского контекста НажатиеКнопки вызывает процедуру
серверного контекста НажатиеКнопкиНаСервере. В методе, который выполняется под
директивой &НаСервере, нам доступны все данные формы: реквизиты, параметры и т.д. Но нам
уже не доступен клиентский контекст формы. Если мы напишем еще одну процедуру на
клиенте (см. листинг 5.4.4) и попытаемся её вызвать из новой серверной процедуры
НажатиеКнопкиНаСервере, то при проверке синтаксиса будет сгенерирована ошибка (см. рис.
5.4.8).

333

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

&НаСервере
Процедура НажатиеКнопкиНаСервере()
ВыполнениеНаКлиенте()
КонецПроцедуры
&НаКлиенте
Процедура НажатиеКнопки(Команда)
НажатиеКнопкиНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ВыполнениеНаКлиенте()
КонецПроцедуры

Листинг 5.4.4

Рис. 5.4.8
Платформа просто не видит эту процедуру, потому что из серверного контекста клиентский
контекст не доступен, в отличие от обратного.
Теперь проверим утверждение про разное чтение объектов при клиентском вызове
методов (тонкого клиента) и при серверном. Для этого создадим новый реквизит «Автомобиль» с
соответствующим типом (ссылка на справочник Автомобили) и разместим его на форме (см. рис.
5.4.9). Поставим точки останова в процедурах НажатиеКнопки и НажатиеКнопкиНаСервере (см.
рис. 5.4.10) и начнем отладку тонкого клиента (см. рис. 5.4.11).

Рис. 5.4.9

334

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.4.10

Рис. 5.4.11
В открывшейся обработке выберем какой-нибудь автомобиль (см. рис. 5.4.12) и нажмем
на кнопку.

Рис. 5.4.12
Первой сработает точка останова в процедуре НажатиеКнопки. Попробуем в табло
прочитать значение реквизита «Автомобиль» (см. рис. 5.4.13).

335

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

336

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.4.15

Рис. 5.4.16
Но не рекомендую Вам работать с элементами формы на серверном контексте, а
использовать для этого клиентские методы, поскольку такое неоптимальное использование
вызова серверных методов может сказаться на производительности приложения в целом.
Ещё раз подытожу, при вызове метода под директивой &НаСервере доступны все данные
формы, доступен серверный контекст формы, а также можно вызывать внеконтекстные
серверные процедуры и функции (с директивой &НаСервереБезКонтекста). В то же время нужно
иметь в виду, что при вызове серверного метода происходит передача всех данных формы на
сервер, а потом обратно, что может сказаться на производительности приложения, особенно
запускаемого под тонким клиентом.
&НаСервереБезКонтекста - код процедуры или функции под этой директивой, как и в случае с
директивой &НаСервере, будет выполняться в серверном контексте, т.е. на машине, где запущен
сервер 1С. Но в отличие от серверного вызова методов, при внеконтекстном серверном вызове,
данные формы не будут передаваться на сервер. Из процедуры или функции под этой директивой
будет отсутствовать доступ к серверному контексту формы, т.е. из процедуры или функции под
директивой &НаСервереБезКонтекста нельзя вызвать процедуры или функции под директивой
&НаСервере.

337

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

Рис. 5.4.17
После нажатия кнопки «ОК», в модуле формы будут автоматически созданы две
процедуры, одна будет под директивой &НаКлиенте, а другая - &НаСервереБезКонтекста (см.
листинг 5.4.5)
&НаСервереБезКонтекста
Процедура НажатиеКнопкиНаСервере()
// Вставить содержимое обработчика.
КонецПроцедуры
&НаКлиенте
Процедура НажатиеКнопки(Команда)
НажатиеКнопкиНаСервере();
КонецПроцедуры

Листинг 5.4.5
Как уже было сказано, из внеконтекстной процедуры не доступен серверный контекст
формы (как и клиентский, кстати). Проверим это, попытаемся использовать в нашей новой
процедуре НажатиеКнопкиСервер метод под директивой &НаСервере, т.е. процедуру, которая
выполняется в серверном контексте формы (см. листинг 5.4.6).
&НаСервереБезКонтекста
Процедура НажатиеКнопкиНаСервере()
ВыполенениеНаСервере()
КонецПроцедуры
&НаКлиенте
Процедура НажатиеКнопки(Команда)
НажатиеКнопкиНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнениеНаСервере()
КонецПроцедуры

Листинг 5.4.6

338

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Если мы выполним синтаксис-проверку модуля, то платформа выдаст ошибки (см. рис.
5.4.18). Из методов под директивой &НаСервереБезКонтекста можно вызвать только методы
такой же директивой, или с директивой &НаКлиентеНаСервереБезКонтекста.

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

Рис. 5.4.19
Причем внеконтекстный серверный метод можно спокойно вызывать, как и из
клиентского контекста (см. листинг 5.4.7), так и из серверного контекста (см. листинг 5.4.7).
&НаСервереБезКонтекста
Процедура НажатиеКнопкиНаСервере()
КонецПроцедуры

339

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

&НаСервере
Процедура ВызовНаСервере()
НажатиеКнопкиНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура НажатиеКнопки(Команда)
НажатиеКнопкиНаСервере();
КонецПроцедуры
Листинг 5.4.7
На этом мы закончим изучать директивы компиляции, при помощи этих трех директив
можно выполнить большинство работ с управляемыми формами.

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

Рис. 5.4.20

Рис. 5.4.21

340

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

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

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

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

341

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.4.24
Создадим обработчики событий этих команд. В первом случае будет только обработчик на
клиенте, а во втором случае обработчик на клиенте будет делать серверный вызов. В каждом
обработчике присвоим реквизиту Реквизит1 какое-нибудь значение (см. листинг 5.4.8).
&НаКлиенте
Процедура КомандаНаКлиенте(Команда)
Реквизит1 = "Заполнили на клиенте";
КонецПроцедуры
&НаСервере
Процедура КомандаСВызовомСервераНаСервере()
Реквизит1 = "Заполнили на сервере";
КонецПроцедуры
&НаКлиенте
Процедура КомандаСВызовомСервера(Команда)
КомандаСВызовомСервераНаСервере();
КонецПроцедуры

Листинг 5.4.8
Теперь посмотрим, как будет работать код при выполнении обеих команд (см. рис. 5.4.25
и 5.4.26).

Рис. 5.4.25

342

Низамутдинов Ильяс

Глава 5. Работа с управляемыми формами

Рис. 5.4.26
Заметьте, в обоих случаях мы не писали какой-то код, чтобы новое значение
автоматически отобразилось в поле на форме. Платформа сама обновила элемент формы при
изменении реквизита. Во втором же случае изменение реквизита произошло в серверном
контексте формы и тоже элемент на форме отобразился. Когда мы нажали на кнопку, произошел
вызов формы, все данные формы были переданы в серверный контекст, потом после окончания
вызова они были переданы обратно в клиентский контекст формы. В этом же контексте и
произошло обновление элемента на форме.
Но в то же время мы не можем использовать реквизит при внеконтекстном серверном
вызове. Например, код, который показан на листинге 5.4.9, ни к чему не приведет. Объясните
самостоятельно, почему.
&НаСервереБезКонтекста
Процедура КомандаСВызовомСервераНаСервере()
Реквизит1 = "Заполнили на сервере";
КонецПроцедуры
&НаКлиенте
Процедура КомандаСВызовомСервера(Команда)
КомандаСВызовомСервераНаСервере();
КонецПроцедуры

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

343

Низамутдинов Ильяс

Глава 6. Объектные типы

Глава 6. Объектные типы
Часть 1. Объекты метаданных
Теоретическая часть

Перед тем, как начать работать с объектными типами, выясним - что такое Объекты?
Рассмотрим пример, на основе которого Вам будет легче осмыслить понятие объектов. Пусть мы
имеем объект "автомобиль" (например, "Лада-Калина", будем патриотами). У данного
автомобиля есть свойства, такие как: объем двигателя, мощность в лошадиных силах, коробка
передач (автомат или ручная), количество пассажиров, максимальное количество топлива в
бензобаке, текущая скорость автомобиля, его текущий вес и т.п.
И над данным автомобилем мы можем совершать следующие операции: изменять
скорость, переключать передачи, заливать бензин, сажать пассажиров, и также очень многое
другое. Мы рассмотрели нашу "Ладу-Калину" как объект в целом, но есть еще Экземпляры
объекта.
Это значит, что "Калину" может купить Вася, Петя или Марья Ивановна и у каждого из них
будет свой Экземпляр объекта "Лада-Калина".
Некоторые свойства экземпляров объекта могут различаться, например, Вася купил "ЛадуКалину" с автоматической коробкой передач, а Петя с ручной. Васина скорость в данный момент
100 км/ч, он едет по автостраде, а Петина – 10 км/ч, он плетется в пробке.
Какие-то свойства автомобиля может менять пользователь (например, скорость), а какие-то нет
(например, коробку передач). Это открытые и закрытые свойства.
Тем самым приходим к выводу, что Объект в языке программирования - это некоторая
сущность, обладающая Свойствами, над которой можно свершать различные манипуляции
посредством Методов.
Пользователь может работать не с самими объектами, а с Экземплярами объектов,
которые он создает либо самостоятельно, либо с помощью кода, написанного разработчиком.
Еще один момент. Обычно водитель совершает действия с автомобилем в определенном
порядке: сначала заливает бензин, потом садится в салон, включает зажигание, после этого
выжимает сцепление, ставит передачу и трогается. Что произойдет, если водитель сразу
попытается тронуться, не совершив эти действия? Правильно, автомобиль не поедет. Т.е. действия
объекта обладают некоторой историей.
Так же, как и в случае с автомобилем, поведение объекта определяется его историей: к
примеру, мы не сможем отсортировать таблицу значений, если она не заполнена.

344

Низамутдинов Ильяс

Глава 6. Объектные типы

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

345

Низамутдинов Ильяс

Глава 6. Объектные типы
НашаПеременная = Объект.Метод(Параметр1, Параметр2);

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

Объ екты 1С

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

Объекты

Общие объекты

Объекты метаданных

346

Универсальные
коллекции значений

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Листинг 6.1.1

347

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Листинг 6.1.2
В этом коде все точно так же, только «Справочники» - это коллекция объектов метаданных
справочников.
Создадим новую обработку, основную форму обработки, и на форме сделаем команду
«СоздатьМаркуАвтомобиля». В обработчике команды напишем код, который создает с помощью
менеджера справочника МаркиАвтомобилей новый экземпляр объекта (см. листинг 6.1.3).
Причем переменная МаркаАвтомобилей имеет тип СправочникОбъект.МаркиАвтомобилей.
&НаСервереБезКонтекста
Процедура СоздатьМаркуАвтомобиляНаСервере()
МаркаАвтомобилейМенеджер = Справочники.МаркиАвтомобилей;
НоваяМарка = МаркаАвтомобилейМенеджер.СоздатьЭлемент();
НоваяМарка.Наименование = "Renault";
НоваяМарка.Записать();
КонецПроцедуры
&НаКлиенте
Процедура СоздатьМаркуАвтомобиля(Команда)
СоздатьМаркуАвтомобиляНаСервере();
КонецПроцедуры

Листинг 6.1.3
В этом случае я тоже делаю бесконтекстный вызов сервера. Почему?
Сохраните Вашу обработку, запустите в «1С:Предприятие» обработку и нажмите кнопку
выполнения команды. После этого перейдите в справочник МаркиАвтомобилей,

348

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

349

Низамутдинов Ильяс

Глава 6. Объектные типы

Процедура ВывестиНаименование() Экспорт
Сообщить(Наименование);
КонецПроцедуры // ВывестиНаименование()

Листинг 6.1.4
Разберем данный код: Вы создали свою собственную процедуру и сделали ее экспортной.
Это простая процедура, призванная Вам показать, как работают методы объектов. Ключевое
слово Экспорт делает ее внешней процедурой (см. главу 4, часть 2, стр. 265), это значит, что
объект может ее вызывать в любом месте программы. Если не указать слово Экспорт, то функцию
можно будет использовать только внутри модуля объекта. В принципе, ее тоже можно будет
считать методом объекта. Только он будет закрыт от работы извне.
Теперь допишите Вашу недавно созданную обработку, где будете вызывать данную
процедуру.
Перед этим я расскажу Вам о небольшой возможности, как сделать свое программирование
более удобным. Если Вы напишите Ваш объект и поставите точку после данного слова, то
платформа Вам выведет список свойств и методов, с которыми работает данный объект.
Используйте эту возможность, и она позволит Вам быстрее писать и избежать многих
ошибок.
&НаСервереБезКонтекста
Процедура СоздатьМаркуАвтомобиляНаСервере()
МаркаАвтомобилейМенеджер = Справочники.МаркиАвтомобилей;
НоваяМарка = МаркаАвтомобилейМенеджер.СоздатьЭлемент();
НоваяМарка.Наименование = "Renault";
НоваяМарка.Записать();
НоваяМарка.ВывестиНаименование();
КонецПроцедуры

Листинг 6.1.5
Также изменим немного нашу обработку: добавим на форму реквизит МаркаАвтомобиля
(тип Строка), разместим его на форме (см. рис. 6.1.2), а в свойство наименование нового объекта
Марки автомобилей будем присваивать значение этого реквизита.

Рис. 6.1.2

350

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.1.3
В нашем коде мы используем бесконтекстный вызов, как следствие мы не можем в
процедуре СоздатьМаркуАвтомобиляНаСервере обращаться к реквизитам формы. Из
сложившейся ситуации есть два выхода. Первый - сделать контекстный вызов процедуры, второй передать в процедуру значение реквизита. Я выберу второй способ. В этом случае он будет
вполне применим.
&НаСервереБезКонтекста
Процедура СоздатьМаркуАвтомобиляНаСервере(НазваниеМарки)
МаркаАвтомобилейМенеджер = Справочники.МаркиАвтомобилей;
НоваяМарка = МаркаАвтомобилейМенеджер.СоздатьЭлемент();
НоваяМарка.Наименование = НазваниеМарки;
НоваяМарка.Записать();
НоваяМарка.ВывестиНаименование();
КонецПроцедуры
&НаКлиенте
Процедура СоздатьМаркуАвтомобиля(Команда)
СоздатьМаркуАвтомобиляНаСервере(МаркаАвтомобиля);
КонецПроцедуры

Листинг 6.1.6
Сохраните конфигурацию, обработку и всё перезапустите. При нажатии кнопки
«Выполнить» должен быть создан элемент справочника МаркмАвтомобилей, а в окно
сообщений выйдет наименование вновь созданного элемента (см. рис. 6.1.4).
А сейчас Вам небольшое задание: для объекта «Справочник МаркиАвтомобилей»
создайте метод, который будет возвращать длину наименования. Доделайте обработку: с
помощью созданного метода выводите длину названия вновь созданной марки, а также
исключите ситуацию некорректной записи наименования, когда пользователь ввел пробелы
перед или после основного названия (например, так : «KIA »).

351

Низамутдинов Ильяс

Глава 6. Объектные типы

А как создать элемент справочника Автомобили программно? Ведь в нем нужно указать в
качестве реквизита конкретную марку автомобиля. Можно ли это сделать?
Да, можно, но перед тем, как сделать это, изучим понятие Ссылка.

Рис. 6.1.4

Ссы лка объекта

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

352

Низамутдинов Ильяс

Глава 6. Объектные типы

Идем дальше. Каким образом программно получить ссылку на конкретный объект,
который есть в базе?
Сделать это можно несколькими способами: найти по коду, найти по наименованию,
найти по реквизиту и найти по нескольким реквизитам через запрос. Запросы мы будем
разбирать позже, а вот первые три метода рассмотрим.
Перед тем, как разобрать эти методы, напишем код, который будет создавать элемент
справочника Автомобили.
Для этого создайте обработку и разместите на форме реквизиты: наименование (тип
строка (длина 50)), год выпуска (тип дата), гос.номер (тип строка (длина 10)), и коробка передач –
тип ссылка на перечисление Коробка передач (см. рис. 6.1.5).

Рис. 6.1.5
Сделаем команду «Создать автомобиль» и в обработчиках команды напишем следующий
код (см. листинг 6.1.7).
&НаСервере
Процедура СоздатьАвтомобильНаСервере()
СправочникАвтомобильМенеджер = Справочники.Автомобили;
НовыйОбъект = СправочникАвтомобильМенеджер.СоздатьЭлемент();
НовыйОбъект.Наименование = СокрЛП(Наименование);
НовыйОбъект.ГосНомер
= СокрЛП(ГосНомер);
НовыйОбъект.ГодВыпуска = ГодВыпуска;
НовыйОбъект.КоробкаПередач = КоробкаПередач;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьАвтомобиль(Команда)
СоздатьАвтомобильНаСервере();
КонецПроцедуры

Листинг 6.1.7

353

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Листинг 6.1.8
В данном коде мы создаем, как Вы должны уже понять, менеджер объекта справочник
Автомобили, а потом создаем сам экземпляр объекта и заполняем его.
Функция НайтиПоКоду возвращает ссылку на экземпляр объекта «Справочник Марки
автомобилей», которому соответствует код 001. Почему мы задали код в виде строки, а не в виде
цифры, например? Чтобы понять это, откройте непосредственно справочник Марки автомобилей
в конфигурации, зайдите на закладку «Данные» и посмотрите, какой тип кода у данного
справочника.

Рис. 6.1.6

354

Низамутдинов Ильяс

Глава 6. Объектные типы

Тип кода у данного справочника - строка, поэтому код мы ищем по строковому значению.
Таким образом данный код:
Справочники.МаркиАвтомобилей.НайтиПоКоду("001")
возвращает ссылку на справочник Марки автомобилей, код у которого 001. Если такой нет,
возвращается пустая ссылка (о них позже), если с таким кодом несколько элементов, то
возвращается один из них, какой конкретно - предугадать невозможно, платформа выберет
элемент по своим внутренним идентификаторам.
Рассмотрим синтаксис данной функции:
НайтиПоКоду(,,,)
Где:
«Код» – непосредственно тот код, по которому мы ищем наш элемент;
«Поиск по полному коду» - если стоит параметр Истина, то поиск будет вестись по кодам всей
иерархии, т.е. Вам необходимо будет указывать код каждой группы, куда входит элемент через
флеш. Например, так: 001/005/110, где слева будет располагаться самая верхняя группа, а справа
непосредственно код элемента.
Данное поле необязательно, по умолчанию – Ложь;
«Родитель» – для иерархических справочников можно указать группу, тогда поиск будет вестись
внутри группы. Данное поле необязательно;
«Владелец» – для подчиненных справочников можно указать владельца, тогда поиск будет
вестись только среди элементов, подчиненных данному владельцу. Данное поле необязательно.
Теперь, когда мы знаем полный синтаксис метода НайтиПоКоду, то мы можем найти
ссылку на элемент справочника Модели автомобилей. В моей базе элемент справочника Марки
автомобилей с кодом «001» («Ford») является владельцем элемента справочника Модели
автомобилей с названием Focus и кодом «001» (см. рис. 6.1.7).

Рис. 6.1.7
Изменим наш код.
&НаСервере
Процедура СоздатьАвтомобильНаСервере()
СправочникАвтомобильМенеджер = Справочники.Автомобили;
НовыйОбъект = СправочникАвтомобильМенеджер.СоздатьЭлемент();
НовыйОбъект.Наименование = СокрЛП(Наименование);
НовыйОбъект.ГосНомер
= СокрЛП(ГосНомер);

355

Низамутдинов Ильяс

Глава 6. Объектные типы

НовыйОбъект.ГодВыпуска = ГодВыпуска;
НовыйОбъект.КоробкаПередач = КоробкаПередач;
Марка = Справочники.МаркиАвтомобилей.НайтиПоКоду("003");
Модель = Справочники.МоделиАвтомобилей.НайтиПоКоду("001",,,Модель);
НовыйОбъект.Марка = Марка;
НовыйОбъект.Модель =Модель;
НовыйОбъект.Записать();
КонецПроцедуры

Листинг 6.1.9
В этом коде мы найденные экземпляры справочников Марки автомобилей и Модели
автомобилей записываем в отдельные переменные, которые потом используем при заполнении
реквизитов нового объекта.
Сохраните Вашу обработку, запустите ее в «1С:Предприятии», введите любые данные и
выберите коробку передач.

Рис. 6.1.8
Нажмите кнопку «Создать автомобиль» и после этого зайдите в справочник
Автомобиль, где мы видим, что создался новый элемент справочника. Откроем его и посмотрим,
какая марка и модель у этого элемента.

Рис. 6.1.9
Зайдите в справочники Марки автомобилей и Модели автомобилей и посмотрите, все ли
правильно с кодами.
Понятно, что искать элемент справочника просто по коду будет не очень удобно и
непрактично. Гораздо удобнее осуществлять поиск по наименованию.

356

Низамутдинов Ильяс

Глава 6. Объектные типы

Для такого поиска мы будем использовать метод менеджера справочника
НайтиПоНаименованию.
Переделаем теперь Вашу обработку, новый код будет выглядеть следующим образом:
СправочникАвтомобильМенеджер = Справочники.Автомобили;
НовыйОбъект = СправочникАвтомобильМенеджер.СоздатьЭлемент();
НовыйОбъект.Наименование = СокрЛП(Наименование);
НовыйОбъект.ГосНомер
= СокрЛП(ГосНомер);
НовыйОбъект.ГодВыпуска = ГодВыпуска;
НовыйОбъект.КоробкаПередач = КоробкаПередач;
Марка = Справочники.МаркиАвтомобилей.НайтиПоНаименованию("Ford");
Модель = Справочники.МоделиАвтомобилей.НайтиПоНаименованию("Focus",,,Модель);
НовыйОбъект.Марка = Марка;
НовыйОбъект.Модель = Модель;
НовыйОбъект.Записать();

Листинг 6.1.10
Рассмотрим функцию НайтиПоНаименованию более подробно. Синтаксис этой функции
следующий:
НайтиПоНаименованию(,,,)

Где:
«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;
«ТочноеСоответствие» - если стоит параметр Ложь, то поиск будет вестись не точно, т.е. когда
левая часть наименования элемента и строка поиска будут совпадать (например, Металл и
Металл 01), то поиск выдаст результат. Если стоит Истина, то будут найдены только те элементы,
наименование которых будет точно совпадать со строкой поиска.
Данное поле необязательно, по умолчанию – Ложь. Помните это, что по умолчанию поиск
ведется не точно;
Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.
Сохраните обработку и посмотрите, как она работает.
Изучим еще один метод поиска ссылки на справочник - это НайтиПоРеквизиту.
Для этого мы рассмотрим такой пример: будем искать ссылку на элемент справочника
Автомобили по гос.номеру.
Создайте обработку, на форме которой будут реквизиты Гос.номер (тип строка (длинна
10)) и Автомобиль (см. рис.6.1.10) . В поле Автомобиль будем записывать тот автомобиль,
который будет найден по введенному гос.номеру.
Для этого создадим команду «НайтиАвтомобильПоГосНомеру», в обработчике которой
напишем следующий код (см. листинг 6.1.11).

357

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.1.10
&НаСервере
Процедура НайтиАвтомобильПоГосНомеруНаСервере()
СправочникАвтомобильМенеджер = Справочники.Автомобили;
Автомобиль =
СправочникАвтомобильМенеджер.НайтиПоРеквизиту("ГосНомер",ГосНомер);
КонецПроцедуры
&НаКлиенте
Процедура НайтиАвтомобильПоГосНомеру(Команда)
НайтиАвтомобильПоГосНомеруНаСервере();
КонецПроцедуры

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

358

Низамутдинов Ильяс

Глава 6. Объектные типы

Пустая ссы лка

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

Переменные ПустойАвтомобили и ПустойПрибытиеВГараж содержат в себе пустые
ссылки на каждый объект.
Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя
собственная пустая ссылка.
Данный метод очень удобно использовать, когда нам необходимо знать, найден ли
элемент справочника по коду (названию) или нет.
Подкорректируем обработку, где мы создавали новый элемент справочника Автомобили
так, что если ссылка по названию марки найдена, то пишем автомобиль, если - нет, то выходим из
процедуры.
Марка = Справочники.МаркиАвтомобилей.НайтиПоНаименованию("Ford");
Если Марка = Справочники.МаркиАвтомобилей.ПустаяСсылка() Тогда
Возврат;
КонецЕсли;
Модель = Справочники.МоделиАвтомобилей.НайтиПоНаименованию("Focus",,,Модель);
Если Модель = Справочники.МоделиАвтомобилей.ПустаяСсылка() Тогда
Возврат
КонецЕсли;
СправочникАвтомобильМенеджер = Справочники.Автомобили;
НовыйОбъект = СправочникАвтомобильМенеджер.СоздатьЭлемент();
НовыйОбъект.Наименование = СокрЛП(Наименование);
НовыйОбъект.ГосНомер
= СокрЛП(ГосНомер);
НовыйОбъект.ГодВыпуска = ГодВыпуска;
НовыйОбъект.КоробкаПередач = КоробкаПередач;
НовыйОбъект.Марка = Марка;
НовыйОбъект.Модель = Модель;
НовыйОбъект.Записать();

Листинг 6.1.12

359

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Ссы лка как свойство объ екта

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

360

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Ссы лка на перечисление

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

361

Низамутдинов Ильяс

Глава 6. Объектные типы

Измените код, где Вы присваиваете реквизиту объекта КоробкаПередач значение
реквизита формы, на следующий:
//..........
НовыйОбъект.ГосНомер
= СокрЛП(ГосНомер);
НовыйОбъект.ГодВыпуска = ГодВыпуска;
НовыйОбъект.КоробкаПередач = Перечисления.КоробкаПередач.Автоматическая;
НовыйОбъект.Марка = Марка;
НовыйОбъект.Модель = Модель;
//..........

Листинг 6.1.15
В данном коде: перечисление это объект коллекции метаданных, Перечисления.
КоробкаПередач это менеджер перечисления КоробкаПередач. А в целом эта строка - ссылка на
конкретное значение перечисления Автоматическая.

Получить объ ект

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

Рис. 6.1.12
В обработчиках команды «Найти гараж» напишите следующий код:

362

Низамутдинов Ильяс

Глава 6. Объектные типы

&НаСервере
Процедура НайтиГаражНаСервере()
Гараж =
Справочники.Гаражи.НайтиПоНаименованию(СокрЛП(ТекущееНазвание),Истина);
КонецПроцедуры
&НаКлиенте
Процедура НайтиГараж(Команда)
Если

ПустаяСтрока(ТекущееНазвание) тогда
Возврат;
КонецЕсли;
НайтиГаражНаСервере();
КонецПроцедуры

Листинг 6.1.16
В обработчике команды «Изменить гараж» напишите следующий код:
&НаСервере
Процедура ИзменитьГаражНаСервере()
Если Гараж.Пустая() тогда
Возврат;
КонецЕсли;
ОбъектГараж = Гараж.ПолучитьОбъект();
ОбъектГараж.Наименование = НовоеНазвание;
ОбъектГараж.Записать();
Гараж = ОбъектГараж.Ссылка;
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьГараж(Команда)
ИзменитьГаражНаСервере();
ОтобразитьИзменениеДанных(Гараж,ВидИзмененияДанных.Изменение);
КонецПроцедуры

Листинг 6.1.17
Рассмотрим данный код. В процедуре НайтиГараж мы сначала с помощью функции
ПустаяСтрока проверяем, заполнен наш реквизит или нет. Функция ПустаяСтрока, как Вы
помните из предыдущих глав, возвращает Истина, если строка не заполнена. Поэтому, когда
данная функция возвращает Истину, мы выходим из процедуры, и дальнейшего вызова сервера
не происходит. Если же она заполнена, мы вызываем серверную процедуру
НайтиГаражНаСервере, в которой реквизиту формы Гараж присваиваем ссылку, найденную по
текущему названию.
В процедуре ИзменитьГаражНаСервере мы проверяем, является ли реквизит Гараж
пустой ссылкой, если да, то выходим. Если нет, мы получаем объект с помощью функции
ПолучитьОбъект, меняем наименование и записываем его. Чтобы наша новая ссылка
отобразилась на форме, присваиваем переменной Гараж ссылку этого объекта и в процедуре

363

Низамутдинов Ильяс

Глава 6. Объектные типы

ИзменитьГараж применяем метод управляемой формы ОбновитьИзмениеДанных, который
обновит отображение элемента на форме.
Запомните метод ПолучитьОбъект, на моей практике не раз приходилось изменять
реквизиты документов или справочников, которые по тем или иным причинам были не правильно
записаны.

Собы тия объ ектов

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

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

364

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.1.15
В данной процедуре пишите следующий код.
Процедура ПередЗаписью(Отказ)
Если ЭтоНовый() Тогда
НайденнаяМарка =
Справочники.МаркиАвтомобилей.НайтиПоНаименованию(Наименование,Истина);
Отказ = ?(НайденнаяМарка.Пустая(), Ложь, Истина);
КонецЕсли;
КонецПроцедуры

Листинг 6.1.18

365

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Метод ЭтоНовы й

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

Листинг 6.1.19
В данном коде мы проверяем новый это справочник или нет, и если новый, то
присваиваем свойству Наименование значение реквизита ТекущееНазвание.

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

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

366

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.1.16
Тогда на форме списка и непосредственно у элемента будет доступна команда «Удалить»
(см. рис. 6.1.17 и 6.1.18).

Рис. 6.1.17

367

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.1.18

Рис. 6.1.19

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

368

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.1.20
Если права на нужный объект установлены, то в командном интерфейсе этого объекта
появляются кнопки «Пометить на удаление»/ «Снять пометку».

Рис. 6.1.21
Выделите элемент справочника или документ, кликните правой кнопкой мышки и
выберите «Пометить на удаление / Снять пометку». Вы увидите, что значок слева обозначился
крестиком.

Рис. 6.1.22

369

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Рис. 6.1.24
И в параметрах установим флаг «Отображать команду «Все функции» (см. рис. 6.1.25).

370

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

371

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.1.27
В окне «Все функции» в узле «Стандартные» нас интересует обработка «Удаление
помеченных документов» (см. рис. 6.1.28). После выбора откроется форма обработки удаления
помеченных объектов (см. рис. 6.1.29). В этой обработке мы можем выбрать или полное удаление
всех помеченных объектов, или выбрать самостоятельно.

Рис. 6.1.28

Рис. 6.1.29
Если мы отметим «Выборочное удаление» и нажмем кнопку «Далее», то появятся
помеченные на удаление объекты, сгруппированные в виде дерева, где узлы - это объекты

372

Низамутдинов Ильяс

Глава 6. Объектные типы

метаданных (см. рис. 6.1.30). Нажмем кнопку «Удалить», и если нет ссылок на отмеченные
объекты, они будут удалены.

Рис. 6.1.30
Также ПометкаУдаления является свойством таких объектов, как Справочник, Документ,
ПланВидовХарактеристик и т.д. Данное свойство имеет тип булево, оно принимает значение
Истина, если объект помечен на удаление, и Ложь, если нет.
Рассмотрим, каким образом можно программно удалить объект и установить пометку
удаления. Для удаления непосредственно объекта из базы применяется метод объекта Удалить,
а для установки пометки на удаление метод объекта УстановитьПометкуУдаления.
Рассмотрим эти методы в новой обработке, где мы будем удалять элементы справочника.
Создайте новую обработку, форму, а на форме реквизит Автомобиль (тип ссылка на справочник
Автомобили), и реквизит Удалить непосредственно (тип Булево), а также команду Удалить
автомобиль (см. рис. 6.1.31).

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

373

Низамутдинов Ильяс

Глава 6. Объектные типы

&НаСервере
Процедура УдалитьАвтомобильНаСервере()
Если Автомобиль.Пустая() тогда
Возврат;
КонецЕсли;
ОбъектАвтомобиль = Автомобиль.ПолучитьОбъект();
Если УдалитьНепосредственно тогда
ОбъектАвтомобиль.Удалить();
Автомобиль = Справочники.Автомобили.ПустаяСсылка();
иначе
Если Не ОбъектАвтомобиль.ПометкаУдаления тогда
ОбъектАвтомобиль.УстановитьПометкуУдаления(Истина,Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьАвтомобиль(Команда)
УдалитьАвтомобильНаСервере();
КонецПроцедуры

Листинг 6.1.20
Разберем данный код.
Перед непосредственно удалением мы проверяем, есть ли конкретный объект в нашем
реквизите, или ссылка пустая. Если она пустая - выходим из процедуры и ничего не делаем.
Следующим шагом получаем объект из ссылки. В дальнейшем, если установлен флаг Удалить
непосредственно, удаляем объект из базы. Иначе, в том случае если не установлена пометка на
удаление, устанавливаем ее.
Разберем метод УстановитьПометкуУдаления подробно. У данного метода следующий
синтаксис:
УстановитьПометкуУдаления(, )
Функция УстановитьПометкуУдаления имеет два параметра. Первый параметр
ПометкаУдаления имеет тип значения булево. Если он Истина, то на данный объект будет
установлена пометка удаления, а в противном случае она будет снята (если она установлена).
Второй параметр имеется только для объектов Справочник и тоже имеет тип значения булево. В
том случае, когда его значение Истина, будет помечен не только сам объект, но и все
подчиненные. Значение по умолчанию обоих параметров – Истина.
Помните, что программное удаление справочников и элементов с помощью пометки на
удаление выполнит данную процедуру в более щадящем режиме для базы, чем прямое
удаление. Поэтому, хотя это и накладно по времени, рекомендую Вам всегда удалять объекты с
помощью установки пометки на удаление, это убережет Вас от многих проблем в будущем.
Если Вы запустите эту обработку, то заметите, что элемент справочника удалился, даже
когда право Интерактивное удаление снято. Все правильно, потому что мы удалили экземпляр

374

Низамутдинов Ильяс

Глава 6. Объектные типы

объекта не интерактивным, а программным способом. За удаление объектов программным
способом отвечает право Удаление (см. рис. 6.1.32). Снимите флаг этого права у справочника
Автомобиль и попробуйте удалить непосредственно при помощи обработки, возникнет ошибка
(см. рис. 6.1.33).

Рис. 6.1.32

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

375

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

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

Рис. 6.2.1
Теперь Вам необходимо задать, что Ваш документ не делает никаких движений. Для этого
перейдите на закладку «Движения» и в пункт «Проведение» установите значение «Запретить».

Рис. 6.2.2

376

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Оперативное и неоперативное проведение

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

377

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

378

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Поэтому у обоих этих документов установим признак оперативного проведения.

Рис. 6.2.6
А вот документу Установка цен на топливо оперативное проведение ни к чему, конечно,
понятно, что установить цены будущей датой это нонсенс, но и не факт, что такое не может

379

Низамутдинов Ильяс

Глава 6. Объектные типы

произойти. Например, для каких-нибудь прогнозов. Поэтому для данного документа запретим
оперативное проведение.

Рис. 6.2.7

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

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

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

380

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

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

381

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Рис. 6.2.13

382

Низамутдинов Ильяс

Глава 6. Объектные типы

На этом мы закончим с конфигурированием документов. Перейдем к изучению свойств и
методов документов.

Проведен

Большинство закрытых свойств и методов у документов совпадает со свойствами и
методами справочников, которые мы проходили в первой части этой главы. Но есть такие
свойства и методы, которые присутствуют только у документов.
Рассмотрим свойство Проведен.
Проведен - это свойство документа, которое принимает значение Истина, если документ
проведен, и Ложь, если документ не проведен. Данное свойство доступно только для чтения.
Рассмотрим простой пример: создайте обработку, имеющую один реквизит с типом
ссылка на документ Прибытие в гараж, и один реквизит с типом Булево. Если выбираемый
документ будет проведен, то тумблер, соответствующий реквизиту, установится в Да, в ином
случае - Нет.

Рис. 6.2.14
Для обработчика ПриИзменении элемента ПрибытиеВГараж создадим обработчики на
клиенте и на сервере.

383

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.2.15
В этих обработчиках напишем следующий код:
&НаСервере
Процедура ПрибытиеВГаражПриИзмененииНаСервере()
Проведен = ПрибытиеВГараж.Проведен;
КонецПроцедуры
&НаКлиенте
Процедура ПрибытиеВГаражПриИзменении(Элемент)
ПрибытиеВГаражПриИзмененииНаСервере();
КонецПроцедуры

Листинг 6.2.1
В этом коде мы при изменении значения поля Прибытие в гараж булевому реквизиту
формы Проведен присваиваем значение свойства Проведен объекта Документ, которое тоже
имеет тип Булево. К этому свойству мы обратились посредством ссылки на данный объект.
Сохраните и запустите обработку. Выберете теперь любой проведенный документ.
А теперь отменим его проведение.
Тумблер должен меняться в зависимости от того, проведен документ или нет.

Программное создание, запись и проведение документа

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

384

Низамутдинов Ильяс

Глава 6. Объектные типы

обработки разместите следующие реквизиты: Автомобиль, Гараж и Дата прибытия и Пробег с
соответствующими типами.

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

&НаКлиенте
Процедура СоздатьДокумент(Команда)
Если Не ЗначениеЗаполнено(Автомобиль) Тогда
Сообщить("Не заполнили автомобиль");
Возврат;
КонецЕсли;

385

Низамутдинов Ильяс

Глава 6. Объектные типы

Если Не ЗначениеЗаполнено(Гараж) Тогда
Сообщить("Не заполнили гараж");
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДатаПрибытия) Тогда
Сообщить("Не заполнили дату прибытия");
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Пробег) Тогда
Сообщить("Не заполнили пробег");
Возврат;
КонецЕсли;
СоздатьДокументНаСервере();
КонецПроцедуры

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

386

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.2.17
У поля Режим проведения заполним список выбора двумя значениями:Оперативный и
Неоперативный. Для первого значение будет 1, а для второго – 2.

Рис. 6.2.18

387

Низамутдинов Ильяс

Глава 6. Объектные типы

А для поля Режим записи заполним список выбора двумя значениями: Запись,
Проведение. Для первого значение будет 1, а для второго – 2.

Рис. 6.2.19
Всем полям переключателям установим вид тумблер.

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

388

Низамутдинов Ильяс

Глава 6. Объектные типы

&НаСервере
Процедура СоздатьДокументНаСервере()
ДокОбъект = Документы.ПрибытиеВГараж.СоздатьДокумент();
ДокОбъект.Автомобиль = Автомобиль;
ДокОбъект.Гараж
= Гараж;
ДокОбъект.ДатаПрибытия = ДатаПрибытия;
ДокОбъект.Пробег = Пробег;
Если РежимЗаписи = 1 Тогда
ДокОбъект.Дата = ДатаПрибытия;
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
ИначеЕсли РежимЗаписи = 2 Тогда
Если РежимПроведения = 1 Тогда
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,
РежимПроведенияДокумента.Оперативный);
ИначеЕсли РежимПроведения = 2 Тогда
ДокОбъект.Дата = ДатаПрибытия;
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение,
РежимПроведенияДокумента.Неоперативный);
КонецЕсли;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СоздатьДокумент(Команда)
Если Не ЗначениеЗаполнено(Автомобиль) Тогда
Сообщить("Не заполнили автомобиль");
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Гараж) Тогда
Сообщить("Не заполнили гараж");
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДатаПрибытия) Тогда
Сообщить("Не заполнили дату прибытия");
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Пробег) Тогда
Сообщить("Не заполнили пробег");
Возврат;
КонецЕсли;
Если РежимЗаписи = 0 Тогда
Сообщить("Установите режим записи");
Возврат;
КонецЕсли;
Если РежимПроведения = 0 Тогда
Сообщить("Установите режим проведения");
Возврат;
КонецЕсли;
СоздатьДокументНаСервере();
КонецПроцедуры

Листинг 6.2.3

389

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Найти документ

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

390

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.2.21
В обработчиках команды «Найти документ» напишите следующий код:

&НаСервере
Процедура НайтиДокументНаСервере()
ПрибытиеВГараж =
Документы.ПрибытиеВГараж.НайтиПоНомеру(НомерДляПоиска,ТекущаяДата());
КонецПроцедуры
&НаКлиенте
Процедура НайтиДокумент(Команда)
НайтиДокументНаСервере();
КонецПроцедуры

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

391

Низамутдинов Ильяс

Глава 6. Объектные типы

Изменение имею щихся документов

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

Рис. 6.2.22
Допишем код в обработчике:
&НаСервере
Процедура НайтиДокументНаСервере()
ПрибытиеВГараж =
Документы.ПрибытиеВГараж.НайтиПоНомеру(НомерДляПоиска,ТекущаяДата());
Если ПрибытиеВГараж.Пустая() Тогда
Возврат;
КонецЕсли;
ПрибытиеВГаражОбъект = ПрибытиеВГараж.ПолучитьОбъект();
ПрибытиеВГаражОбъект.ДатаПрибытия = ДатаПрибытия;
ПрибытиеВГаражОбъект.Записать(РежимЗаписиДокумента.Проведение,
РежимПроведенияДокумента.Неоперативный);
КонецПроцедуры

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

392

Низамутдинов Ильяс

Глава 6. Объектные типы

Резюме

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

393

Низамутдинов Ильяс

Глава 6. Объектные типы

Часть 3. Форма как объект
Любая форма, как и любой элемент на форме, является объектом. Это значит, что у формы
и у элементов формы имеются методы и свойства. А также мы можем работать с событиями,
которые есть у формы, и с событиями, которые есть у элементов формы.
Основной реквизит

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

Рис. 6.3.1

Рис. 6.3.2

394

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

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

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

395

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Листинг 6.3.1

396

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Свойства, методы и собы тия формы

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

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

397

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.7
Нет смысла разъяснять каждое свойство из палитры. В предыдущей главе мы разобрали
свойство «Режим открытия окна» (см. стр. 298). Мы не будем разбирать каждое свойство в
отдельности, я только расскажу, как работать с синтаксис-помощником. В синтаксис-помощнике
все свойства управляемых форм находятся по пути «Интерфейс(управляемый) – Управляемая
форма – Управляемая форма – Свойства» (см. рис. 6.3.8).

Рис. 6.3.8
В папке Свойства перечислены все свойства управляемой формы, причем их больше, чем
в палитре свойств. В описании свойств следует особо обращать внимание на два пункта - это
Использование и Доступность. Например, возьмем свойство Заголовок (см. рис. 6.3.9).

398

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.9
Под пунктом Использование написано «Чтение и запись», это значит, что мы можем
прочитать значение данного свойства, но также и изменить его. Причем как программно в
процессе работы, так и в палитре свойств.
А под пунктом Доступность написано «Тонкий клиент, веб-клиент, ...». Это значит, что
чтение и запись этого свойства доступны практически под всеми видами клиентов, включая самые
«медленные» - тонкий клиент и веб-клиент.
А вот у свойства ИмяФормы под пунктом Использование написано «Только чтение» (см.
рис. 6.3.10). Это значит, что мы сможем только прочитать это свойство, но нигде не сможем его
изменить (программно).

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

399

Низамутдинов Ильяс

Глава 6. Объектные типы

В синтаксис-помощнике описание расширений управляемой формы находятся в каталоге
«Интерфейс(управляемый) – Управляемая форма» (см. рис. 6.3.11)

Рис. 6.3.11
Таким образом, полная информация о свойствах, методах и событиях формы документа
содержится в трех папках справочной информации:
1) Интерфейс – Управляемая форма – Управляемая форма – типовые свойства и т.д. для всех
управляемых форм;
2) Интерфейс – Управляемая форма – Расширение объектов – свойства и т.д. для форм, у
которых основной реквизит какой-нибудь объектный тип (СправочникОбъект,
ДокументОбъект и т.д.);
3) Интерфейс – Управляемая форма – Расширение документа – свойства и т.д. для форм, у
которых основной реквизит объектный тип кого-нибудь документа.
Разберем события формы. Перечень всех событий управляемой формы располагается в
палитре свойств внизу списка (см. рис. 6.3.12).

400

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.13
С описанием всех событий формы также можно познакомиться в справочной информации.
В том же самом разделе: «Интерфейс(управляемый) – Управляемая форма – Управляемая
форма», только в папке События (см. рис. 6.3.14).

401

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.15
Создадим обработчик для события формы «ПриОткрытии» на клиенте (см. рис. 6.3.16).

402

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.16
В созданном обработчике напишем следующий код:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(Объект.Автомобиль) и
ЗначениеЗаполнено(Объект.ДатаПрибытия) Тогда
Заголовок = Строка(Объект.Автомобиль) +
" прибыл " +
Формат(Объект.ДатаПрибытия,"ДЛФ=DD");
иначе
АвтоЗаголовок = Истина;
КонецЕсли;
КонецПроцедуры

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

403

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.17

Рис. 6.3.18

Рис. 6.3.19
Из всего множества методов форм рассмотрим только один - РеквизитФормыВЗначение.
Как Вы помните, основной реквизит формы для элементов справочников и документов имеет тип

404

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Листинг 6.3.3
Создадим команду формы «Печать», которую разместим на командной панели формы
(см. рис. 6.3.20).

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

405

Низамутдинов Ильяс

Глава 6. Объектные типы

&НаКлиенте
Процедура Печать(Команда)
ПечатьНаСервере();
КонецПроцедуры

Листинг 6.3.4
Сохраним конфигурацию, обновим базу данных и попробуем выполнить нашу команду
(см. рис. 6.3.21).

Рис. 6.3.21

Свойства и собы тия элементов формы

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

406

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.22
Доступ ко всем элементам формы осуществляется посредством свойства формы
Элементы, которое является коллекцией элементов формы. Поставим в конце процедуры
обработчика команды «Доступ к элементам» точку останова и выполним эту команду (см. рис.
6.3.23) в пользовательском режиме.

Рис. 6.3.23
Как видно из рисунка, через свойство формы Элементы мы можем получить доступ ко
свойствам всех элементов, которые размещены на форме.

407

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.24
Возьмем, к примеру, Поле формы. У этого элемента есть свойства, события и методы (см.
рис. 6.3.25).

Рис. 6.3.25
Но поле формы не бывает само по себе, обычно оно имеет какой-нибудь вид, это может
быть поле ввода, поле флажка, поле переключателя и т.д. Все эти виды поля ввода являются его
расширениями и для них есть дополнительные свойства, методы и события. Их описание
расположено в соответствующих каталогах (см. рис. 6.3.26).

408

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.27

Рис. 6.3.28

409

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.29
Перед тем как программно изменять свойство элемента, найдем его в справке (сделайте
это самостоятельно) и посмотрим его описание (см. рис. 6.3.30).

Рис. 6.3.30

Нас интересует возможность изменения этого свойства (раздел «Использование»), а также
доступу к нему под тонким клиентом (раздел «Доступность»), иначе пришлось бы делать вызов
сервера. И то, и то мы можем делать. А также узнаем, какой тип имеет данное свойство (раздел
«Описание»). Это системное перечисление «ВидФлажка», посмотрим, можно ли обращаться к
нему на тонком клиенте (см. рис.6.3.31).

410

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.31
Напишем в обработчике команды ДоступКЭлементам код, в котором будем менять вид
флажка (см. листинг 6.3.5).
&НаКлиенте
Процедура ДоступКЭлементам(Команда)
Элементы.РеквизитБулево.ВидФлажка = ВидФлажка.Тумблер;
КонецПроцедуры

Листинг 6.3.5
Самостоятельно опробуйте работу этого кода.
Рассмотрим еще один пример: для полей ввода даты и строки (реквизиты
«РеквизитСтрока» и «РеквизитДата») установим значение свойства ТолькоПросмотр в Истина
(см. рис. 6.3.32).

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

411

Низамутдинов Ильяс

Глава 6. Объектные типы

Самостоятельно найдите свойство «ТолькоПросмотр» поля ввода и посмотрите
доступность этого свойства.
Напишем код в обработчике события команды ДоступКЭлементам.
&НаКлиенте
Процедура ДоступКЭлементам(Команда)
Элементы.РеквизитДата.ТолькоПросмотр = Ложь;
Элементы.РеквизитСтрока.ТолькоПросмотр = Ложь;
КонецПроцедуры

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

Рис. 6.3.33
Так же, как и со свойствами, наличие или отсутствие того или иного события определяется
расширением этого элемента. Например, на рис. 6.3.33 Вы видите события для элемента формы
Поле формы с видом Поле флажка, а для аналогичного элемента формы только с видом Поле
ввода будет другой перечень событий (см. рис. 6.3.34).

412

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.35
Все события поля формы с типом поле ввода описаны в расширении для поля ввода (см.
рис. 6.3.36).

Рис. 6.3.36

413

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Листинг 6.3.7
Посмотрим на работу этого события (см. рис. 6.3.38 и 6.3.39).

Рис. 6.3.38

414

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.40
Найдем событие «Очистка» у поля у элемента формы РеквизитСтрока и создадим
обработчик этого события на клиенте (см. рис. 6.3.41).

Рис. 6.3.41
Заметьте, у процедуры обработчика появился параметр СтандартнаяОбработка (см.
рис. 6.3.42). Этот параметр имеет тип Булево и по умолчанию принимает значение Истина. Когда

415

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.42
Напишем в процедуре код по алгоритму, описанному выше (см. листинг 6.3.8).
&НаКлиенте
Процедура РеквизитСтрокаОчистка(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если ЗначениеЗаполнено(РеквизитДата) Тогда
Сообщить("Очистите сначала дату");
Иначе
СтандартнаяОбработка = Истина;
КонецЕсли;
КонецПроцедуры

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

Откры тие формы

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

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

416

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.43
Теперь создадим обработчики следующих событий формы; ПриЧтенииНаСервере,
ПриСозданииНаСервере и ПриОткрытии. Для этого зайдем в палитру свойств формы и нажмем
на кнопку «Лупа» соответствующих обработчиков (см. рис. 6.3.44).

417

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.44
В процедурах обработчиках событий напишем следующий код (см. листинг 6.3.9):
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
Сообщить("Шаг 2. Заполнили данные формы по данным объекта");
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Сообщить("Шаг 3. Обработка создания формы на сервере");
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Сообщить("Шаг 4. Обработка открытия формы на клиенте");
КонецПроцедуры

Листинг 6.3.9
Сохраним конфигурацию, обновим базу данных и откроем форму документа «Установка
цен на топливо» (см. рис. 6.3.45).

418

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.45

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

419

Низамутдинов Ильяс

Глава 6. Объектные типы

Если Вы забыли, то напомню, как создать событие в модуле объекта. Для этого
необходимо открыть сам модуль, активизировать его (т.е. установить курсор) и выполнить
команду «Процедуры и функции» (см. рис. 6.3.46).

Рис. 6.3.46
После выйдет окно «Процедуры и функции», где выделим пункт «Обработка заполнения»
и нажмем кнопку «Перейти» (см. рис. 6.3.47). После этого будет создана пустая процедура, в
которой напишем код, как в листинге 6.3.9.

Рис. 6.3.47
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения,
СтандартнаяОбработка)
Сообщить("Шаг 1.1. Обработка заполнения");
КонецПроцедуры

Листинг 6.3.10

420

Низамутдинов Ильяс

Глава 6. Объектные типы

Сохраним конфигурацию, обновим базу данных и интерактивно создадим новый документ
«Установка цен на топливо». При этом произойдет открытие формы документа (см. рис. 6.3.48).

Рис. 6.3.48
Заметьте, на рисунке 6.3.48 в окне сообщений нет информации о шаге 2, потому что не
произошла обработка события ПриЧтенииНаСервере. В то же время если мы заполним какиелибо реквизиты объекта в обработчике модуля объекта ОбработкаЗаполнения, то они
отобразятся на форме.

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

421

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.49
В дальнейшем все действия подраздела мы будем осуществлять в процедуре на клиенте
«ОткрытиеФормы» (см. листинг 6.3.11).
&НаКлиенте
Процедура ОткрытиеФормы(Команда)
// Вставить содержимое обработчика.
КонецПроцедуры

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

422

Низамутдинов Ильяс

Глава 6. Объектные типы

В этой книге мы изучим только такие параметры как: «ИмяФормы», «Параметры и
РежимОткрытияОкна». Работа с остальными параметрами дается в 3 части книги «Основы
разработки в 1С: Такси».
А теперь научимся безошибочно получать имя формы. Для этого будем использовать
контекстную подсказку. Чтобы она включилась, необходимо написать название метода и открыть
скобку и кавычку:
ОткрытьФорму("
После этого выйдет контекстная подсказка с группами объектов метаданных (см. рис.
6.3.49). Если она по какой-то причине не вышла, нажмите Ctrl + Space (пробел).

Рис. 6.3.50
Мы выберем группу метаданных «Документ», и после этого выйдет список всех
имеющихся в нашей конфигурации документом (см. рис. 6.3.50).

Рис. 6.3.51
Выберем документ ПрибытиеВГараж, после этого выйдет контекстная подсказка, в
которой или можно будет выбрать какую-либо конкретную форму, или форму из свойства объекта
(см. рис. 6.3.51).

Рис. 6.3.52
Если из выпадающего списка форм Вы выберете пункты: «ФормаВыбора»,
«ФормаОбъекта» и «ФормаСписка», то будут открыты формы из соответствующих свойств объекта

423

Низамутдинов Ильяс

Глава 6. Объектные типы

конфигурации. В нашем случае это свойства «Основная форма объекта», «Основная форма
выбора» и «Основная форма списка» (см. рис. 6.3.53). Если в каком-то из этих свойств не указана
форма, то форма все равно будет открыта. Она сгенерируется платформой автоматически.

Рис. 6.3.53
Если в контекстной подсказке, изображенной на рис. 6.3.54, выбрать пункт «Формы», то
выйдет следующая контекстная подсказка со всеми созданными формами объекта метаданных
(см. рис. 6.3.54).

Рис. 6.3.54
В этой контекстной подсказке будут все формы, которые есть у объекта метаданных (см.
рис. 6.3.55).

Рис. 6.3.55
Если у Вас нет формы списка у этого документа, то создайте её самостоятельно!

424

Низамутдинов Ильяс

Глава 6. Объектные типы

Выберем форму списка. Должен получиться следующийкод:
ОткрытьФорму("Документ.ПрибытиеВГараж.Форма.ФормаСписка");
Если мы сейчас сохраним обработку, откроем её в нашей конфигурации и применим
команду «Открытие формы», то откроется форма списка документа «Прибытие в гараж», причем в
«соседнем» окне (см. рис. 6.3.56).

Рис. 6.3.56
А если выберем форму документа:
ОткрытьФорму("Документ.ПрибытиеВГараж.Форма.ФормаДокумента");
- то откроется пустая форма документа (см. рис. 6.3.57).

Рис. 6.3.57

425

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.58
Теперь нам осталось изменить обработчик команды «Открытие формы»: создадим новую
структуру, с единственным элементом, ключ которого будет называться «Ключ», а в значение
подставляться реквизит формы ПрибытиеВГараж. И эту структуру будем использовать в качестве
второго параметра метода ОткрытьФорму (см. листинг 6.3.12).
&НаКлиенте
Процедура ОткрытиеФормы(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ",ПрибытиеВГараж);
ОткрытьФорму("Документ.ПрибытиеВГараж.Форма.ФормаДокумента",
ПараметрыФормы);
КонецПроцедуры

Листинг 6.3.12

426

Низамутдинов Ильяс

Глава 6. Объектные типы

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

Рис. 6.3.59
Продолжим изучать открытие форм с параметрами.
Выполним небольшую задачку. Создадим новую обработку, форму обработки и на форме
два реквизита - «Время» и «Расстояние» с типом Число (см. рис. 6.3.60), а также команду
«Рассчитать скорость». Эта форма будет основной формой обработки, т.е. будет
открываться при запуске обработки (см. рис. 6.3.62).
У новой обработки также создадим форму «Форма расчета скорости», на которой
создадим два параметра «Время» и «Расстояние» (см. рис. 6.3.61), а также реквизит «Скорость»,
который разместим на форме.
При выполнении команды «Рассчитать скорость» основной формы будем открывать
форму обработки «Форма расчета скорости», где будем считать скорость, деля расстояние на
время и записывая результат в реквизит «Скорость».

427

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.60

Рис. 6.3.61

Рис. 6.3.62
Создадим обработчик для команды «Рассчитать скорость», в котором будем открывать
форму «Форма расчета скорости» нашей обработки и передавать в метод открытия формы в
качестве параметра структуру с двумя элементам. Названия ключей элементов соответствуют

428

Низамутдинов Ильяс

Глава 6. Объектные типы

названиям параметрам формы «Форма расчета скорости», а в значения элементов будут
передаваться значения соответствующих реквизитов формы (см. листинг 6.3.13).
&НаКлиенте
Процедура РассчитатьСкорость(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Расстояние",Расстояние);
ПараметрыФормы.Вставить("Время",Время);
ОткрытьФорму("ВнешняяОбработка.Глава_6_Часть_3_Обработка_3.Форма.ФормаРасчета
Скорости",ПараметрыФормы);
КонецПроцедуры

Листинг 6.3.13
Теперь нам осталось эту скорость рассчитать, делать мы это будем в обработчике события
ПриСозданииНаСервере формы «Форма расчета скорости», причем если параметр Время равен
нулю, то форму не будем открывать (см. листинг 6.3.14).
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Время = 0 Тогда
Сообщить("Время равно 0");
Отказ = истина;
Возврат;
КонецЕсли;
Скорость = Параметры.Расстояние / Параметры.Время;
КонецПроцедуры

Листинг 6.3.14
Сохраним обработку и попробуем вычислить скорость (см. рис. 6.3.63 и 6.3.64).

Рис. 6.3.63

429

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.64
Для красоты изменим заголовки обоих форм. Я это сделаю в конфигураторе (см. рис.
6.3.65 и 6.3.66), а Вы программно при открытии формы.

Рис. 6.3.65

Рис. 6.3.66
Попробуем теперь рассчитать скорость (см. рис. 6.3.67 и 6.3.68).

430

Низамутдинов Ильяс

Глава 6. Объектные типы

Рис. 6.3.67

Рис. 6.3.68

Режимы открытия окна
Вы заметили, что каждый раз окна открываются в «соседнем окне», т.е. независимо. В то
же время из пятой главы 5 (см. стр. 298) мы знаем, что существуют различные режимы открытия
окна, которые задаются при помощи свойства формы РежимОткрытияОкна. Если мы присвоим
свойству формы РежимОткрытияОкна какое-либо значение, то форма всегда будет открываться
в этом режиме. В некоторых всегда по умолчанию установлен режим Независимый.
Можно ли программно открыть формы в других режимах, не меняя при этом свойство
формы? Да, можно. Для этого необходимо использовать последний параметр метода
«ОткрытьФорму – РежимОткрытияОкна».

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

431

Низамутдинов Ильяс




Глава 6. Объектные типы

БлокироватьВесьИнтрефейс
БлокироватьОкноВладельца
Независимый

Доработаем нашу предыдущую обработку, пусть форма расчета скорости открывается в
отдельном окне, для этого будем её открывать с режимом БлокироватьОкноВладельца (см.
листинг 6.3.15).
&НаКлиенте
Процедура РассчитатьСкорость(Команда)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Расстояние",Расстояние);
ПараметрыФормы.Вставить("Время",Время);
ОткрытьФорму("ВнешняяОбработка.Глава_6_Часть_3_Обработка_3.Форма.ФормаРасчета
Скорости",
ПараметрыФормы,,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

Листинг 6.3.15
Посмотрим, как отработает расчет скорости (см. рис. 6.3.69).

Рис. 6.3.69

432

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Рис. 6.4.1

433

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

Листинг 6.4.1
А в обработчике команды напишем следующий код:
&НаКлиенте
Процедура ПроверитьТип(Команда)
Если ТипЗнч(Текущее) = Тип("Число") тогда
Сообщить("Переменная ""Текущая"" имеет тип число");
ИначеЕсли ТипЗнч(Текущее) = Тип("Строка") тогда
Сообщить("Переменная ""Текущая"" имеет тип строка");
ИначеЕсли ТипЗнч(Текущее) = Тип("СправочникСсылка.Автомобили") тогда

434

Низамутдинов Ильяс

Глава 6. Объектные типы

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

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

435

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

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

Часть 1. Массивы
Что такое Массив? Массив в языке программирования 1С - это коллекция элементов,
следующих друг за другом, которые могут быть доступны с помощью индекса. Элементы могут
быть любого типа, в том числе и типа Массив. У каждого элемента в массиве есть уникальный
номер, который называют Индексом. Посредством индекса можно получить доступ к данному
элементу.
Все элементы в массиве упорядочены, т.е. первый элемент имеет индекс, равный нулю,
второй - одному, и так далее.
Запомните! В программировании все индексы во всех коллекциях всегда начинаются с
нуля!
Научимся создавать и заполнять массивы.

436

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

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

= Новый

Массив(5);

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

Листинг 7.1.1
Обращаю Ваше внимание, что когда мы создали данный массив, его элементы уже
существуют, но они не заполнены значениями. Если Вы посмотрите на данный массив в
отладчике, то увидите напротив каждого элемента тип Неопределено (см. рис. 7.1.1).

Рис. 7.1.1
Таким образом, мало создать массив, необходимо еще заполнить его.

437

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

Узнаем, каким образом обращаться к элементу массива посредством индекса. Делается
это с помощью оператора «квадратные скобки». Допишем код в нашей обработке:
&НаКлиенте
Процедура СозданиеМассива(Команда)
МассивНовый = Новый Массив(5);
МассивНовый[0] = "Первый";
МассивНовый[1] = 2;
КонецПроцедуры

Листинг 7.1.2
В данном примере с помощью квадратных скобок мы обратились к первому элементу
массива, который имеет индекс ноль, а потом ко второму, имеющему индекс один. Как Вы уже
поняли из примера, элементы массивов в 1С могут быть разных типов. Заполните остальные три
элемента какой-нибудь информацией.
МассивНовый[2] = 4;
МассивНовый[3] = "Четвертый";
МассивНовый[4] = 8;

Листинг 7.1.3
С помощью оператора «квадратные скобки» можно также и читать значения элемента
массива.
Сообщить("МассивНовый[0]= " + МассивНовый[0] +
", МассивНовый[1] = " + МассивНовый[1]);

Листинг 7.1.4
Сохраните обработку, запустите ее в «1С:Предприятии» и посмотрите, что получилось.
Помимо создания массива с заранее определенным количеством элементов, можно
задать массив, не указывая, сколько элементов он будет содержать. Делается это так:
МассивНовый2 = Новый Массив;
В данном случае будет создан массив, но никаких элементов в нем не будет (он будет
пуст). Как работать с такими массивами, мы узнаем несколько позже.
Итак, мы научились создавать одномерный массив и заполнять его значениями, а также
получать эти значения. Назовем этот вид наполнения массива ручным способом.

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

438

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

присвоить каждому элементу свой индекс. Типичный пример китайского кода это то, как мы
заполнили элементы массива ранее. Иногда это бывает необходимо. Но иногда необходимо
прочитать каждый элемент массива в цикле. Для этого в теле цикла нужно обойти индексы от
первого до последнего. Сделаем это с помощью цикла Для…Цикл.
В ранее сконструированной обработке создадим новую команду, в обработчике которой
создадим массив, заполним его и обойдем циклом:
&НаКлиенте
Процедура ОбходЦиклом(Команда)
МассивНовый = Новый Массив(5);
МассивНовый[0] = 3;
МассивНовый[1] = 7;
МассивНовый[2] = 7;
МассивНовый[3] = 9;
МассивНовый[4] = 1;
Для н = 0 по 4 цикл
Сообщить("МассивНовый[" + н + "] = " + МассивНовый[н] );
КонецЦикла;
КонецПроцедуры

Листинг 7.1.5
Сохраните, запустите обработку и посмотрите, что получилось.
Тогда у внимательного читателя возникнет вопрос: каким образом узнать количество
элементов массива, когда это не задано в конструкторе? Для этого у объекта массив существует
метод ВГраница, который возвращает наибольший индекс в массиве. Индекс будет
соответствовать количеству элементов массива минус один. Количество элементов массива также
можно определить с помощью метода объекта массив, который называется Количество.
То есть цикл, который мы только что написали, можно переделать двумя равнозначными
способами:
Для н = 0 по МассивНовый.ВГраница() цикл
Сообщить("МассивНовый[" + н + "] = " + МассивНовый[н] );
КонецЦикла;

Листинг 7.1.6
И по-другому:
Для н = 0 по МассивНовый.Количество() - 1 цикл
Сообщить("МассивНовый[" + н + "] = " + МассивНовый[н] );
КонецЦикла;

Листинг 7.1.7

439

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

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

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

//операторы
[Прервать;]
//операторы
[Продолжить;]

КонецЦикла
Приведенный оператор предназначен для циклического обхода коллекций.
Переменная Коллекция представляет именно ту коллекцию, которую мы обходим.
Переменной Элемент присваивается очередное значение элемента коллекции при каждом
обходе.
Операторы Прервать и Продолжить Вам уже знакомы.
Рассмотрим этот вид цикла на примере обхода массива. Обойдем с помощью данного
цикла уже созданный нами массив.
н = 0;
Для Каждого ЭлементМассива из МассивНовый цикл
Сообщить("МассивНовый[" + н + "] = " + ЭлементМассива);
н = н + 1;
КонецЦикла;

Листинг 7.1.8

440

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

Сохраните обработку и посмотрите, как работает данный цикл.
В данном коде переменную «н» мы ввели искусственно, чтобы пример был более
наглядным. Как Вы уже поняли из примера, переменной ЭлементМассива в каждой итерации
цикла присваивается соответствующий элемент массива МассивНовый.
Я рекомендую Вам использовать для обхода массивов в основном второй цикл, потому что
в этом случае Вы получаете прямой доступ к элементу коллекции. И Вам не придется обращаться
к нему посредством оператора Квадратные скобки. И для всех последующих универсальных
коллекций мы будем применять оператор цикла Для каждого…Цикл.

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

Метод «Добавить»
С помощью данного метода добавляется новый элемент в конец массива. Метод содержит
один параметр, это значение того элемента, который добавляется. Также он может быть и без
параметра, тогда будет добавлен элемент со значением Неопределено.
Создайте новую команду формы, в которой будете рассматривать метод Добавить.
Покажем, как работает метод «Добавить». Для этого создадим массив из трех элементов, а
потом добавим еще один. И выведем новый массив в окно сообщений:
&НаКлиенте
Процедура МетодМассиваДобавить(Команда)
Массив1 = Новый Массив(3);
Для н = 0 по Массив1.ВГраница() цикл
Массив1[н] = н;
КонецЦикла;
Массив1.Добавить(1000);
н = 0;
Для Каждого ЭлМассив1 из Массив1 цикл
Сообщить("Массив1["+ н + "] = " + ЭлМассив1 );
н = н +1;
КонецЦикла;
КонецПроцедуры

Листинг 7.1.9
Сохраните обработку и посмотрите на результат.

441

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

Теперь создадим вообще пустой массив и перебором добавим 10 элементов, а после
выведем их в окно сообщений.
Массив2 = Новый Массив;
Для н = 1 по 10 цикл
Массив2.Добавить(Строка(н)+ "* 2 = " + Строка(н*2));
КонецЦикла;
Для Каждого ЭлМассив2 из Массив2 цикл
Сообщить(ЭлМассив2);
КонецЦикла;

Листинг 7.1.10
Сохраните обработку и посмотрите на результат.
Разберем данный код:
Первоначально мы создаем массив из трех элементов и заполняем его числами от 0 до 2,
затем добавляем новый элемент и выводим на экран все элементы (листинг 7.1.9). Потом мы
создаем массив без элементов, в цикле добавляем элементы в виде строки и выводим их на
экран (листинг 7.1.10).
С помощью метода Добавить, можно добавлять любой элемент (и даже массив), причем
данный элемент будет иметь последний индекс в массиве. Т.е. вставать в конец массива.
Следующим разберем похожий метод – Вставить.

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

442

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

&НаКлиенте
Процедура МетодМассиваВставить(Команда)
Массив = Новый Массив;
Для н = 1 по 5 цикл
Массив.Добавить(Строка(н)+ "* 2 = " + Строка(н*2));
КонецЦикла;
Массив.Вставить(2, 100);
Массив.Вставить(10,10000);
КонецПроцедуры

Листинг 7.1.11
Выведем на экран элементы массива.
Для Каждого ЭлМассив из Массив цикл
Сообщить(?(ЭлМассив = Неопределено, "Неопределено",ЭлМассив));
КонецЦикла;

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

Метод «Удалить»
Для удаления конкретного элемента массива используется метод Удалить, единственным
параметром которого является индекс данного элемента. Это значение типа число (целое и
положительное) от нуля и выше. Если указан индекс выше верхней границы массива, то ничего не
произойдет и ошибки не будет.
Запомните: после того, как Вы удалите данный элемент, все индексы в массиве сместятся, на
место данного элемента придут те, которые стояли после него, и т.д. Помните об этом,
когда захотите удалить несколько каких-нибудь элементов.
Создадим новую команду и в обработчике этой команды создадим массив, который
заполним 10-ю элементами:
&НаКлиенте
Процедура МетодМассиваУдалить(Команда)
Массив = Новый Массив;
Для н = 1 по 10 цикл
Массив.Добавить(Строка(н)+ "* 2 = " + Строка(н*2));
КонецЦикла;
КонецПроцедуры

Листинг 7.1.13

443

Низамутдинов Ильяс

Глава 7. Универсальные коллекции значений

Удалим у этого массива первые три элемента сверху.
ИндексУдаления = 1;
Пока ИндексУдаления 100
ТОГДА "Пробег завышен"
ИНАЧЕ ПрибытиеВГараж.Пробег
КОНЕЦ

Листинг 9.2.33

Рис. 9.2.86
Не забудьте - зайдите в закладку Объединения/Псевдонимы и поменяйте название этого
поля на Пробег (после написания условия название сбросится). Самостоятельно напишите код
вывода в таблицу и посмотрите на результат.

Рис. 9.2.87

593

Низамутдинов Ильяс

Глава 9. Получение данных

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

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

Рис. 9.2.89
В открывшемся поле напишите следующий код:
ВЫБОР
КОГДА ПрибытиеВыбытиеАвтомобилей.Ссылка ССЫЛКА Документ.ПрибытиеВГараж
ТОГДА "Прибытие"
КОГДА ПрибытиеВыбытиеАвтомобилей.Ссылка ССЫЛКА Документ.ВыбытиеИзГаража
ТОГДА "Выбытие"
КОНЕЦ

Листинг 9.2.34

594

Низамутдинов Ильяс

Глава 9. Получение данных

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

Рис. 9.2.91
Синтаксис написания выражения после ключевого слова «ССЫЛКА» следующий:
НазваниеГруппыМетаданных.НазваниеМетаданного
Где:
НазваниеГруппыМетаданных – название группы метаданных в единственном числе
(«Справочник», «Документ» и т.д.);
НазваниеМетаданного – название конкретного объекта метаданных, как указанно в
конфигураторе («ПрибытиеВГараж», «МаркиАвтомобилей» и т.д.);
При помощи функции Ссылка можно также устанавливать различные условия. Доработаем
предыдущий запрос: выведем только документы ВыбытиеИзГаража.

Рис. 9.2.92
Должен получиться следующий запрос:

595

Низамутдинов Ильяс

Глава 9. Получение данных

ВЫБРАТЬ
ПрибытиеВыбытиеАвтомобилей.Ссылка КАК Ссылка,
ВЫБОР
КОГДА ПрибытиеВыбытиеАвтомобилей.Ссылка ССЫЛКА
Документ.ПрибытиеВГараж
ТОГДА "Прибытие"
КОГДА ПрибытиеВыбытиеАвтомобилей.Ссылка ССЫЛКА
Документ.ВыбытиеИзГаража
ТОГДА "Выбытие"
КОНЕЦ КАК Документ
ИЗ
ЖурналДокументов.ПрибытиеВыбытиеАвтомобилей КАК
ПрибытиеВыбытиеАвтомобилей
ГДЕ
ПрибытиеВыбытиеАвтомобилей.Ссылка ССЫЛКА Документ.ВыбытиеИзГаража

Листинг 9.2.35
Проверьте самостоятельно работу этого запроса.

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

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

596

Низамутдинов Ильяс

Глава 9. Получение данных

Рис. 9.2.93
Откройте конструктор уже существующего запроса и на закладке «Таблицы и поля» в окне
Поля выделите поле МоделиАвтомобилей.Ссылка и нажмите кнопку «Изменить текущий
элемент».

Рис. 9.2.94
В открывшемся окне напишите следующий код:
ВЫБОР
КОГДА МоделиАвтомобилей.Ссылка ЕСТЬ NULL
ТОГДА "Нет моделей у этой марки"
ИНАЧЕ МоделиАвтомобилей.Ссылка
КОНЕЦ

Листинг 9.2.37
У Вас должен получиться следующий запрос:
ВЫБРАТЬ
МаркиАвтомобилей.Ссылка КАК Марка,
ВЫБОР
КОГДА МоделиАвтомобилей.Ссылка ЕСТЬ NULL
ТОГДА "Нет моделей у этой марки"
ИНАЧЕ МоделиАвтомобилей.Ссылка
КОНЕЦ КАК Модель
ИЗ
Справочник.МаркиАвтомобилей КАК МаркиАвтомобилей
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МоделиАвтомобилей КАК МоделиАвтомобилей
ПО МаркиАвтомобилей.Ссылка = МоделиАвтомобилей.Владелец
ГДЕ
НЕ МаркиАвтомобилей.ПометкаУдаления

Листинг 9.2.38
Сохраните обработку и посмотрите на результат её работы.

597

Низамутдинов Ильяс

Глава 9. Получение данных

Рис. 9.2.95
Мы получили гораздо более красивую картинку, чем было раньше. Функция Есть null - это
метод сравнения, который возвращает Истину, если поле содержит значение null, и Ложь - в
противном случае.

ЕстьNULL
Выражение Есть NULL возвращает либо Истину, либо Ложь. Но есть еще функция,
которая, по сути, позволяет нам не использовать директиву «ВЫБОР» для подобных сравнений.
Это функция ЕстьNull.
Заменим в предыдущем запросе директиву «ВЫБОР» на данную функцию. Для этого
зайдите обратно в конструктор запроса и в соответствующее поле.
Измените данное поле.
ЕСТЬNULL(МодельАвтомобиля.Ссылка, "Нет моделей у этой марки")

Листинг 9.2.39
Сохраните обработку и посмотрите на результат. Результат будет тот же самый.
Рассмотрим синтаксис данной функции:
ЕСТЬNULL(, )
Данная функция проверяет первый параметр, и если он не равен NULL, то возвращает его,
иначе возвращает второй параметр.
Я рекомендую Вам использовать функцию ЕстьNull для замены пустых значений в полях,
но метод сравнения Есть Null Вам может пригодиться в условиях.

598

Низамутдинов Ильяс

Глава 9. Получение данных

Резюме

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

599

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Часть 1. Регистры сведений. Работа с записями
Если Вы позабыли, то напомню. Регистры сведений в системе 1С призваны хранить
информацию, которая используется в прикладной задаче. Данная информация может изменяться
со временем, тогда регистр будет периодическим, либо быть постоянной, в этом случае мы имеем
непериодический регистр сведений. Например, информация о привязке автомобиля к гаражу не
изменяется во времени, но информация о ценах на топливо изменяется каждый день (и не по
разу).

Рис. 10.1.1

Рис. 10.1.2

600

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Как Вы видите на картинках, во втором случае (рис. 10.1.2) в записях присутствует поле
Период, а в первом случае (рис. 10.1.1) данного поля нет. Вспомним, где мы указываем
периодичность регистра.

Рис. 10.1.3
Периодичность может быть разная, самая маленькая – в пределах регистратора (на одну
секунду может быть несколько документов-регистраторов), самая большая - год.

Рис. 10.1.4
Вся информация в регистрах хранится в определенных разрезах данных, которые
называются Измерениями. У регистра должно быть хотя бы одно измерение. Например, у
автомобиля может быть только один основной гараж, поэтому в регистре сведений Основной
гараж автомобиля только одно измерение – Автомобиль.

Рис. 10.1.5

601

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

А информация о ценах на топливо может храниться в двух разрезах – Тип топлива и
Поставщик топлива. Поэтому у регистра ЦеныНаТопливо два измерения – ТипТоплива и
ПоставщикТоплива.

Рис. 10.1.6
Сами данные хранятся в Ресурсах.

Рис. 10.1.7
Также можно создавать и использовать Реквизиты.

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

602

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.1.10
Когда же записи создаются документом (регистратором), то мы имеем дело с режимом
записи Подчинение регистратору (регистр сведений Цены на топливо).

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

Рис. 10.1.12

603

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Такие записи создаются при проведении документа-регистратора, соответственно при
отмене проведения документа эти записи будут уничтожаться автоматически.
Итак, всю теоретическую информацию, вкратце, Вы узнали. Самостоятельно создайте
периодический регистр сведений (с периодичностью в пределах месяца) Норма расхода, с двумя
измерениями: Автомобиль (тип СправчоникСсылка.Автмобили, ведущее) и Сезон (для
измерения Сезон создайте перечисление Сезон (Зима-Лето)) и одним ресурсом Норма (тип
число(10,2)). Добавьте его во все подсистемы и кроме полных прав дайте права роли
УчетчикТоплива (диспетчеру – чтение/просмотр).
После того, как Вы научились создавать регистры сведений, и вспомнили, какие их виды
существуют, научимся работать с ними.

Менеджер регистров
Для того чтобы работать непосредственно с регистром сведений: создать новую запись,
удалить или редактировать имеющуюся, получать выборку или срез первых (последних) и т.п., необходимо вызывать Менеджер регистров, а после уже можно проводить различные
вышеперечисленные манипуляции с регистром сведений.
Менеджер регистров сведений создается так же, как и менеджер справочников и
документов.
МенеджерНормаРасход = РегистрыСведений.НормаРасхода;
МенеджерОсновнойГараж= РегистрыСведений.ОсновнойГаражАвтомобиля;
Узнаем, как создать новую запись регистра сведений.

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

604

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.1.13
Теперь в серверном обработчике команды создадим менеджер регистра сведений и
менеджер записи.
&НаСервере
Процедура СоздатьЗаписьНаСервере()
МенеджерНормаРасход = РегистрыСведений.НормаРасхода;
МенеджерЗаписиНР
= МенеджерНормаРасход.СоздатьМенеджерЗаписи();
КонецПроцедуры
&НаКлиенте
Процедура СоздатьЗапись(Команда)
СоздатьЗаписьНаСервере();
КонецПроцедуры

Листинг 10.1.1
Объект МенеджерЗаписиНР, который мы создали, имеет тип
РегистрСведенийМенеджерЗаписи, он предназначен для чтения, редактирования и удаления
конкретной записи. Мы можем обращаться к измерениям, ресурсам и реквизитам регистра
сведений как к свойствам данного объекта.
Присвоим свойствам данного объекта значения реквизитов формы и запишем новую
запись.
&НаСервере
Процедура СоздатьЗаписьНаСервере()
МенеджерНормаРасход = РегистрыСведений.НормаРасхода;
МенеджерЗаписиНР
= МенеджерНормаРасход.СоздатьМенеджерЗаписи();
МенеджерЗаписиНР.Автомобиль = Автомобиль;
МенеджерЗаписиНР.Норма = НормаРасхода;
МенеджерЗаписиНР.Сезон = Сезон;
МенеджерЗаписиНР.Период = ТекущаяДата();
МенеджерЗаписиНР.Записать();
КонецПроцедуры

Листинг 10.1.2

605

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Листинг 10.1.3
Прокомментируем данный код. Как и в прошлый раз, мы создаем объект
РегистрСведенийМенеджерЗаписи.

606

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

607

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.1.14
В серверном обработчике команды напишем следующий код:
&НаКлиенте
Процедура ПересчитатьНормуРасхода(Команда)
ПересчитатьНормуРасходаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПересчитатьНормуРасходаНаСервере()
НормаРасхода = РегистрыСведений.НормаРасхода;
НаборНорм = НормаРасхода.СоздатьНаборЗаписей();
НаборНорм.Отбор.Автомобиль.Установить(Автомобиль);
НаборНорм.Прочитать();
Если НаборНорм.Количество() > 0 тогда
Для Каждого НормаЗапись из НаборНорм цикл
НормаЗапись.Норма = НормаЗапись.Норма*Коэффициент;
КонецЦикла;
НаборНорм.Записать();
КонецЕсли;
КонецПроцедуры

Листинг 10.1.5
Разберем строки данного кода.

608

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

609

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

Рис. 10.1.16

610

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Создадим клиентский обработчик команды, в котором напишем следующий код:
&НаКлиенте
Процедура СписокАвтомобилейЗначениеОбработкаВыбора(Элемент,
ВыбранноеЗначение,
СтандартнаяОбработка)
Если СписокАвтомобилей.НайтиПоЗначению(ВыбранноеЗначение) Неопределено
Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры

Листинг 10.1.6
Данный код не требует дополнительных пояснений, так как работу со списком значений
мы уже проходили.
После того, как мы провели всю подготовительную работу, напишем основной код в
серверном обработчике команды «Заполнить нормы расхода».
&НаСервере
Процедура ЗаполнитьНормыРасходаНаСервере()
Если СписокАвтомобилей.Количество() = 0 тогда
Возврат;
КонецЕсли;
НаборЗаписей = РегистрыСведений.НормаРасхода.СоздатьНаборЗаписей();
Для Каждого ЭлСписка из СписокАвтомобилей цикл
Если Не ЗначениеЗаполнено(ЭлСписка.Значение) Тогда
Продолжить;
КонецЕсли;
Автомобиль = ЭлСписка.Значение;
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Автомобиль = Автомобиль;
НоваяЗапись.Норма = НормаРасхода;
НоваяЗапись.Сезон = Сезон;
НоваяЗапись.Период = ТекущаяДата();
КонецЦикла;
НаборЗаписей.Записать(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьНормыРасхода(Команда)
ЗаполнитьНормыРасходаНаСервере();
КонецПроцедуры

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

611

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Причем параметр Замещать мы ставим в Ложь, чтобы не удалялись старые записи. У
данного решения есть один существенный недостаток – если уже есть запись с такими ключевыми
полями, то будет сгенерирована ошибка.

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

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

612

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

Листинг 10.1.10

613

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

614

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

615

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

616

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

617

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

618

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.2.3
В обработчике события и будем использовать процедуру ПолучитьВыборку.
&НаКлиенте
Процедура ПоставщикТопливаПриИзменении(Элемент)
ПолучитьВыборку(ТекущаяДата());
КонецПроцедуры

Листинг 10.2.2
Теперь сохраните обработку и посмотрите, как она работает.

Рис. 10.2.4

619

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

620

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

621

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.2.6
Как видите, в случае выборки вывелись все записи до Даты среза. Но в случае Среза
Последних мы имеем только одну запись, наиболее близкую к дате среза. Т.е. смысл метода Срез
Последних в том, что из имеющегося множества записей с одинаковым набором измерений,
разбросанных по датам, он выбирает ту запись, дата которой меньше даты среза и наиболее
близко к ней расположена. Если в регистре будут записи, период которых более поздний, чем
дата среза, то они не попадут в результат. Метод вернет все записи, с любыми комбинациями
измерений, дата которых меньше даты среза и наиболее близка к ней.
Поработайте с данной обработкой и посмотрите, какие записи будет возвращать метод, в
зависимости от того, какая дата указана в поле ввода.

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

622

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.2.7
Допишите код в серверном обработчике команды.
ТЗСрезПервых = РегЦеныНаТопливо.СрезПервых(ДатаСреза);
СрезПервых.Загрузить(ТЗСрезПервых);

Листинг 10.2.4
Теперь сохраните обработку и перезапустите ее.

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

623

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

То есть данный метод - полная противоположность методу СрезПоследних.
Поэкспериментируйте с новым методом самостоятельно.

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

Рис. 10.2.9

624

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.2.10
Все, Ваш запрос создан, и он имеет следующий вид:
&НаСервере
Процедура ПростаяВыборкаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|
НормаРасхода.Период КАК Период,
|
НормаРасхода.Автомобиль КАК Автомобиль,
|
НормаРасхода.Сезон КАК Сезон,
|
НормаРасхода.Норма КАК Норма
|ИЗ
|
РегистрСведений.НормаРасхода КАК НормаРасхода
|ГДЕ
|
НормаРасхода.Период 0
|
И ПрибытиеВГараж.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Не заполнен пробег! Проведение не возможно!")
Отказ = Истина;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий()
//....
КонецПроцедуры

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

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

Листинг 10.3.14
Осталось создать новую запись регистра и заполнить её поля данными из запроса.
НовЗапись = НЗПробегАвтомобиля.Добавить();
ЗаполнитьЗначенияСвойств(НовЗапись,Выборка);

Листинг 10.3.15

638

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

639

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

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

640

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.2

Рис. 10.4.3

641

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Листинг 10.4.1
В этом коде мы получили выборку регистра накопления Топливо в автомобилях, с
установленным отбором по гаражу. Затем в цикле выборки мы создаем новые строки таблицы
значений ТопливоВАвтомобилях и заполняем их.
Посмотрите, как работает Ваша обработка.

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

642

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

Листинг 10.4.2

643

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

644

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.6

Рис. 10.4.7

645

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

646

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

Листинг 10.4.4

647

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.10
Последний метод менеджера регистров накоплений, который мы рассмотрим в данной
части, это метод Остатки.

Остатки
Данный метод применим только к регистрам остатков, поэтому его работу мы будем
рассматривать на примере регистра накопления ТопливоВАвтомобилях.
Вкратце объясню, что такое Остатки. Если у нас в автомобиль было залито десять литров
топлива, а было истрачено два (по ним есть отчет), то оставшиеся восемь литров топлива - это и
будет остаток топлива по данному автомобилю. Остаток может быть положительным, а может и
отрицательным. Если, например, залито три литра топлива, а истрачено пять, то остаток будет
минус два литра топлива по автомобилю. Фактически это невозможно, но программа позволяет
такое делать, и на практике часто это встречается, особенно когда не ведется контроль
отрицательных остатков и есть привычка в оперативном учете заводить документы задним
числом. Что, конечно же, неправильно и должно пресекаться!
Для регистров накопления можно получать остатки по всем измерениями, которые есть,
также можно получать остатки по комбинации измерений. В нашем случае можно получить
остаток по измерению ТипТоплива, в этом случае в остатки будут аккумулироваться остатки по
всем автомобилям, в которые залито в данный момент какое-то топливо. Мы узнаем точное
количество остатка топлива каждого типа во всех автомобилях. Также можно получить остаток по

648

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.11

649

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

В обработчике команды напишем следующий код:

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

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

Рис. 10.4.12

650

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.14

651

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.15
Выберете ее. Теперь Вам необходимо задать отбор по автомобилю и типу топлива. Для
этого нажмите на кнопку «Параметры виртуальной таблицы» (таблица должна быть выделена).

Рис. 10.4.16
Откроется окно «Параметры виртуальной таблицы».

Рис. 10.4.17
Заносите дату, на которую мы будем получать остатки, в поле «Период». В виде параметра
&Дата в этот параметр мы и передадим дату остатков перед выполнением запроса.

652

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.4.18
Раскроем поле Условие и поставим отбор по автомобилю и типу топлива.

Рис. 10.4.19
В поле Условие параметров виртуальной таблицы Остатки регистров накоплений мы
можем накладывать любые условия на измерения регистра. Также можно передать в это поле
параметры запроса, чтобы наложить определенные ограничения на выборку данных.
При работе с виртуальными таблицами всегда накладывайте ограничения используя
именно параметры виртуальной таблицы. Неправильно накладывать ограничения
посредством директивы «ГДЕ» языка запросов! Это существенно скажется на
производительности!
Сохраните установленные параметры. Теперь Вам необходимо выбрать только одно поле
– КоличествоОстаток. Задайте псевдоним для этого поля – «Остаток».

Рис. 10.4.20

653

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.21

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

Листинг 10.4.6
Установим параметры запроса.
Запрос.УстановитьПараметр("Дата",Дата);
Запрос.УстановитьПараметр("Автомобиль",Автомобиль);
Запрос.УстановитьПараметр("ТипТоплива",ТипТоплива);

Листинг 10.4.7
А также получим и выведем результат запроса.
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
ОстатокТоплива = 0;
КонецЕсли;

654

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Выборка = Результат.Выбрать();
Выборка.Следующий();
ОстатокТоплива = Выборка.Остаток;

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

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

655

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

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

656

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.4.27
Для этого мы используем процедуры КонецПериода и НачалоПериода, являющиеся
процедурами языка запроса платформы 1С 8 и возвращающими начало или конец периода в
зависимости от второго параметра. Если указан день, это будет начало или конец дня, если указан
месяц - начало или конец месяца и т.д.
Теперь необходимо установить периодичность.
Периодичность - это то, с какой детальностью будут выводиться записи. Если мы, к
примеру, установим периодичность Месяц, то выйдут обороты по автомобилям за месяц. Если
установим периодичность Год – то за год. Также можно установить периодичность Запись, тогда
будут выведены обороты по всем записям регистра накопления. Или периодичность
Регистратор, тогда тоже будет периодичность по записям, но только с группировкой по
регистратору. Нас интересуют обороты за день. Поэтому установите периодичность День.

Рис. 10.4.28
Осталось задать условия.

Рис. 10.4.29
Выберем поля: Период и ПробегОборот (для этого поля присвоим псевдоним Пробег). А
саму таблицу переименуем в ПробегАвто.

657

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.4.30
Отсортируем результат, который выдаст виртуальная таблица по периоду.

Рис. 10.4.31
Сохраните запрос. Он должен получиться такого вида:
ВЫБРАТЬ
ПробегАвто.Период КАК Период,
ПробегАвто.ПробегОборот КАК Пробег
ИЗ
РегистрНакопления.ПробегАвтомобиля.Обороты(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ),
КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ),
День,
Автомобиль = &Автомобиль) КАК
ПробегАвто
УПОРЯДОЧИТЬ ПО
Период

Листинг 10.4.9
Передадим в запрос параметры.
Запрос.УстановитьПараметр("НачалоПериода",Период.ДатаНачала);
Запрос.УстановитьПараметр("КонецПериода",Период.ДатаОкончания);
Запрос.УстановитьПараметр("Автомобиль",Автомобиль);

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

Листинг 10.4.11

658

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Проверьте, как работает Ваша обработка.

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

Рис. 10.4.33
Посмотрите, какие данные будут на выходе:

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

Рис. 10.4.35

659

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Из списка полей сразу же убралось поле Период. Сохраните запрос, обработку и
посмотрите на результат.

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

Рис. 10.4.37
Теперь рассмотрим следующую виртуальную таблицу - это Остатки и обороты.

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

660

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.4.38
В серверном обработчике команды создадим объект Запрос и зайдем в конструктор
запроса. В конструкторе раскроем дерево регистров накопления. Обратите внимание на таблицу
Остатки и обороты Топливо в автомобиле.

Рис. 10.4.39
Выберем эту таблицу и установим параметры для нее: начало периода, конец периода и
условие отбора по автомобилю. А саму таблицу назовем «ДвижениеТопливаАвто».

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

661

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

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

Листинг 10.4.13
Сохраните обработку, запустите и посмотрите, что получилось.

Рис. 10.4.41
Как видите, вышло количество топлива в автомобиле на начало периода, на конец
периода и сколько было топлива в течение периода заправлено, а сколько израсходовано.
А теперь попробуем все посмотреть в разрезе документов. Для этого добавьте колонку
Документ в таблицу значений (составной тип документы Заправка топлива и Отчет о расходе
топлива).
Зайдем обратно в конструктор запроса и в параметр Периодичность установим значение
Регистратор.

662

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Рис. 10.4.42
Теперь в полях таблицы появилось поле Регистратор.

Рис. 10.4.43
Выберем это поле и присвоим ему псевдоним Документ. Должен получиться вот такой
запрос:
ВЫБРАТЬ
ДвижениеТопливаАвто.ТипТоплива КАК ТипТоплива,
ДвижениеТопливаАвто.КоличествоНачальныйОстаток КАК ОстатокНаНачало,
ДвижениеТопливаАвто.КоличествоПриход КАК Заправка,
ДвижениеТопливаАвто.КоличествоРасход КАК Расход,
ДвижениеТопливаАвто.КоличествоКонечныйОстаток КАК ОстатокНаКонец,
ДвижениеТопливаАвто.Регистратор КАК Документ
ИЗ
РегистрНакопления.ТопливоВАвтомобилях.ОстаткиИОбороты(НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ),
НАЧАЛОПЕРИОДА(&ДатаОкончания, ДЕНЬ),
Регистратор, ,
Автомобиль = &Автомобиль) КАК
ДвижениеТопливаАвто

Листинг 10.4.14
Сохраните запрос, обработку и посмотрите, как она работает.

663

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

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

Рис. 10.4.45
Сохраните запрос, обработку и посмотрите, что получилось.

Рис. 10.4.46
Мы видим, что границы периода убрались и информация предоставляется в удобном для
понимания виде.

664

Низамутдинов Ильяс

Глава 11. Регистры сведений и накоплений

Резюме

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

665

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

Рис. 11.1.1
Кликните правой кнопкой мышки и в открывшемся контекстном меню выберите пункт
Добавить.

666

Низамутдинов Ильяс

Глава 11. Вывод информации
Рис. 11.1.2

Открывается конструктор макетов. В данном конструкторе мы ничего не меняем, но
обращаем внимание, что тип макета выбран Табличный документ.

Рис. 11.1.3
Нажмите кнопку Готово, и мы создали макет под названием Макет.

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

667

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.5
Внутрь любой ячейки можно поместить текст, поместим в ячейку второй колонки второго
столбца текст: «Прибытие автомобиля №».

Рис. 11.1.6
Вы видите, что наш текст не уместился на одной ячейке, а сразу перешел на вторую, и
появились две линии по краям ячейки – горизонтальная и вертикальная. Эти линии ограничивают
область, которая будет выводиться на экран.
Понятно что, строка «Прибытие автомобиля…» будет выведена не полностью. Чтобы
такого не произошло, объединим ячейки, и увеличим шрифт. Для этого необходимо их выделить
(нажать левую кнопку мышки и вести по ячейкам курсор с нажатой кнопкой).

Рис. 11.1.7
После перейдите в «Главное меню» - «Таблица» - «Ячейки» и нажмите на кнопку
Объединить.

668

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.8
Видите: ячейка стала одна.

Рис. 11.1.9
Измените величину шрифта на 14 (ячейка должна быть выделена).

Рис. 11.1.10
Ячейка увеличилась, и текст опять не помещается. Снова объедините ячейки с двумя
соседними. Для этого нужно снять имеющееся объединение, также выделив ячейки и нажав на
кнопку Объединить в меню «Главное меню» - «Таблица» - «Ячейки». И заново объединить в этот
раз четыре ячейки.

669

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.11
Помните: все, что Вы напишете в данной таблице, будет, при определенных условиях,
выведено в печатную форму.
Теперь нам необходимо передать номер и дату документа прибытия в макет.
Как это сделать? Делается это достаточно просто: необходимо изменить свойство Заполнение
ячейки.
Внесите текст в следующую ячейку после объединенной (сузьте крайнюю объединенную
колонку) и измените шифр на 14.

Рис. 11.1.12
Далее Вам нужно сделать так, чтобы в ячейку можно было передавать номер документа
(как это делается, мы изучим немного позже). А пока настроим ячейку на такую возможность. Для
этого откройте свойства ячейки: выделите ее и кликните правой кнопкой мышки, выйдет
контекстное меню, где выберите пункт Свойства.

Рис. 11.1.13
Откроется палитра свойств этой ячейки, и в них обратите внимание на свойство
Заполнение.

670

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.14
Измените его значение в Параметр.

Рис. 11.1.15
После этого, обратите внимание, слово Номер закрылось треугольными скобками.

Рис. 11.1.16
Добавим еще и дату. Ячейке со словом Дата также поставьте свойство
Заполнение в значение Параметр.

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

671

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.18
Установим нужный формат даты.

Рис. 11.1.19
Теперь у многих из вас может возникнуть вопрос: а можно ли передавать параметр внутрь
текста? Да, можно, для этого необходимо устанавливать свойство Заполнение в значение Шаблон.
Напишите через строку следующий текст: «Автомобиль [Автомобиль] прибыл в [Гараж]
[ДатаПрибытия]». Поставьте 12 шрифт и объедините ячейки.

Рис. 11.1.20
Перейдем в палитру свойств объединенной ячейки и установим в свойство Заполнение
значение Шаблон.

672

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

Рис. 11.1.23
Текст «Ответственный» и «Подпись» сдвинут влево. Сделаем этот текст по центру ячейки.
Для этого выделим объединенную ячейку и в свойство ГоризонтальноеПоложение установим
значение Центр.

673

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.1.25
После этого перейдите в меню (область должна оставаться выделенной) «Главное меню» «Таблица» – «Имена» – «Назначить имя».

Рис. 11.1.26

674

Низамутдинов Ильяс

Глава 11. Вывод информации

Создайте область и назовите ее Основная.

Рис. 11.1.27
После назначения области макет должен приобрести следующий вид:

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

Листинг 11.1.1

675

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

676

Низамутдинов Ильяс

Глава 11. Вывод информации

&НаСервере
Функция ПечатьНаСервере()
ОбъектДок = РеквизитФормыВЗначение("Объект");
ТабДок = ОбъектДок.Печать();
Возврат ТабДок;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
ТабДок = ПечатьНаСервере();
ТабДок.Показать();
КонецПроцедуры

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

Рис. 11.1.29
Дата прибытия во второй строке печатной формы выходит не очень красиво. Сделайте
вывод даты прибытия в более удобном формате.
Данный метод вывода на печать является более хрестоматийным, чем практическим. Так
сделано, чтобы Вам было проще понять работу с табличным документом. Более практично
печатные формы выводить, используя команды объекта. Более подробно работа с командами
объекта дается в книге «Основы разработки в 1С: Такси».

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

677

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.1.30
Создайте новую область с 5-ю строками у нового макета и назовите ее Шапка (как
создавать новые области, см. стр. 674).

Рис. 11.1.31
Напишите во второй ячейке второй строки следующий текст:
Цены на топливо поставщика [Поставщик] от [Дата]
Увеличьте шрифт, установите значение свойства Заполнение в Шаблон.
И объедините ячейки по всей длине строки.

Рис. 11.1.32

678

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.1.33
В первой ячейке напишите «№» и обведите ее границей.

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

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

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

679

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.37
В первой ячейке напишем Номер, сделаем эту ячейку параметром (свойство Заполнение –
Параметр), обведем ее, горизонтальное положение для неё будет Право.

Рис. 11.1.38
Следующие пять ячеек объединяем, напишем слово ТипТоплива, сделаем эту
объединенную ячейку параметром (свойство Заполнение – Параметр). Горизонтальное
положение для неё будет Право.

Рис. 11.1.39
В последней ячейке напишем слово Цена, сделаем её параметром. Горизонтальное
положение для неё будет Право. Всем ячейкам установите 12 шрифт.

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

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

680

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.42
Объедините ячейки под заголовком Тип топлива и напишите следующий текст в них:
Всего [КолТипов] типов топлива.
Сделайте эту объединенную ячейку шаблоном, выделите жирным и установите для неё 12
шрифт.

Рис. 11.1.43
Теперь Вам осталось создать подвал документа. Создадим новую область, которую
назовем Подвал. И разместим в этой области подписи и расшифровку.

Рис. 11.1.44
Все, макет Вы создали, теперь осталось его вывести на экран. Сделаем это по аналогии с
выводом простого макета: в модуле документа создадим экспортную функцию
ПечатьРеестраЦен.
Функция ПечатьРеестраЦен() Экспорт
КонецФункции

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

681

Низамутдинов Ильяс

Глава 11. Вывод информации

И первым запросом мы получим параметры шапки. Создайте объект «Запрос» и зайдите в
конструктор запроса, где выберите таблицу Установка цен на топлив и поля Дата и Поставщик.

Рис. 11.1.45
Перейдите на закладку Условие и установите условие:

Рис. 11.1.46
Запрос создан, нажмите кнопку ОК и сохраните его, передайте в запрос параметры и
сделайте выборку.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|
УстановкаЦенНаТопливо.Дата КАК Дата,
|
УстановкаЦенНаТопливо.Поставщик КАК Поставщик
|ИЗ
|
Документ.УстановкаЦенНаТопливо КАК УстановкаЦенНаТопливо
|ГДЕ
|
УстановкаЦенНаТопливо.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();

Листинг 11.1.4
Следующим шагом создадим табличный документ и получим макет.
ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");

Листинг 11.1.5
Сразу же создадим все области, которые есть в макете.
ОблШапка
= Макет.ПолучитьОбласть("Шапка");
ОблШапкаТабл = Макет.ПолучитьОбласть("ШапкаТаблицы");

682

Низамутдинов Ильяс

Глава 11. Вывод информации

ОблТаблица
= Макет.ПолучитьОбласть("Таблица");
ОблПодвалТаб = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОблПодвал
= Макет.ПолучитьОбласть("Подвал");

Листинг 11.1.6
Названия областей в кавычках, передаваемые в параметр метода ПолучитьОбласть,
должны совпадать с названиями областей в макете.
После того как области созданы, мы будем их заполнять, если у них есть параметры, и
последовательно выводить в результирующий табличный документ.
Заполните параметры области Шапка. Для этого воспользуемся методом Заполнить
объекта ПараметрыМакетаТабличногоДокумента. Данный метод заполняет параметры из
значений свойств переданного объекта. В качестве параметра в этот метод будем передавать
выборку Шапка, которую мы получили с помощью метода Выбрать результата запроса. И
которую мы позиционировали на первом элементе выборки при помощи метода Следующий.
ОблШапка.Параметры.Заполнить(Шапка);
ОблШапка.Параметры.Дата = Формат(Шапка.Дата,"ДЛФ=DD");

Листинг 11.1.7
Один параметр мы заполнили вручную. Это Дата.
Теперь выведем область Шапка в результирующий табличный документ. А также выведем
область Шапка таблицы, так как в ней нет никаких параметров.
ТабДокумент.Вывести(ОблШапка);
ТабДокумент.Вывести(ОблШапкаТабл);

Листинг 11.1.8
Сначала всегда заполняем область, а потом выводим её в табличный документ!
Далее необходимо вывести все типы цен и цены, которые есть в табличной части. Сделаем
мы это благодаря одной особенности областей: их можно выводить в табличный документ
неограниченное количество раз.
Но перед этим получим данные из табличной части. Создайте новый текст запроса и
зайдите в конструктор запроса, где необходимо выбирать табличную часть документа Установка
цен на топливо (переименуем эту таблицу в ЦеныТоплива) и поля НомерСтроки, ТипТоплива и
Цена.

683

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.1.47
Перейдите на закладку Условие и установите условие:

Рис. 11.1.48
Переименуем поле НомерСтроки в просто Номер.

Рис. 11.1.49
Сохраним запрос, установим параметры и получим выборку.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|
ЦеныТоплива.НомерСтроки КАК Номер,
|
ЦеныТоплива.ТипТоплива КАК ТипТоплива,
|
ЦеныТоплива.Цена КАК Цена
|ИЗ
|
Документ.УстановкаЦенНаТопливо.ЦеныТоплива КАК
ЦеныТоплива
|ГДЕ
|
ЦеныТоплива.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

Листинг 11.1.9

684

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Листинг 11.1.10
После цикла заполним параметры подвала таблицы. И выведем подвал таблицы и общий
подвал.
ОблПодвалТаб.Параметры.КолТипов = Выборка.Количество();
ТабДокумент.Вывести(ОблПодвалТаб);
ТабДокумент.Вывести(ОблПодвал);

Листинг 11.1.11
И поскольку у нас Печать - это функция модуля документа, то мы вернемтабличный
документ.
Возврат ТабДокумент;

Листинг 11.1.12
Теперь по аналогии с документом Прибытие в гараж создадим команду формы
ПечатьРеестра, которую разместим в командной панели формы.

Рис. 11.1.50
Создадим обработчик этой команды на клиенте. И напишем следующий код:

&НаСервере
Функция ПечатьРеестраНаСервере()
ОбъектДок = РеквизитФормыВЗначение("Объект");
ТабПечати = ОбъектДок.ПечатьРеестраЦен();
Возврат ТабПечати;
КонецФункции

685

Низамутдинов Ильяс

Глава 11. Вывод информации

&НаКлиенте
Процедура ПечатьРеестра(Команда)
ТабРеестра = ПечатьРеестраНаСервере();
ТабРеестра.Показать();
КонецПроцедуры

Листинг 11.1.13
В этом коде мы в функции ПечатьРеестраНаСервере получаем объект документа при
помощи метода формы РеквизитФормыВЗначение. Этот объект нам нужен, чтобы использовать
экспортную функцию модуля объекта ПечатьРеестраЦен. Благодаря этой функции мы получаем
табличный документ, который и возвращаем. А в процедуре ПечатьРеестра мы этот табличный
документ выводим на экран.
Должна получиться такая печатная форма:

Рис. 11.1.51
Как Вы видите, печатная форма вышла в том виде, в каком мы и хотели.

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

686

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

Рис. 11.2.1

687

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.2.2
Теперь Вам необходимо создать форму отчета и макет. Первым делом создадим форму
отчета.

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

Рис. 11.2.4
«Перетащите» реквизит на форму. Будет создан элемент формы поле ввода с новым для
Вас видом - Поле табличного документа.

688

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.2.5
Создадим команду Печать, которую разместим на форме.

Рис. 11.2.6
Создадим макет этого внешнего отчета.

Рис. 11.2.7
Тип макета оставим по умолчанию – табличный документ.

689

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.2.8
В данном макете создайте четыре области. Первую назовите Шапка.

Рис. 11.2.9
Вторую – ШапкаТаблицы.

Рис. 11.2.10
Третья область – СтрокиТаблицы.

Рис. 11.2.11

690

Низамутдинов Ильяс

Глава 11. Вывод информации

Четвертая область – Подвал.

Рис. 11.2.12
В первой области напишите следующий текст: «Список автомобилей», установим тексту 14
шрифт и объединим ячейки.

Рис. 11.2.13
В шапке таблицы в каждой ячейке напишем «№», «Название авто», «Год выпуска», «Гос.
номер», «Марка» и «Модель». Обведем их границами, установим 12 шрифт, и раздвинем
колонки, чтобы все названия влезли.

Рис. 11.2.14
В области Строки таблицы напишите те же названия: «Номер», «НазваниеАвто»,
«ГодВыпуска», «ГосНомер», «Марка» и «Модель», только установите для каждой ячейки в
свойство Заполнение значение Параметр, обведем ячейки и установим для них 12 шрифт.

Рис. 11.2.15

691

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.2.16
В подвале проведите жирную черту, чтобы она выходила на нижней границе таблицы. Для
этого выделяем верхние ячейки подвала.

Рис. 11.2.17
Переходим в палитру свойств для всех этих ячеек (можно открыть общее свойство для
нескольких ячеек) и поставим для них верхнюю границу с двойной линией.

Рис. 11.2.18
Макет готов, теперь осталось написать вывод информации в данный макет. Делать мы это
будем в обработчиках команды Печать, которую создали ранее. Создайте обработчики этой
команды на сервере и на клиенте. И в серверном обработчике напишем код, который будет
выводить информацию об автомобилях в табличный документ.
&НаСервере
Процедура ПечатьНаСервере()
ТаблДокумент.Очистить();

692

Низамутдинов Ильяс

Глава 11. Вывод информации

ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
Макет = ОтчетОбъект.ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьСтрокиТаблицы = Макет.ПолучитьОбласть("СтрокиТаблицы");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ТаблДокумент.Вывести(ОбластьШапка);
ТаблДокумент.Вывести(ОбластьШапкаТаблицы);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|
Автомобили.Наименование КАК НазваниеАвто,
|
Автомобили.ГодВыпуска КАК ГодВыпуска,
|
Автомобили.ГосНомер КАК ГосНомер,
|
Автомобили.Марка КАК Марка,
|
Автомобили.Модель КАК Модель
|ИЗ
|
Справочник.Автомобили КАК Автомобили
|ГДЕ
|
НЕ Автомобили.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Номер = 1;
Пока Выборка.Следующий() Цикл
ОбластьСтрокиТаблицы.Параметры.Заполнить(Выборка);
ОбластьСтрокиТаблицы.Параметры.Номер = Номер;
ТаблДокумент.Вывести( ОбластьСтрокиТаблицы);
Номер = Номер + 1;
КонецЦикла;
ТаблДокумент.Вывести(ОбластьПодвал);
КонецПроцедуры
&НаКлиенте
Процедура Печать(Команда)
ПечатьНаСервере();
КонецПроцедуры

Листинг 11.2.1
В этом коде мы обращаемся к реквизиту формы с типом ТабличныйДокумент напрямую и
первым делом его очищаем. Потом получаем Макет нашего отчета, используя метод
ПолучитьМакет объекта ВнешнийОтчет. Этот объект является основным реквизитом формы.

693

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.2.20

Отчеты на СКД

В этой части мы научимся делать самые простые отчеты на СКД. Я не буду подробно
вдаваться в основы работы под СКД, а покажу самые азы работы, чтобы Вам было в дальнейшем с
чего начинать. Если Вы захотите углубить этот вопрос, то сможете найти соответствующую
литературу, курсы и т.д. После этой книги весь узконаправленный материал Вами легче усвоится.
Что такое СКД? СКД - это инструмент платформы 1С, который позволяет гибко и
динамически получать данные из базы. Мы научимся создавать простейшие отчеты на СКД.
Для тренировки сделаем внешний отчет из 10-й главы, где мы в запросе получали обороты
по регистру накопления ТопливоВАвтомобилях.

694

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.2.21

Рис. 11.2.22

Нажимаем кнопку «Готово», и откроется конструктор СКД.

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

695

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.2.24
После добавления набора данных – запрос, внизу появится поле запроса, а вверху таблица
полей, которая пока пустая. Для добавления запроса нажмем кнопку «Конструктор запроса».

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

Рис. 11.2.26

696

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

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

697

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.2.30
Перейдем на закладку «Параметры», Вы видите, СКД автоматически подставило начало
периода и конец периода.

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

698

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

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

699

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.2.35
Сделаем возможность установки отбора по автомобилю. Для этого перейдем на закладку
«Отборы» и выберем поле «Автомобиль».

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

Рис. 11.2.37

700

Низамутдинов Ильяс

Глава 11. Вывод информации

Осталось настроить вид отображения пользователю. Для этого обратите внимание на
верхнее окно. Зададим в нем две группировки – Автомобиль и ТипТоплива. Для этого нажмите на
кнопку «Добавить» и выберите Новая группировка.

Рис. 11.2.38
В открывшемся окне «Группировка» выберем поле «Автомобиль».

Рис. 11.2.39
Поскольку нам нужно сделать две группировки Автомобиль – ТипТоплива, то добавим
поле ТипТоплива, которое будет подчинено уже добавленному полю Автомобиль.
Для этого выделите уже добавленное поле Автомобиль и добавьте поле ТипТоплива, как
мы это уже делали.

Рис. 11.2.40

701

Низамутдинов Ильяс

Глава 11. Вывод информации

Должна получиться следующая иерархия:

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

Рис. 11.2.42
Все. Сохраните отчет и запустите его в «1С:Предприятии».

Рис. 11.2.43
Первым делом обратите внимание, что у нас на форме есть поля «Период» и
«Автомобиль», так получилось потому, что мы установили флажки «Включать в пользовательские
настройки». Причем у поля Период уже установлен флаг (значит, данные будут браться), а у поля
Автомобиль – нет. Это потому, что мы поставили (или убрали) флаг у соответствующего поля (см.
рис. 11.2.44).

702

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.2.44
Сформируем отчет.

Рис. 11.2.45
Сформируем отчет с отбором по автомобилю.

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

703

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.3.1
Зайдем в палитру свойств этого реквизита.

704

Низамутдинов Ильяс

Глава 11. Вывод информации

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

Рис. 11.3.3

705

Низамутдинов Ильяс

Глава 11. Вывод информации

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

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

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

706

Низамутдинов Ильяс

Глава 11. Вывод информации

Добавим в имеющийся динамический список поля ГосНомер и ГодВыпуска реквизита
Автомобиль (сделайте это сами, воспользовавшись кнопкой «Конструктора запроса»).

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

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

707

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.3.8
Установим свойство ПроизвольныйЗапрос и в настройках списка сделаем запрос по
таблице «Автомобили», не забыв указать её в качестве основной таблицы и не забыв поставить
флаг «Динамическое считывание данных».

Рис. 11.3.9
Сохраним эту настройку, и у нас сразу же нужные поля появятся в списке.

708

Низамутдинов Ильяс

Глава 11. Вывод информации

Рис. 11.3.10
Перетащим динамический список на форму, он отобразится в виде элемента Таблица
(самостоятельно сделайте для Вас удобное расположение полей).

Рис. 11.3.11
Сохраним обработку и откроем её в «1С:Предприятии».

709

Низамутдинов Ильяс

Глава 11. Вывод информации

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

710

Низамутдинов Ильяс

Программировать в 1С за 11 шагов

Заключение
Поздравляю! Вы дочитали до конца эту книгу. Если Вы осилили весь материал, прорешали
все примеры и задачи, то у Вас есть отличные шансы начать успешно программировать в среде 1С.
Но главное - не останавливаться на достигнутом: постоянно двигайтесь вперед, постоянно
получайте новые для Вас знания и умения. И постоянно занимайтесь программированием и
разработкой. Если Вы после прочтения этой книги не будете применять эти знания на практике, то
всё, что Вы изучили, забудется через полгода.
И я очень надеюсь, что материал этой книги пригодится Вам в практическом применении,
что Вы станете программировать, возможно, устроитесь работать программистом 1С (пусть даже
стажером) и начнете свой профессиональный рост.
У Вас всё получится!

711