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

А.П. Габец, Д.И.

Гончаров

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

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

Москва
ООО «1С-Паблишинг»
2005
УДК 658.012.011.56:004.42
ББК 65.29
Г12

Габец Андрей Петрович, Гончаров Дмитрий Игоревич


Г12 1С:Предприятие 8.0. Простые примеры разработки,
М.: ООО «1С-Паблишинг», 2005. - 420 с: ил.
ISBN 5-9677-0056-0

Книга представляет собой справочное пособие, иллюстрирующее


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

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

ISBN 5-9677-0056-0 ООО "1С-Па6лишингм, 2005


ОГЛАВЛЕНИЕ
Введение 16
Как работать с изданием? 17

Примитивные типы, системные функции 18


(D Как явно указать нужную дату? 18
Как проверить дату на пустое значение? 18
Как сравнить две даты (дни)? 19
Как прибавить к дате день, месяц? 19
Как можно проверить тип значения переменной на равенство
нужному? 20
Как очистить реквизит формы, имеющий ссылочный тип? 21
Как очистить значение, имеющее тип «Хранилище значения»? 21
Как проверить тип значения, помещенного в реквизит
имеющий тип «Хранилище значения»? 21
Как сжать данные, помещаемые в хранилище значения? 22
Как предоставить пользователю возможность выбора значения
составного типа? 23
Как применить округление при работе с вычисляемыми
числовыми полями в запросе? 24
Как вывести многострочное предупреждение? 24
Как при выполнении обработки сообщить пользователю текущее
время? 25
Как вывести число прописью по-русски, но без дробной части? 25
Как вывести число прописью по-русски, с указанием сотых в
дробной части? 26
Как вывести прописью число килограммов с указанием дробной
части в граммах? 27
Как долларовую сумму вывести прописью по-английски? 27
Как загрузить внешнюю компоненту? 27
Как выполнить команду операционной системы? 28
Как реализовать код процедуры в зависимости от режима
выполнения (на клиенте, на сервере, во внешнем
соединении) ? 29
Как при групповой обработке объектов реализовать стратегию
«либо все, либо ничего»? 30
Как посчитать сумму по формуле сложного процента? 31

Универсальные коллекции 32
Массив 32
(D В каких ситуациях обычно используются массивы? 32
® Как создать массив? 32
ф Как создать многомерный массив? 33
ф Как добавить элементы в массив? 34
Оглавление

Ф Как определить размер массива? 34


ф Как обратиться к элементу массива? 34
® Как перебрать элементы массива? 35
ф Как удалить элемент массива? 36
ф Как удалить все элементы массива? 37
Как удалить повторяющиеся элементы массива? 37
Как скопировать массив? 38
Как проверить, что два массива идентичны? 39
В массив выгружены данные, содержащие наименования
контрагентов. Как их отсортировать? 40
Есть массив, в который выгружены значения типа
СправочникСсылка.Номенклатура. Как удалить все пустые
значения массива? 41
Как получить массив номенклатурных позиций, использованных
в табличных частях «Номенклатура» и «Тара» накладной? 42
Есть две таблицы значений. Как получить массив совпадающих
имен колонок? 43
Как в запросе сделать отбор по нескольким вариантам
заполнения реквизита типа «ПеречислениеСсылка»? 44
Как из регистра сведений «РасчетчикиЗарплатыОрганизации»
получить в виде массива всех расчетчиков зарплаты
определенного подразделения организации? 45
Структура 47
Ф В каких ситуациях обычно используются объекты типа
«Структура»? 47
ф Как создать структуру? 47
ф Как добавить элементы в структуру? 48
Ф Как обратиться к элементу структуры? 48
ф Как перебрать элементы структуры? 49
ф Как удалить элемент структуры? 50
Как в структуре установить значение для элемента с
определенным ключом? 50
Как получить в структуру многомерные данные? Как собрать
информацию по установленным в форме журнала отборам? 51
Как определить, есть ли в структуре элемент с ключом
«Контрагент», и если есть, но содержит пустое значение
справочника или Неопределено — удалить этот элемент? 52
Как из табличной части «Товары» документа получить все
строки, где значение реквизита «Цена» равно нулю, а
значение реквизита «СтавкаНДС» равно значению «НДС 18»
перечисления «СтавкиНДС»? 53
Как получить данные о текущей учетной политике
бухгалтерского учета организации из периодического
регистра сведений на заданную дату? 53
Как сформировать структуру названий реквизитов табличной
части произвольного документа? 55
Как получить запросом данные табличной части документа, имея
структуру названий реквизитов табличной части? 55
Соответствие 57
Оглавление

ф В каких ситуациях обычно используются объекты типа


«Соответствие»? 57
ф Как создать соответствие? 57
ф Как добавить элементы в соответствие? 57
ф Как обратиться к элементу соответствия? 58
Ф Как перебрать элементы соответствия? 58
ф Как удалить элемент соответствия? 59
Как получить данные из соответствия? 59
Как получить многоуровневое соответствие видов расчетов,
обладающих базовыми видами расчетов? 60
Список значений, таблица значений, дерево значений 63
ф В каких ситуациях обычно используются списки значений,
таблицы значений, дерево значений? 63
ф Как создать список значений? 64
ф Как добавить элементы в список значений? 64
ф Как найти элемент списка значений? 65
ф Как обратиться к элементу списка значений? 65
ф Как перебрать элементы списка значений? 66
ф Как удалить элемент списка значений? 66
ф Как создать таблицу значений и заполнить ее поля? 67
ф Как найти значение в таблице значений? 68
® Как перебрать строки таблицы значений? 69
ф Как удалить строки (колонки) таблицы значений? 69
Как заполнить таблицу значений, если имена колонок
содержатся в переменных? 71
Как заполнить всю колонку таблицы значений нужным
значением? 71
Как таблицу значений «ТаблицаПолучатель» заполнить данными
таблицы значений «ИсходнаяТаблица»? 72
Как добавить колонки к таблице значений «ТаблицаЗначений» с
ограничениями по типу? 74
Как изменить тип значения колонки таблицы значений,
полученной выгрузкой из запроса? 75
Как самостоятельно заполнить дерево значений? 76

Прикладные объекты 78
Справочники 78
Ф Как создать элемент (группу) справочника? 78
ф Как найти элемент справочника? 80
ф Как удалить элемент справочника? 81
ф Как перебрать элементы справочника? 82
ф Как выбрать все элементы из определенной группы? 83
Ф Как перебрать элементы подчиненного справочника с
помощью запроса? 85
Ф Как перебрать элементы подчиненного справочника с
помощью выборки справочника? 86
ф Как открыть форму списка (элемента) справочника? 86
Оглавление

ф Как добавить запись в табличную часть элемента


справочника? 87
ф Как удалить строки из табличной части справочника? 87
Ф Как перебрать строки табличной части справочника? 88
Ф Как создать элемент в нужной группе? 89
Как узнать, есть ли у текущего элемента подчиненные? 90
Как узнать количество подчиненных элементов у выбранного
элемента справочника? 91
Как узнать количество подчиненных элементов у выбранного
элемента справочника, если количество подчиненных
справочников больше чем один? 93
Как получить всех родителей выбранного элемента справочника? 94
Как получить запросом «полный» код элементов справочника,
если тип кода - Строка? 96
Как получить все элементы справочника, содержащие в
наименовании определенную подстроку, со всей иерархией, в
которую они входят? 97
Как найти все элементы справочника, в которых не заполнен
строковый реквизит? 98
Как перенести все элементы справочника «Контрагенты» из
одной группы в другую? 99
Как организовать программный выбор элемента справочника? 100
Как сохранить фотографию сотрудника в справочнике
«Сотрудники»? 102
Документы 104
® Как создать новый документ? 104
ф Как найти документ? 104
Ф Как открыть форму документа? 105
ф Как изменить значение реквизита и записать документ? 106
Ф Как добавить строку в табличную часть документа, имея
ссылку на документ? 107
ф Как удалить строки из табличной части документа? 107
ф Как перебрать строки документа? 108
ф Как выгрузить табличную часть документа? 108
ф Как посчитать итог в табличной части документа? 108
ф Как провести документ? 109
ф Как перебрать документы? 109
ф Как пометить на удаление все приходные накладные? 111
ф Как, имея ссылку на документ, создать в базе его копию? 111
ф Как, имея ссылку на документ, прочитать его движения по
регистру? 112
Как определить, по каким регистрам документ выполнил
движения? 113
Как в табличной части документа удалить строки с нулевым
значением реквизита «Количество»? 115
Как очистить колонку «СтавкаНДС» в табличном поле
«Товары» уже заполненного документа? 116
Как заполнить значения свойств нового документа на основании
существующего? 117
Оглавление

Как получить перечень приходных накладных, в которых не


заполнены номенклатурные позиции? 118
Как на дату расходной накладной определить курс валюты
управленческого учета? Валюта управленческого учета
храниться в периодическом регистре сведений 119
Как из формы документа вызвать его неоперативное
проведение? 120
Как в обработке проведения получить остатки, актуальные на
позицию документа? 121
Как определить количество документов и количество разных
значений реквизита в таблице записей документа? 122
В последовательность «ПартионныйУчет» добавлено измерение
«Организация». Как теперь получить данные по границам
последовательности для каждого значения этого измерения? 123
Хранение сведений 124
® Как добавить запись в непериодический независимый регистр
сведений? 124
ф Как считать содержимое непериодического независимого
регистра сведений? «СобственныеКонтрагенты»? 125
Ф Как удалить все записи из независимого регистра сведений? 126
ф Как удалить записи независимого регистра сведений с
отбором по конкретной организации? 126
ф Как добавить запись в периодический независимый регистр
сведений? 127
ф Как прочитать (изменить) записи в периодическом
независимом регистре сведений? 128
ф Как удалить записи в периодическом независимом регистре
сведений? 128
Как в периодическом независимом регистре сведений
«КурсыВалют» удалить все записи по валютам с
наименованиями «EUR» и «USD», период которых меньше
01 января 2005 года? 129
Как прочитать данные, актуальные на определенную дату, из
регистра сведений «Курсы валют» с отбором по нескольким
валютам (отбор по измерениям)? 131
Как поменять период у записей периодического независимого
регистра, соответствующих ряду условий? 132
Как «сделать периодическим» реквизит уже заполненного
справочника? 134
ф Как добавить записи в регистр сведений, подчиненный
регистратору? 137
ф Как прочитать (изменить) записи в регистре сведений,
подчиненном регистратору? 138
ф Как удалить записи из регистра сведений, подчиненного
регистратору? 139
Бухгалтерский учет 140
Ф Как в регистре бухгалтерии сформировать проводки? 140
ф Как получить остаток по счету? 142
ф Как получить обороты по счету? 143
ф Как получить остатки но счетам? 143
Оглавление

Ф Как перенести остаток со счета на счет? 144


Как найти первый документ, приведший к появлению
кредитового остатка на счете? 145
Как выбрать все счета, в аналитике которых присутствуют либо
вид субконто «Контрагент», либо вид субконто «Договор»? 146
Как выбрать все счета, в аналитике которых присутствуют как
вид субконто «Контрагент», так и вид субконто
«Номенклатура»? 147
Как добавить новый вид субконто к счету? 147
Как из регистра бухгалтерии «Хозрасчетный» получить обороты
только по валютным счетам? 149
Как выбрать в регистре бухгалтерии «Хозрасчетный» обороты по
«60-ым» счетам, исключив внутренние обороты между ними? 151
Как реализовать метод «красного сторно» для регистра
бухгалтерии? 152
Сложные периодические расчеты 154
(D Как получить сумму начисления по конкретному виду расчета
указанному сотруднику в указанном периоде? 154
(D Как получить сумму всех начислений указанному сотруднику
в указанном периоде? 155
Как получить таблицу перерасчетов по перерасчетам нескольких
регистров? 156
Как для документа «НачислениеЗарплатыРаботникам»
определить номера строк записей полностью вытесненных
видов расчета? 157
Как сформировать расчетный листок сотрудника? 158
Как организовать сторнирование уже произведенных расчетов
прошлых периодов? 159
Бизнес-процессы 162
Как определить бизнес процесс, в котором количество
последовательных этапов определяется индивидуально на
момент старта экземпляра процесса? 162
Как при работе с бизнес процессами отказаться от стандартного
способа формирования задачи и сформировать ее
программно? 167
Прочие прикладные объекты 169
ф Как, не открывая форму внешней обработки, выполнить ее
процедуру для определенного объекта? 169
(D Как быстро получить информацию, по всем объектам,
находящимся в компетенции конкретного менеджера
(элемент справочника «Пользователи») по продажам? 169

Формы и элементы управления 172


Работа с формами 172
(D Как открыть форму документа? 172
Ф Как открыть форму внешней обработки? 172
(D Как отрыть форму отчета так, чтобы она не перекрывала
собой ту форму, из которой она открыта? 173
Оглавление

® Как открыть форму отчета на весь экран? 173


Как из формы документа открыть форму списка данного
документа, спозиционировавшись на нем же? 174
® В документе есть реквизит «Контрагент». Как открыть форму
подчиненного ему справочника «ДоговорыКонтрагентов»? 175
ф Как в форме отобразить картинку, сохраненную в реквизите
справочника? 176
ф Как в журнале документов «УчетКадров» отобрать только
документы «ПриемНаРаботу»? 176
ф Как узнать интервал дат в открытом текущем журнале? 177
Как при открытии справочника сделать отбор по контрагентам,
входящим в список? 177
Как обеспечить, чтобы для выбора значения покупателя в
расходной накладной справочник контрагенты открывался
сразу с открытой группой «Покупатели»? 178
Табличное поле 181
ф Как запретить пользователю изменять порядок следования
колонок в табличном поле? 181
Ф Как запретить пользователю изменять любые настройки
колонок табличного поля? 181
ф Как вывести информацию о том, какой отбор установлен в
журнале документов? 182
ф Как в форме справочника установить курсор на элемент с
известным наименованием? 182
ф Как в форме списка сделать отбор по значению реквизита? 183
ф Как запретить выдачу сообщения: «Введенные данные не
отображены в списке, так как не соответствуют отбору» при
добавлении новых элементов в справочник? 184
ф Как заполнить ячейку табличного поля данными? 185
Как изменить цвет фона ячейки табличного поля в зависимости
от значения, выводимого в нее? 186
Как в табличное поле «ВыбранныеКонтрагенты» добавить новую
колонку «ОсновнойДоговор», заполнить ее значения и дать
возможность открытия этих значений? 187
Как задать список выбора для колонки «ВидДокумента»
табличного поля? 189
Как обеспечить возможность отбора и сортировки данных по
реквизитам, не отображаемым в табличном поле формы
списка справочника? 190
Как реализовать перетаскивание между элементами управления? 190
Как вывести остатки на складах в списке номенклатуры? 193
Другие элементы управления 194
® В форме есть панель со страницами. Как разместить картинку
на закладке? 194
Ф Как обеспечить, чтобы при открытии формы уже записанного
элемента справочника «Контрагенты» активной была
закладка «СчетаИДоговоры» панели «Панель»? 195
Как организовать выбор из нескольких списков документов для
открытия? 195
Как можно организовать подстановку обращения к персоне? 197
Оглавление

Как в командной панели создать подменю с кнопками? 198


Как созданной кнопке назначить «горячие клавиши»? 200
Как реализовать заполнение возможных значений поля выбора
«ОбрабатываемаяТабличнаяЧасть» при заполнении поля
ввода «ОбрабатываемыйДокумент»? 201
ф Если пользователь указал несколько дат в поле календаря -
как их перебрать? 202
ф Как организовать работу с индикатором? 203
Как у элемента управления сменить источник данных? 205
ф Как задать представление даты, отображаемое в поле ввода
по-умолчанию? 206
Ф Как вывести текст в поле картинки в том случае, если
картинка не выбрана? 209
Ф Как открыть пользователю стандартный диалог выбора цвета? 211
Как заполнить список в форме данными запроса? 212
ф Как отобразить в форме файл графической схемы? 212
Интерфейсы, стили 213
ф Как задать различные стили 1С:Предприятия для различных
категорий пользователей? 213
Есть список имен интерфейсов с пометками. Как сделать
помеченные интерфейсы видимыми? 214
Как из формы обработки отключить глобальный обработчик
ожиданий? 215

Запросы, отчеты 216


Запросы 216
Как получить данные из табличной части документов? 216
Как получить данные из табличной части документов и
представить их в иерархическом виде? 217
Как подсчитать количество одинаковых элементов в выбираемых
данных? 218
Как применять условия для отбора по значениям полей,
вычисленных как результат агрегатной функции? 219
Как ограничить выборку из виртуальной таблицы? 220
Как просуммировать данные по одинаковым значениям одного
из полей выборки? 221
Как получить только те записи, в которых значение
определенного поля превышает указанное значение? 223
Как обратиться к подчиненным полям в запросе? 224
Как объединить результаты нескольких запросов? 225
Как выбрать данные из двух таблиц, удовлетворяющие
определенному условию? 226
Как дополнить данные одной таблицы данными, выбранными из
другой таблицы по определенному условию? 227
Как объединить данные из двух таблиц по определенному
условию? 228
Как вывести некоторое значение вместо NULL в запросе? 231

10
Оглавление

Как вместе с данными некоторой таблицы получить общие итоги


из этой же таблицы? 231
Как получить иерархические итоги по группе справочника? 233
Как по состоянию на заданную дату по регистру
«ОстаткиНаСкладе» найти последний документ
«ПоступлениеТоваровУслуг», по которому приходила
номенклатура? 235
Как подсчитать количество записей с одинаковым значением
некоторого поля? 237
Как в итоговых записях вывести количество различных записей? 239
Как узнать количество записей в результате запроса? 240
Как проверить достаточность остатков товаров на складах,
указанных в документе? 240
Как в запросе осуществить отбор по значению перечисления? 243
Как получить курсы валют на две интересующие даты? 245
Как одним запросом получить таблицу расхождений курсов
взаиморасчетов всех выписанных документов
«ЗаказПокупателя» с официальным курсом? 246
Как написать запрос таким образом, чтобы на определенном
уровне иерархии запроса считались одни итоговые функции,
а на другом уровне другие? 248
Как получить перечень документов, приведших данные
подчиненного периодического регистра сведений к
определенному состоянию? 250
Как установить параметры запроса, если текст запроса заранее не
известен? 252
Анализ данных 253
ф Как получить данные о товарах продаваемых вместе? 253
(D Как порекомендовать сопутствующие товары? 254
(D Как посмотреть, что будет покупаться в дальнейшем? 255

Представление результатов отчетов 257


Табличный документ, текстовый документ 257
Как вывести результат запроса в табличный документ? 257
Как вывести данные в табличный документ с возможностью
сворачивания и разворачивания данных по группировкам? 260
Как при выводе данных в табличный документ свернуть все
выводимые группировки? 260
Как при выводе данных в табличный документ произвольно
определить состав свернутых и развернутых группировок? 261
(D Как выгрузить результат запроса с показом иерархии? 261
(D Где и как можно увидеть макет, автоматически генерируемый
построителем отчета? 262
Ф Как из построителя отчета передать данные в сводную
таблицу? 263
Отчет формируется построителем отчета. Как убрать одну из
колонок, поместив ее данные в расшифровку другой? 264

11
Оглавление

Как сохранить настройки построителя отчета до следующего


открытия формы отчета? 266
Как организовать показ примечаний в формируемом табличном
документе? 268
ф Как обеспечить, чтобы при вводе на печать не печатались
первая колонка и первая строка табличного документа
«ДокументРезультат»? 271
Ф Как обеспечить фиксацию верхней части табличного
документа, генерируемого построителем отчета, по срезу
шапки таблицы? 271
ф Табличный документ формируется построителем отчета. Как
при печати табличного документа обеспечить вывод шапки
таблицы на каждой странице? 272
ф Как при выводе на печать «длинного» документа указать в
колонтитулах страниц номер документа, дату и номер
страницы? 273
® Табличный документ формируется по макету, автоматически
генерируемому построителем отчета. Как задать ориентацию
страницы при печати? 273
Табличный документ формируется построителем отчета. Как для
всех выводимых числовых показателей установить вывод без
дробной части? 274
ф Как для построителя отчета совместить назначение своего
макета и применение одного из стандартных макетов
оформления? 276
Как при получении данных из запроса обойти только итоговые
записи? 276
Как при получении данных из запроса обойти только
иерархические итоговые записи? 278
ф Как вывести картинку в табличный документ? 279
Как вывести картинку в табличный документ без изменения
макета? 280
Как работать со сводной таблицей? 280
Как программно разместить данные в сводной таблице и
оформить ее? 282
Как создать печатную форму посредством текстового шаблона? 283
Диаграммы 287
ф Как заполнить диаграмму данными? 287
Как заполнить данными измерительную диаграмму? 289
ф Как вывести результат запроса в сводную диаграмму? 291
ф Как заполнить диаграмму Ганта данными? 293
Как связать интервалы диаграммы Ганта? 295
Как обработать интерактивное изменение интервалов диаграммы
Ганта? 296
Как разместить непериодические метки в диаграмме Ганта? 298
Как выделить некоторые интервалы фона диаграммы Ганта? 300
Географическая схема 301
ф Как отобразить в форме файл географической схемы? 301
ф Как отобразить в форме макет географической схемы? 301
ф Как изменить масштаб географической схемы? 301

12
Оглавление

Как отобразить на географической схеме выбранный город? 302


Как использовать таблицу значений в качестве источника
данных географической схемы? 303

Администрирование 305
Запуск 1С:Предприятия из командной строки 305
© Как запустить 1С:Предприятие из командной строки? 305
Как из командной строки заставить 1С:Предприятие сделать
выгрузку базы данных? 306
Как из командной строки обновить изменения текущей
конфигурации в конфигурации базы данных? 306
Как выполнить тестирование и исправление информационной
базы без проверки ссылочной целостности в автоматическом
режиме? 307
Как выполнить проверку конфигурации в автоматическом
режиме с выводом результатов проверки в файл? 307
Как сократить журнал регистрации программно? 309
Как выгрузить модули прикладного решения в виде текстовых
файлов из командной строки? 309
Как загрузить в прикладное решение файлы справки,
сохраненные в формате htm? 310
Разное 311
ф Как поменять значение рабочей даты? 311
Ф Как установить/снять монопольный режим? 311
ф Как внести запись в журнал регистрации? 312
ф Как получить данные о зарегистрированных пользователях
информационной базы? 313
ф Как определить общую системную информацию? 314
Как программно добавить пользователя в информационную
базу? 315
Как создать собственный лог-файл для записи результатов
работы внешней обработки? 317
Как в форме отобразить список пользователей, которые работают
с данной информационной базой? 318
Как выгрузить журнал регистрации в XML-формате? 318
Как принудительно завершить работу всех пользователей
информационной базы в клиент-серверном варианте работы? 320

Интеграция 321
Текстовый файл 321
ф Как выгрузить данные из справочника в текстовый файл? 321
ф Как загрузить данные из текстового файла? 322
Работа с текстом. Модель последовательного доступа 322
XML 324
ф Как из одной базы перенести документ в другую базу? 324

13
Оглавление

Как можно сформировать XML-документ произвольной


структуры? 326
Как сформировать XML-документ в строку? 327
Как можно обмениваться данными, используя XML-
сериализацию через файлы других форматов? 328
Как можно загрузить XML документ произвольной структуры? 329
DBF-файлы 331
ф Как можно построить выгрузку-загрузку посредством файлов
DBF? 331
Работа с HTML-документами 332
Ф Заполнение HTML-анкет 332
Работа с файлами 335
ф Как организовать диалог выбора текстового файла? 335
Ф Как прочитать информацию о файле? 336
ф Как получить список файлов в указанном каталоге? 336
Как переместить файл, выложенный на ftp к себе на локальный
компьютер? 337
Как разделить большой файл на несколько файлов
определенного размера? 337
Как поместить файлы в архив? 338
Как сравнить два текстовых файла? 338
Как организовать контроль формирования файла внешним
приложением? 340
ActiveX 341
Ф Как использовать элементы управления ActiveX? 341
Макеты Active Document 343
Как сформировать новый договор на основании файла Microsoft
Word? 343
Работа с Интернет 345
Работа с электронной почтой 345
Как организовать работу с электронной почтой через установленного
почтового клиента? 345
Как организовать работу с почтой без установленного почтового клиента
на компьютере пользователя? 346
Работа с файлами 349
Загрузка файлов по FTP 349
Выполнение HTTP запроса 350
Работа с СОМ-объектами 351
ф Как из одной базы 1С:Предприятие 8.0 перенести остатки
товаров в другую базу, используя СОМ-соединение 351
Пример обращения к программе 1С:Предприятие 8.0 из модуля
MS Excel через СОМ-соединение 353
ф Как организовать считывание данных из файлов *.xls? 355
Как запустить макрос, записанный в книге Microsoft Excel? 356
Как создать документ программы Microsoft Excel no
оформлению, приведенному в другом документе? 357
ф Как выгрузить прайс-лист в документ программы Microsoft
Word? 359

14
Оглавление

ф Как выполнить запрос к произвольной базе данных SQL? 362


Automation Client/Server (OLE) 363
ф Как из одной базы 1С:Предприятие 8.0 интерактивно
заполнить документ в другой базе, используя Automation
Client/Server (OLE)? 363
Как из таблицы Excel загрузить список номенклатуры в
1С:Предприятие с возможностью редактирования? 364
Обмен данными 366
<Э Как организовать работу удаленных складов? 366
Как при создании начального образа управлять тем, какие виды
объектов перегружаются, а какие нет? 369
Как просмотреть объекты, для которых зарегистрированы
изменения? 371
Как организовать обмен данными между произвольными
конфигурациями 1С:Предприятие 8.0? 372
Как принудительно зарегистрировать изменения объектов? 379
WEB-расширение 380
ф Как в форме списка номенклатуры отменить все
установленные отборы? 380
Как запретить перенос содержимого ячеек в форме списка
расходных накладных? 382
Как открыть список расходных накладных с отбором,
установленным по определенному складу? 384
Как добавить кнопку для ввода документа на основании? 388

Указатель 389

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

16
Введение

Стиль изложения соответствует цели издания, поэтому материал


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

Как работать с изданием?


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

17
Примитивные типы, системные
функции

Как явно указать нужную дату?


Для указания нужной даты можно пользоваться:
• литералом вида ТГГГММДДччммсс' встроенного языка;
• встроенной функцией преобразования значений Дата();
• литералом типа Дата языка запросов.
В таблице ниже приводится ряд возможностей явного указания даты
при помощи встроенного языка:

Выражение Значение результата


(тип)
'20050308' 08.03.2005 0:00:00 (Дата)
Дата(2005, 1,1) 01.01.2005 0:00:00 (Дата)
Дата(1, 1, 1) 01.01.0001 0:00:00 (Дата)
Дата(2005, 1, 1, 10, 29, 50) 01.01.2005 10:29:50 (Дата)

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


дату - используется литерал ДАТАВРЕМЯ(). Например, поле со
значением '01.01.2005 0:00:00' можно получить так:

Как проверить дату на пустое значение?


Значение типа Дата не бывает «пустым». Если в явном виде
значение переменной типа Дата не задано, она будет иметь значение по
умолчанию: начало первого дня первого месяца первого года (00 часов
00 минут 00 секунд). Поэтому проверку проще сделать так:

18
Примитивные типы, системные функции

Как сравнить две даты (дни)?


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

Как прибавить к дате день, месяц?


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

Для увеличения или уменьшения даты на некоторое количество


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

Выражение Значение результата


(тип)
ДобавитьМесяц(Дата(2005, 1, 31), 1) 28.02.2005 0:00:00 (Дата)
ДобавитьМесяц(Дата(2005, 2, 28), -1) 28.01.2005 0:00:00 (Дата)
КонецМесяца(ДобавитьМесяц(Дата(2005, 2, 28), -1)) 31.01.2005 23:59:59 (Дата)

19
Примитивные типы, системные функции

А вот пример функции, добавляющей количество дней к исходной


дате при помощи запроса:

В тексте запроса используем функцию ДОБАВИТЬКДАТЕ(). В


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

ПолучитьДень('20052802', 10) = 10.03.2005 0:00:00


ПолучитьДень('20042802', 10) - 09.03.2004 0:00:00, поскольку 2004
год был високосным!

Как можно проверить тип значения


переменной на равенство нужному?

20
Примитивные типы, системные функции

ТипЗнч() - функция языка, возвращающая по значению его тип.


Тип () - функция языка, возвращающая значение типа Тип по
строковому имени типа.

Как очистить реквизит формы, имеющий


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

То есть необходимо установить значение по умолчанию. А им, в


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

Как очистить значение, имеющее тип


«Хранилище значения»?
Очистить значение, записанное в реквизит или ресурс (имя
«РеквизитХранилище») можно следующим образом:

Как проверить тип значения, помещенного в


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

21
Примитивные типы, системные функции

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

Следует отметить, что в реквизит имеющий тип


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

Как сжать данные, помещаемые в хранилище


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

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


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

22
Примитивные типы, системные функции

Как предоставить пользователю возможность


выбора значения составного типа?

Для реализации этой задачи необходимо воспользоваться


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

23
Примитивные типы, системные функции

Как применить округление при работе с


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

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


«РегистрНакопления.Продажи.Обороты», построенная по данным
регистра в интервале между «ДатаНач» и «ДатаКон».
В качестве выходных полей берем «Номенклатура» и результат
деления значения полей источника «СтоимостьОборот» и
«КоличествоОборот». Причем оператором ВЫРАЗИТЬ() тип последнего
поля приводится к примитивному типу ЧИСЛО с определенным
форматом (длинна 15, точность 2).

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


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

СвободныйОстаток = Остаток - Зарезервировано.

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

24
Примитивные типы, системные функции

Процедура глобального контекста Предупреждение() выводит на


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

Как при выполнении обработки сообщить


пользователю текущее время?

Метод ТекущаяДата() возвращает системную дату. Тип значения -


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

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


дробной части?
Для этого используется функция ЧислоПрописью(). У нее могут
быть указаны в качестве параметров:
• преобразуемое число;
• форматная строка;
• параметры предмета исчисления (вид этой форматной
строки определяется значением кода локализации).

25
Примитивные типы, системные функции

Все возможные варианты локализаций описаны в файле Locllnfo.txt,


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

В форматной строке указываем код локализации - Русский(Россия).


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

Как вывести число прописью по-русски, с


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

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


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

26
Примитивные типы, системные функции

Как вывести прописью число килограммов с


указанием дробной части в граммах?

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


исчисления являются килограммы и граммы, а количество разрядов
дробной части - три.
Для ВыводимоеЧисло = 12,345 результат будет: «Двенадцать
килограммов триста сорок пять граммов»

Как долларовую сумму вывести прописью по-


английски?

Для ВыводимоеЧисло = 1 232,45 результат будет: «One thousand two


hundreds thirty two dollars 45 cents»

Какзагрузитьвнешнююкомпоненту?
Загрузим компоненту, позволяющую работать со сканером штрих-
кодов:

27
Примитивные типы, системные функции

В случае ошибки загрузки компоненты или создания объекта


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

Как выполнить команду операционной


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

Для просмотра доступных команд можно в командной строке


системы выполнить команду «help».
Вызвать командную строку, можно выполнив строку кода:

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


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

28
Примитивные типы, системные функции

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


от режима выполнения (на клиенте, на
сервере, во внешнем соединении) ?
Если алгоритм должен выполняться по-разному в зависимости от
места выполнения процедуры, то можно воспользоваться инструкциями
препроцессора:

29
Примитивные типы, системные функции

Как при групповой обработке объектов


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

Если необходимо но мере накопления каких-либо признаков


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

МО
Примитивные типы, системные функции

Как посчитать сумму по формуле сложного


процента?

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


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

31
Универсальные коллекции

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

Как создать массив?


Создание массивов чаще всего происходит посредством оператора
Новый:

где «СозданныйМассив» - имя переменной, которая будет содержать


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

В результате в переменной «СозданныйМассив» будет создан массив


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

32
Массив

Как создать многомерный массив?


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

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

И в том и в другом случае мы решим задачу создания двумерного


массива размерностью 2x8.
Чтение и запись значений такого массива можно производить
посредством директивного указания индексов:

или при помощи метода Получить():

Хотелось бы еще раз отметить, что создание массива определенной


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

33
Универсальные коллекции

Как добавить элементы в массив?


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

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


индексом, то можно использовать метод Вставить():

Как определить размер массива?


Чтобы определить количество элементов массива «НашМассив»
можно сделать так:

Однако имейте в виду, поскольку индексация элементов массива


начинается с нуля - значение переменной «Размер» будет на единицу
больше значения самого старшего индекса.

Как обратиться к элементу массива?


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

34
Массив

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


Получить() и Установить():

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


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

Как перебрать элементы массива?


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

Обратите внимание, «ЭлементМассива» - это произвольное имя


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

35
Универсальные коллекции

«Сч» - это переменная, принимающее очередное значение счетчика


на каждом выполнении цикла. Именно из нее и будем считывать
значение индекса очередного элемента массива.
Значение самого большого индекса массива определяется
посредством метода ВГраница().

Как удалить элемент массива?


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

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


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

Сначала определяем самый старший индекс элементов массива. Цикл


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

36
Массив

® Как удалить все элементы массива?


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

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


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

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


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

37
Универсальные коллекции

текущего элемента с последующими элементами массива. В случае


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

Как скопировать массив?

Для получения копии массива в другом объекте (массиве)


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

Как проверить, что два массива идентичны?


Это можно выполнить при помощи следующей функции. В качестве
параметров ей передаются сами проверяемые массивы «ПервыйМассив»
и «ВторойМассив».

Сначала проверяем совпадение наибольших индексов в массивах,


если совпадения нет - массивы уже не идентичны. Значит функция
возвращает значение ЛОЖЬ.
Далее необходимо произвести проверку идентичности элементов
массивов с одинаковыми индексами. Поскольку индексация элементов
массива начинается с нулевого значения — выполняем цикл-счетчик от
нуля до значения наибольшего индекса массива.
Внутри цикла при выполнении неравенства очередных элементов
функция возвращает значение Ложь.
Если цикл пройден до конца - значения всех элементов с
одинаковыми индексами совпали.
Значит функция может вернуть значение Истина.

39
Универсальные коллекции

В массив выгружены данные, содержащие


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

Создаем список значений.


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

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


значений в массив.

40
Массив

Есть массив, в который выгружены значения


типа СправочникСсылка.Номенклатура. Как
удалить все пустые значения массива?

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


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

41
Универсальные коллекции

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


проводится по-разному. Только для ссылочных типов данных можно ее
осуществлять посредством метода Пустая().

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


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

Формируем массив «МассивНоменклатуры» посредством выгрузки


колонки «Номенклатура» табличной части «Товары» документа.
Аналогично формируем массив «МассивНоменклатурыТара» по
табличной части «Тара».
Далее в цикле перебора элементов второго массива добавляем их в
первый.

42
Массив

Есть две таблицы значений. Как получить


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

Создаем сначала конструктором «МассивСовпадающихКолонок».


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

43
Универсальные коллекции

Как в запросе сделать отбор по нескольким


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

В параметр «МассивПричин» устанавливается значение - массив


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

44
Массив

Как из регистра сведений


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

Данную задачу можно решить посредством применения методов


объектной модели или запросом.
Пример решения посредством объектной модели:

Создаем набор записей регистра. Устанавливаем отбор по значению


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

45
Универсальные коллекции

Источником в запросе будет таблица регистра


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

46
Структура
® В каких ситуациях обычно используются
объекты типа «Структура»?
Структура является универсальной коллекцией, то есть объектом,
предназначенным для работы с не хранящимися в базе данных
совокупностями значений.
Необходимость в ее использовании возникает, когда требуется
работать с временным набором данных с чуть более сложной природой,
нежели в массиве.
Если элемент массива можно было характеризовать только числовым
индексом и значением произвольного типа, то элемент структуры
характеризуется строковым ключом и значением произвольного типа.
Чаще всего структуры применяют в ситуациях, когда необходимо
узнать или использовать имена реквизитов, свойств, полей, подчиненных
объектов для тех или иных объектов; узнать или использовать значения
реквизитов, свойств, полей, подчиненных объектов по их именам для тех
или иных объектов.
Кроме того, структуры удобно использовать для передачи параметров
при работе с различными объектами.
Структуры могут создаваться конструктором НОВЫЙ или получаться
в результате применения методов некоторых объектов. Ввод элементов в
структуру можно осуществлять как посредством параметров
конструктора, так и посредством метода Вставить().

Как создать структуру?


Создание структуры чаще всего происходит посредством оператора
НОВЫЙ:

где «СозданнаяСтруктура» - имя переменной, которая будет


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

47
Универсальные коллекции

Если же мы хотим создать структуру с заранее определенными


элементами - это можно сделать, например, так:

Первым параметром передается строка, в которой через запятую


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

Как добавить элементы в структуру?


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

Как обратиться к элементу структуры?


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

18
Структрура

или передачу ключа в переменной:

Также можно использовать метод СвоЙСТВО(), который получает


значение элемента структуры по указанному ключу:

Для записи значений элементов структуры также можно


использовать несколько вариантов написания кода.
Если мы хотим изменить значение возраста в структуре из
вышеописанного примера - можно это сделать так:

или так:

или так:

Как перебрать элементы структуры?


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

49
Универсальные коллекции

Как удалить элемент структуры?


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

Если же нужно удалить все элементы структуры - применяется


метод ОЧИСТИТЬ():

Как в структуре установить значение для


элемента с определенным ключом?
Все ключи элементов структуры - уникальны. Поэтому добавление
новых элементов и замена (установка) значений для «старых» элементов
выполняется одним и тем же методом Вставить^):

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


одного элемента: ключ у него - «Цвет», значение - «Синий» из
системного набора значений \Л/еЬЦвета.
Структрура

Как получить в структуру многомерные


данные? Как собрать информацию по
установленным в форме журнала отборам?
Для формы журнала документов установлены некие отборы. Чтобы
сформировать многомерную структуру всех используемых отборов
объекта «ЖурналДокументовСписок», можно сделать следующее:

Создаем конструкторами две структуры. Структура


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

51
Универсальные коллекции

«СтруктураОтбора», а для каждого из этих элементов - перебрать


элементы ее значения - структуры «ПараметрыОтбора»

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


ключом «Контрагент», и если есть, но
содержит пустое значение справочника или
Неопределено - удалить этот элемент?

В качестве параметров метода СвоЙСТВО() можно указать ключ и


переменную для получения значения по ключу.
Кроме того, сам метод возвращает Истина, если элемент с данным
ключом существует, и Ложь - если нет.
Получив значение и проверив его на требуемые условия, удаляем
элемент с указанным ключом из структуры.
Замечание: кроме метода СвоЙСТВО() получить значения элемента
структуры позволяют следующие варианты обращения по ключу:

Структура-Контрагент

или

Структура[ "Контрагент"
Структрура

Как из табличной части «Товары» документа


получить все строки, где значение реквизита
«Цена» равно нулю, а значение реквизита
«СтавкаНДС» равно значению «НДС18»
перечисления «СтавкиНДС»?
Для поиска строк, соответствующих условию определенного отбора,
можно сделать следующее:

СтруктураДляПоиска = Новый Структура("Цена, СтавкаНДС",


О, Перечисления.СтавкиНДС.НДС 18);
МассивСтрок = Товары. НайтиСтроки(СтруктураДляПоиска);

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


НаЙТиСтр0КИ() из табличной части документа «Товары» получаем
массив строк, соответствующих отбору по структуре поиска.
Обратите внимание, в данном примере был показан вариант
добавления и заполнения элементов структуры непосредственно в
конструкторе.

Как получить данные о текущей учетной


политике бухгалтерского учета организации из
периодического регистра сведений на
заданную дату?
Периодический регистр сведений
«УчетнаяПолитикаБухгалтерскийУчет» имеет следующую структуру:

Тип значения измерения «Организация»


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

53
Универсальные коллекции

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


метода ПолучитьПоследнее() менеджера регистра:

Метод предназначен для получения данных наиболее поздней записи


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

54
Структрура

Как сформировать структуру названий


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

Конструктором создаем структуру


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

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


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

55
Универсальные коллекции

Функция основана на сборе информации запросом, чей текст


собирается «кусочками» из строковых переменных:

Создаем переменную «ПоляРеквизитов».


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

56
Соответствие
ф В каких ситуациях обычно используются
объекты типа «Соответствие»?
Соответствие является универсальной коллекцией, то есть объектом,
предназначенным для работы с не хранящимися в базе данных
совокупностями значений.
Необходимость в его использовании возникает, когда требуется
работать с временным набором данных с чуть более сложной природой,
нежели в структуре.
Если элемент структуры можно было характеризовать только
строковым ключом и значением произвольного типа, то элемент
соответствия характеризуется ключом произвольного типа и значением
произвольного типа.
Чаще всего соответствия применяют в ситуациях, когда необходимо
хранить в оперативной памяти для последующей обработки данные с
ключами произвольного типа.
Кроме того, соответствия удобно использовать для передачи
параметров при работе с различными объектами.
Соответствия могут создаваться конструктором НОВЫЙ.

ф Как создать соответствие?


Создание соответствия происходит посредством оператора Новый:

I СозданноеСоответствие = Новый Соответствие();

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

ф Как добавить элементы в соответствие?


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

57
Универсальные коллекции

Тогда добавление нового элемента можно произвести так:

или так:

Как обратиться к элементу соответствия?


Запись значений элементов соответствия можно выполнять теми же
способами, которые рассмотрены в вопросе «Как добавить элемент в
соответствие?» на странице 57.
А чтение значений элементов соответствия можно выполнять
следующим образом:

или так:

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


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

Как перебрать элементы соответствия?


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

58
Соответствие

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


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

Если же нужно удалить все элементы соответствия — применяется


метод ОЧИСТИТЬ():

Как получить данные из соответствия?


В соответствии «КурсыВалютДокумента» в качестве ключа
используется значение валюты, а значениями являются структуры,
содержащие «Курс» и «Кратность». Как получить курс и кратность
валюты «УправленческаяВалюта» ?

Сначала по ключу (ссылке на управленческую валюту) получаем


значение соответствия. Поскольку значением является структура курса
валют - далее получаем значения структуры по их названиям.

59
Универсальные коллекции

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


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

Виды расчета Базовые виды расчета Свойства базового вида расчета


"Наименование" - "Оклад по дням"
Оклад по дням
"Предопределенный" - Истина
"Наименование" - "Оклад по часам"
Оклад по часам
"Предопределенный" - Ложь
"Наименование" -
Оплата по часовому т
"Оплата по часовому тарифу"
Ежегодный арифу
"Предопределенный" - Ложь
отпуск
"Наименование" -
Оплата по дневному
"Оплата по дневному тарифу"
тарифу
"Предопределенный" - Истина
"Наименование" -
Оплата по произволе
"Оплата по производственным нарядам"
твенным нарядам
"Предопределенный" - Истина
"Наименование" - "Оклад по дням"
Оклад по дням
"Предопределенный" - Истина
"Наименование" - "Оклад по часам"
Надбавка за в Оклад по часам
"Предопределенный" - Ложь
редность
"Наименование" -
Оплата по произволе
"Оплата по производственным нарядам"
твенным нарядам
"Предопределенный" - Истина

Первичный сбор информации удобнее осуществить при помощи


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

60
Соответствие

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


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

61
Универсальные коллекции

Создаем конструктором три объекта - соответствие «ВидыРасчетов»,


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

63
Универсальные коллекции

Подобный набор возможностей помогает решать самый широкий


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

Как создать список значений?


Список значений можно создать посредством оператора НОВЫЙ:

где «СозданныйСписок» - имя переменной, которая будет содержать


созданный объект типа СписокЗначении.

Как добавить элементы в список значений?


Например, требуется добавить в список значений
«СписокСотрудников» новый элемент со значением ссылки на
сотрудника (содержится в переменной «ТекущийСотрудник»), ФИО
сотрудника в качестве представления (содержится в реквизите «ФИО»
объекта «ТекущийСотрудник») и фотографии сотрудника в качестве
картинки (содержится в переменной «Фото»):

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


индексом (переменная «Инд»), то можно использовать метод
Вставить():

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

64
Список значений, таблица значений, дерево значений

Как найти элемент списка значений?


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

Замечание: если искомое значение в списке может встретиться


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

Как обратиться к элементу списка значений?


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

или так:

В любом случае - то, что получаем, еще не есть значение, заложенное


в этот элемент списка (это еще не сотрудник), а именно объект типа
ЭлементСпискаЗначений.

65
Универсальные коллекции

Впоследствии с него можно считать значения свойств:

Как перебрать элементы списка значений?


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

То же через «цикл-счетчик»:

Как удалить элемент списка значений?


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

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


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

66
Список значений, таблица значений, дерево значений

Решим задачу удаления всех элементов списка значений


«СписокОбъектов», содержащих числовые значения:

Сначала определяем самый старший индекс элементов списка


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

ф Как создать таблицу значений и заполнить


ее поля?
Для создания таблицы значений используется оператор Новый:

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


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

Затем можно добавить новую строку и установить значения в


колонках таблицы:

67
Универсальные коллекции

или так:

Как найти значение в таблице значений?


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

I Найден наяСтрока = ТаблицаЗначений.Найти(ИскомоеЗначение);

Если требуется найти первую строку, где «ИскомоеЗначение» может


быть найдено, например, в колонках «Поставщик» и «Покупатель», то:

Если же нужно найти все строки, где в колонке «Сотрудник»


присутствует искомое значение, то это можно выполнить при помощи
метода НаЙТиСтроки():

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


содержать название колонки таблицы значений в качестве ключа и
искомое значение в этой колонке - в качестве значения. Далее структуру
поиска передаем в качестве параметра методу НаЙТиСтроки(). Результат
- массив строк таблицы значений, соответствующих структуре поиска.
Список значений, таблица значений, дерево значений

Замечание: если в этом примере в структуру поиска добавить поиск-


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

Как перебрать строки таблицы значений?


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

То же через «цикл-счетчик»:

® Как удалить строки (колонки) таблицы


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

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

69
Универсальные коллекции

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


индексов строк таблицы значений - получим сообщение об ошибке.
Аналогично и для колонок. Только работать уже надо с коллекцией
колонок таблицы значений. Доступ к ней - через свойство КОЛОНКИ
таблицы значений.

или

Кроме того необходимо учитывать, что удаление строки (или


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

Сначала определяем самые старшие индексы строк и колонок


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

70
Список значений, таблица значений, дерево значений

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


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

Как заполнить таблицу значений, если имена


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

В вышеприведенном коде:
«ТаблицаЗначений» - имя таблицы значений;
«ИмяКолонки» - строковая переменная, содержащая имя колонки,
по которой нужно заполнить значение;
«Значение» - переменная, содержащая само заполняемое значение.

Как заполнить всю колонку таблицы значений


нужным значением?
Колонку «ФлагФискального Учета» в таблице значений
«ТаблицаЗначений» необходимо заполнить значением Ложь.

Применяем для таблицы значений метод ЗаполнитьЗначения().


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

71
Универсальные коллекции

Как таблицу значений «ТаблицаПолучатель»


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

Вариант второй: таблица «ТаблицаПолучатель» существует, и жалко


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

Для каждой строки исходной таблицы добавляется новая строка в


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

72
Список значений, таблица значений, дерево значений

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


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

73
Универсальные коллекции

Как добавить колонки к таблице значений


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

Можно заполнить значение второго параметра. Туда необходимо


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

Если среди типов разрешенных к заполнению данных колонки есть


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

Аналогичные действия можно осуществлять в отношении


квалификаторов числа и даты.

74
Список значений, таблица значений, дерево значений

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


как «с нуля», так и использовать как основу уже существующее описание
типов.

Как изменить тип значения колонки таблицы


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

75
Универсальные коллекции

Создаем пустые ссылки на документы «ОприходованиеТоваров» и


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

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


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

76
Список значений, таблица значений, дерево значений

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


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

77
Прикладные объекты

Справочники
© Как создать элемент (группу) справочника?
Создание нового элемента в неиерархическом справочнике можно
выполнить при помощи следующего кода:

Если справочник иерархический, то выполнение этого кода приведет


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

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


то для этого следует использовать метод менеджера справочника
Создать Груп пу (). Если группа должна находиться внутри

78
Справочники

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


создаваемой группы:

Следует обратить внимание на тот факт, что у реквизитов, в которые


будет производиться запись значений в свойстве «Использование»
должно стоять одно из перечисленных ниже значений:
• Для группы
• Для группы и элемента
Если для справочника установлен вид иерархии Иерархия
элементов, то для создания новых элементов следует использовать
метод СоздатьЭлемент() менеджера справочника, а иерархия
создаваемых элементов будет определяться значением свойства
Родитель объекта справочника:

79
Прикладные объекты

Как найти элемент справочника?


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

При организации поиска по коду обращайте внимание на тип кода


справочника (Число или Строка).
По наименованию:

По реквизиту:

Во всех методах поиска есть параметры позволяющие искать в


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

80
Справочники

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


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

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


метод УстановитьПометкуУдаления() объекта справочника:

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


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

81
Прикладные объекты

Как перебрать элементы справочника?


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

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

Благодаря использованию запроса можно формировать выборку


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

82
Справочники

® Как выбрать все элементы из определенной


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

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


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

83
Прикладные объекты

Если необходимо получить не только дочерние элементы, но и все


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

а при использовании запроса применять условие В ИЕРАРХИИ:

81
Справочники

® Как перебрать элементы подчиненного


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

Делаем запрос по таблице справочника «Контактные лица» с отбором


по полю «Владелец». В качестве владельца передаем ссылку на элемент
справочника «Контрагенты».

85
Прикладные объекты

® Как перебрать элементы подчиненного


справочника с помощью выборки справочника?
Справочник «КонтактныеЛица» подчинен справочнику
«Контрагенты».
Требуется перебрать всех контактных лиц определенного контрагента.
Ссылка на данного контрагента находится в переменной «Контрагент».

ф Как открыть форму списка (элемента)


справочника?
Для того чтобы открыть форму списка справочника, можно
воспользоваться методом ПолучитьФормуСписка() менеджера
справочника:

Для того чтобы открыть произвольную форму справочника, можно


использовать метод ПолучитьФорму() менеджера справочника:

Однако следует помнить, что если методом ПолучитьФорму()


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

Для того чтобы открыть форму существующего элемента или группы


справочника, следует использовать метод ПолучитьФорму() ссылки
или объекта справочника:

® Как добавить запись в табличную часть


элемента справочника?
Имеется ссылка на элемент справочника «Контрагенты». Как
добавить запись в табличную часть «ВидыДеятельности» этого элемента?
Модифицировать можно только объект справочника.
Поэтому так:

Получаем объект справочника от ссылки на элемент.


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

Как удалить строки из табличной части


справочника?
Для того чтобы полностью очистить табличную часть элемента
справочника, можно воспользоваться методом ОЧИСТИТЬ() табличной
части справочника:

87
Прикладные объекты

Если требуется выборочное удаление строк табличной части


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

ф Как перебрать строки табличной части


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

® Как создать элемент в нужной группе?


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

Можно использовать предопределенную группу, в этом случае вместо


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

89
Прикладные объекты

Обратите внимание на тот факт, что механизм работает, только если в


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

Если вид иерархии справочника «Иерархия элементов», то понятие


группы в нем отсутствует.

Как узнать, есть ли у текущего элемента


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

90
Справочники

Фактически получаем выборку всех подчиненных элементов и если в


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

Так как не предполагается, что нам понадобятся данные о


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

Как узнать количество подчиненных элементов


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

91
Прикладные объекты

Данное решение в общем случае является не эффективным. Связано


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

В результате в переменной «КоличествоЗаписей» будет находиться


нужная нам величина.
Справочники

Как узнать количество подчиненных элементов


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

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


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

93
Прикладные объекты

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


элемента справочника?
В переменной «СсылкаНаЭлемент» находится ссылка на элемент
справочника. Необходимо получить всех родителей данного элемента

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

Данную задачу можно решить и с помощью запроса, однако следует


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

Результат запроса будет содержать одну «лишнюю» запись, которую


легко «отсеять» проверкой свойства «ЭтоГруппа».

94
Справочники

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


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

95
Прикладные объекты

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


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

Как получить запросом «полный» код


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

Источником является таблица справочника. Из нее выбираем поле


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

96
Справочники

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


уровня поле «Родитель» содержит пустую ссылку на элемент
справочника, поэтому значение поля «Код» этого «Родителя» будет
NULL. Если это условие выполнилось - значит, элемент находится на
корневом уровне, и в качестве полного кода достаточно указать код.
Если условие не выполнилось - проверяем аналогичным способом
элемент на принадлежность к первому уровню. В случае выполнения
условия — выводим уже код родителя и код самого элемента через «/».
Таким же образом можно построить «сборку» поля «ПолныйКод»
для случаев 4-х, 5-ти и т.д. уровневых справочников.
В отношении возможных возражений о «неуниверсальности»
подобного подхода: хотя, в общем случае, количество уровней
справочника может быть не ограничено, сложно представить себе
реальную практику использования справочника более чем с 10 уровнями
вложенности из-за явного неудобства работы пользователя с таким
«глубоким» справочником.

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


содержащие в наименовании определенную
подстроку, со всей иерархией, в которую они
входят?
Допустим, речь идет о справочнике «Контрагенты».
Лучше всего с данной задачей справится запрос со следующим
текстом:

97
Прикладные объекты

Источником запроса является таблица справочника. Делаем отбор по


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

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


которых не заполнен строковый реквизит?
Получить желаемое можно таким запросом:

Проверка пустой строки выполняется за счет операции сравнения


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

Количество пробелов перед и между символами «-» должно


соответствовать маске.
Справочники

Как перенести все элементы справочника


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

Источником для запроса является таблица справочника


«Контрагенты». Делаем отбор непосредственно по полю «Родитель» и
получаем таблицу ссылок на нужные нам элементы справочника.
Далее:

В цикле обработки результата запроса производим получение объекта


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

99
Прикладные объекты

Как организовать программный выбор


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

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


события Обработка выбора формы владельца (в нашем случае формы
документа).

Вместо метода Открыть() объекта Форма Выбора в ряде случаев


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

100
Справочники

Аналогичным образом можно организовать выбор для поля ввода. Для


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

Если есть необходимость в использовании собственного алгоритма


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

101
Прикладные объекты

Как сохранить фотографию сотрудника в


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

В данной процедуре первоначально создается объект


ДиалогВыбораФаЙла. Метод Выбрать() открывает данный диалог и
в случае выбора возвращает значение Истина.
В приведенном примере в объект ХранилищеЗначения помещается
объект Картинка. Это удобно в том случае, если предполагается, что
после извлечения, картинка будет отображаться в элементе управления
ПолеКартинки диалога какой-либо формы. .В противном случае в
реквизит можно помещать не значение, имеющее тип Картинка, а
значение с типом ДвоичныеДанные.

102
Справочники

Можно сказать, что в реквизит справочника записывается объект


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

103
Документы
© Как создать новый документ?
Если создание нового документа должно пройти без участия
пользователя, можно сделать так:

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


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

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


форму этого документа для редактирования его пользователем.

Как найти документ?


Например, нужно найти в 2005 году документ
«РеализацияТоваровУслуг» по номеру «НомерДок» (периодичность
нумерации - «в пределах года»). Тогда так:

104
Документы

Второй параметр метода НаЙТИПоНомеру() используется в случаях


периодических нумерациый документов и может содержать любую дату
из того периода, в рамках которого нужно искать документ.
Если же поиск нужно выполнять по реквизиту, то можно, конечно,
использовать объектную модель работы с данными - метод
НаЙТиПоРеквизиту() менеджера документа. Однако в результате будет
получен только один из документов с искомым значением реквизита.
Гораздо удобнее для выполнения операций поиска использовать
запросы. Например, с таким текстом:

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


«РеализацияТоваровУслуг» по указанному контрагенту, закупавшему
товары из указанной номенклатурной группы ранее 1 января 2005 года
или позже, но с номерами документа менее «100».

Как открыть форму документа?


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

105
Прикладные объекты

Ф Как изменить значение реквизита и записать


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

Обращайте внимание, требуется ли обеспечить проведение


измененного документа. В нашем примере документ был записан без
проведения.
Если необходимо при этом провести документ, то:

Первым параметром метода передается значение Проведение


системного перечисления РежимЗаписиДокумента, а вторым
параметром можно указать режим проведения
(оперативный/неоперативный, так же выбирается из соответствующего
системного перечисления).
Если же наоборот, нужно отменить проведение документа, то:

Во всех перечисленных случаях система передаст управление


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

106
Документы

® Как добавить строку в табличную часть


документа, имея ссылку на документ?
Допустим переменная «Док» содержит ссылку на документ. Имя
табличной части этого документа - «Товары». Тогда:

Сначала получаем объект документа. Потом добавляем новую строку


в табличную часть «Товары» документа. Результат метода Добавить() и
есть новая строка. Теперь можно заполнить значения ее реквизитов.
В конце нужно не забыть записать документ.

ф Как удалить строки из табличной части


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

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


записать документ.

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


записи документа с проведением смотри вопрос «Как провести
документ?» на странице 109.

107
Прикладные объекты

Как перебрать строки документа?


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

А можно так:

ф Как выгрузить табличную часть документа?


Чтобы выгрузить табличную часть «Товары» документа «Документ»
в таблицу значений, можно сделать так:

В результате система создаст таблицу значений с колонками,


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

® Как посчитать итог в табличной части


документа?
Итог по колонке «Сумма» табличной части «Товары» документа
«Документ» можно посчитать следующим образом:

108
Документы

Как провести документ?

Первым параметром метода Записать() следует указание режима


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

Как перебрать документы?


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

В теле цикла можно работать с каждым отдельным элементом


выборки.

109
Прикладные объекты

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


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

В данном пример организован перебор всех документов


«РеализацияТоваровУслуг» по указанному контрагенту, закупавшему
товары из указанной номенклатурной группы ранее 1 января 2005 года
или позже, но с номерами документа менее «100».

НО
Документы

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


накладные?

Выполняем выборку приходных накладных. Обходим ее в цикле.


Внутри цикла получаем объект документа по каждой из ссылок на
накладную. Теперь помечаем документ на удаление при помощи метода
УстановитьПометкуУдаления(). В результате документ будет
помечен на удаление с вызовом обработчика Перед ЗЭПИСЬЮ.
Замечание: как альтернативный вариант - можно было бы внутри
цикла просто присваивать реквизиту «ПометкаУдаления» объекта
документа значение Истина. Но в этом случае пришлось бы еще
обеспечивать и запись документа.

(D Как, имея ссылку на документ, создать в


базе его копию?

При применении метода Скопировать^) все реквизиты нового


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

111
Прикладные объекты

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


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

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


мы записываем его без проведения.

® Как, имея ссылку на документ, прочитать его


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

В запросе выбираем все поля (кроме виртуальных) из таблицы


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

112
Документы

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


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

Сначала открываем цикл перебора свойств свойства Движения -


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

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


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

113
Прикладные объекты

Для каждого регистра, по которому документ «ВнутрениийЗаказ»


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

114
Документы

Как в табличной части документа удалить


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

Получаем по ссылке объект документа. Создаем структуру для


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

Изменения связаны с тем, что в этом случае мы сразу находимся в


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

115
Прикладные объекты

Как очистить колонку «СтавкаНДС» в


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

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

Открываем цикл перебора строк табличной части «Товары». В цикле


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

116
Документы

Как заполнить значения свойств нового


документа на основании существующего?
Для этого можно воспользоваться методом глобального контекста
ЗаполнитьЗначенияСвоЙСТВ(), который позволяет копировать
значения свойств одного объекта в свойства другого объекта:

117
Прикладные объекты

Как получить перечень приходных накладных,


в которых не заполнены номенклатурные
позиции?

Выполняем запрос по табличной части «Товары» приходных


накладных. Делаем отбор по равенству поля «Номенклатура» параметру
« ПустаяНоменклатура».
В качестве значение параметра устанавливаем пустую ссылку
справочника «Номенклатура».
Результат запроса будет состоять из единственной колонки
«Накладные».
Обратите внимание - выбираем не повторяющиеся записи
(ВЫБРАТЬ РАЗЛИЧНЫЕ). Это сделано для случая наличия
нескольких строк с незаполненной номенклатурой в одном документе.

118
Документы

Как на дату расходной накладной определить


курс валюты управленческого учета? Валюта
управленческого учета храниться в
периодическом регистре сведений.
Информацию о валюте управленческого учета хранит регистр
сведений «УчетнаяПолитика» - периодический, с периодичностью год:

Регистр сведений «КурсыВалют» - так же периодический, но с


периодом «день»:

Данную информацию можно получить посредством запроса:

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


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

119
Прикладные объекты

«РегистрСведений. Курсы Валют. СрезПоследних». Поскольку


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

Как из формы документа вызвать его


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

В процедуре свойству ИспользоватьРежимПроведения


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

120
Документы

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


актуальные на позицию документа?
Корректно вопрос решается за счет использования параметра
«Период» виртуальной таблицы:
Для запроса вида:

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

Необходимо обеспечить расчет данных по всем активным записям


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

121
Прикладные объекты

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


количество разных значений реквизита в
таблице записей документа?
По данным документа «РегистрацияПростоевВОрганизации»

Источником является таблица документа


«РегистрацияПростоевВОргнаизации».
В качестве выходных полей получим значения агрегатной функции
КОЛИЧЕСТВО() по отношению к полям «Ссылка» и «ФизЛицо».
Причем подсчитываются только различные значения поля «ФизЛицо».
Поскольку группировочные поля не указаны, результатом запроса
будет таблица, состоящая из одной строки.

122
Документы

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


данные.

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

В качестве параметра методу достаточно передать название


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

123
Хранение сведений
Ф Как добавить запись в непериодический
независимый регистр сведений?
Для непериодического регистра сведений:

Создаем набор записей нашего регистра сведений.


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

124
Хранение сведений

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


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

ф Как считать содержимое непериодического


независимого регистра сведений?
«СобственныеКонтрагенты»?

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


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

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


или выгрузить на таблицу значений.

125
Прикладные объекты

(D Как удалить все записи из независимого


регистра сведений?

Создаем переменную «НаборЗаписей» как набор записей регистра


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

<Э Как удалить записи независимого регистра


сведений с отбором по конкретной
организации?
Структура независимого регистра сведений
«ОбъектыСтроительстваОрганизаций» следующая:

126
Хранение сведений

Создаем переменную «НаборЗаписей», устанавливаем для нее отбор


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

© Как добавить запись в периодический


независимый регистр сведений?
Для периодического независимого регистра сведений так же
актуально все сказанное про непериодический регистр сведений (см.
вопрос «Как добавить запись в непериодический независимый регистр
сведений?» на странице 124). Только по другому строится ключ записи -
добавляем еще один отбор по полю «Период».

127
Прикладные объекты

ф Как прочитать (изменить) записи в


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

ф Как удалить записи в периодическом


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

128
Хранение сведений

Создаем переменную «НаборЗаписей» как набор записей регистра


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

Как в периодическом независимом регистре


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

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


регистра.
Были применены отборы, чтобы в результат попали записи, для
которых период более или равен 01 января 2005 года или наименования
не «USD» и не «EUR». Обратите внимание, при составлении условия
по периоду, чтобы не пользоваться параметром запроса, прямо в тексте

129
Прикладные объекты

запроса применили литерал даты ДАТАВРЕМЯ(), в котором части даты


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

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


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

130
Хранение сведений

Как прочитать данные, актуальные на


определенную дату, из регистра сведений
«Курсы валют» с отбором по нескольким
валютам (отбор по измерениям)?
Для решения данной задачи удобнее всего использовать запрос.
Например:

Создаем запрос. В качестве параметров запроса передаем массив


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

131
Прикладные объекты

Как поменять период у записей


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

Измерение «СтруктурнаяЕдиница» имеет тип значения


СправочникСсылка.Организации.
Для периодического независимого регистра сведений
модифицировать (и удалять) записи можно только посредством объекта
РегистрСведенийНаборЗаписей.<имя> или
РегистрСведенийМенеджерЗаписи.<имя>.
И в том и в другом случае понадобится работать с отборами по
периоду (обязательно) и по измерениям (желательно, в зависимости от
контекста задачи).
Поэтому сначала получим таблицу записей, которые подлежат
модификации. Поскольку условий несколько, да еще и не на равенство -
оптимальнее это сделать при помощи запроса. А потом, перебирая
результат запроса, добьемся требуемого результата:

132
Хранение сведений

Результат запроса - таблица, в которой по каждой записи заполнены


все поля измерений из регистра и поле «Период». Именно эту
информацию мы используем для получения каждой нужной записи.
Источником данных для запроса послужила таблица
«РегистрСведений. ОтветственныеЛицаОрганизации».
Были применены отборы так, чтобы в результат попали записи с
периодом менее 1 января 2005 года, наименование структурных единиц,
в которых - «Групп-трейдинг», а наименования должностей не относятся
к «Продавец» и «Кладовщик». Кроме того, необходимо позаботиться о

133
Прикладные объекты

случае, когда должность вообще не указана - то есть ее наименование


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

Как «сделать периодическим» реквизит уже


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

134
Хранение сведений

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


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

Тип значения измерения «Проект» - СправочникСсылка.ПрОбКТЫ.


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

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


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

135
Прикладные объекты

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


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

136
Хранение сведений

ф Как добавить записи в регистр сведений,


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

По-умолчанию запись выполняется с замещением, т.е. существующие


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

137
Прикладные объекты

© Как прочитать (изменить) записи в регистре


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

138
Хранение сведений

ф Как удалить записи из регистра сведений,


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

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


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

139
Бухгалтерский учет
© Как в регистре бухгалтерии сформировать
проводки?
Допустим, требуется сформировать следующую проводку для
операции оплаты поставщику:

Счет дебета 60.01


Контрагент LIGHT
Договор Основной договор
Документ Документ расчета с контрагентами №2
Счет кредита 51
Банковский счет р/с завода Инвестспецбанк
Статья движения денежных средств Оплата за оборудование
Сумма 300 000
Содержание Оплата поставщику
Номер журнала БК

Согласно этим данным, проводка должна быть сформирована по


регистру бухгалтерии «Хозрасчетный»:

Данную задачу можно решить следующим образом:

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

141
Прикладные объекты

Внести информацию в регистр бухгалтерии без привязки к


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

Как получить остаток по счету?


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

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

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


(«ТоварыНаСкладах») и дата, на которую надо получить остатки.

Как получить обороты по счету?


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

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


(«ТоварыНаСкладах») и даты начала и конца периода, за который нужно
получить обороты.

Как получить остатки по счетам?


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

143
Прикладные объекты

Необходимо определить следующие параметры:

Фактически идет обращения к дебетовым остаткам счетов


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

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


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

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

В обработке используется документ «ОперацияБух» являющийся по


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

Как найти первый документ, приведший к


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

Используем виртуальную таблицу


«РегистрБухгалтерии.Хозрасчетный.ОстаткиИ Обороты» за

145
Прикладные объекты

определяемый пользователем период (ДатаН и ДатаК), с


периодичностью по регистратору и отбором по указанному счету.
Накладываем условие - кредитовый остаток счета больше нуля.
Упорядочиваем результат по периоду, затем по регистратору. Это
важно потому, что по умолчанию таблица упорядочена не будет. Кроме
того, обратите внимание - первичен в упорядочивании период, и только
при совпадении периодов дальнейшее упорядочивание идет по
регистратору.
Посредством ключевых слов ВЫБРАТЬ ПЕРВЫЕ 1 обеспечиваем,
чтобы в результат запроса попала только первая запись.

Как выбрать все счета, в аналитике которых


присутствуют либо вид субконто «Контрагент»,
либо вид субконто «Договор»?
Данную задачу можно решить посредством запроса:

Источник - таблица «ВидыСубконто» требуемого плана счетов (в


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

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

Как выбрать все счета, в аналитике которых


присутствуют как вид субконто «Контрагент»,
так и вид субконто «Номенклатура»?
Данную задачу можно решить посредством запроса:

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


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

Как добавить новый вид субконто к счету?


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

147
Прикладные объекты

Если же это необходимо все же выполнить именно в обработке,


можно сделать и так:

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

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


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

Как из регистра бухгалтерии «Хозрасчетный»


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

149
Прикладные объекты

Чтобы получить такую таблицу:

Организация Счет Валю СуммаОб Валютна СуммаОб Валютна


та оротДт яСуммаО оротКт яСумма
борот Дт ОборотК
т
МебельСт 52 USD 7596,16 260,00
МебельСт 60.31 USD 7697,23 265,00
МебельСт 62.21 USD 7596,16 260,00 7596,16 260,00
МебельСт 62.31 USD 65270,12 2269,75 56716,86 1969,75
МебельСт 62.32 USD 2879,10 100,00 9163,24 318,21
Нева ТД 60.21 руб. 59,00 59,00
Нева ТД 60.31 USD 63000,00 2187,96 82231,81 2847,00
Нева ТД 60.31 EUR 4463,78 122,30 4463,78 122,30
Нева ТД 60.32 USD 50000,00 1736,46 50000,00 1736,46
Нева ТД 60.32 EUR 560,11 15,69
Нева ТД 62.31 USD 3239,85 110,00 2500,00 84,77
Нева ТД 76.35 USD 142,25 5,00
Нева ТД 76.39 USD 2503,24 85,00
Можно воспользоваться запросом со следующим текстом:

Источником является виртуальная таблица


«РегистрБухгалтерии.Хозрасчетный.Обороты» с установленными
отборами по интервалу дат и признаку счета.
В качестве выходных полей указываем счета, значения измерений,
дебетовый и кредитовый обороты ресурсов «Сумма» и
« ВалютнаяСумма».

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

Полученную таблицу упорядочиваем по значению поля


«Организация» и возрастанию кодов счетов.

Как выбрать в регистре бухгалтерии


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

Источником будет виртуальная таблица


«РегистрБухгалтерии.Хозрасчетный.Обороты», с установленными
отборами по интервалу формирования, по счету и по корсчету.
Условием по счету ставим вхождение в иерархию параметра запроса
«Счет» (в него потом передадим ссылку на 60-ый счет).
Условием по корсчету ставим НЕ вхождение в иерархию параметра
запроса «Счет».

151
Прикладные объекты

Как реализовать метод «красного сторно» для


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

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

Посредством метода «ВыбратьПоРегистратору» выбираем движения


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

153
Сложные периодические расчеты
ф Как получить сумму начисления по
конкретному виду расчета указанному
сотруднику в указанном периоде?
Получим из регистра расчета «БУОсновныеНачисления» результат
начисления (ресурс регистра расчета «Результат») некоторому
сотруднику («ФизЛицо») по некоторому виду расчета («ВидРасчета») в
указанном периоде («Период!»):

Значение параметров запроса берется из соответствующих


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

154
Сложные периодические расчеты

(D Как получить сумму всех начислений


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

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


параметрам.

155
Прикладные объекты

Как получить таблицу перерасчетов по


перерасчетам нескольких регистров?
По данным перерасчета «ПерерасчетОсновныхНачислений» регистра
«ОсновныеНачисленияРаботниковОрганизации» и перерасчета
« ПерерасчетД ополнительныхНачисл ений» регистра
«ДополнительныеНачисленияРаботниковОрганизации» необходимо
получить таблицу вида:

Работник В ид Расчета Документ

В обоих перерасчетах присутствует измерение «ФизЛицо».


Задачу можно решить посредством объединения запросов по
таблицам перерасчетов регистров:

156
Сложные периодические расчеты

Как для документа


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

В запросе выполняется левое внешнее соединение таблицы регистра


«УправленческиеНачисления» и виртуальной таблицы
«УправленческиеНачисления.ФактическийПериодДействия».
В параметрах виртуальной таблицы и в условиях запроса указан
отбор по данному документу. Соединение строится по равенству полей
«НомерСтроки» и «Регистратор».
В результате соединения могут появиться записи, у которых значение
поля «Регистратор» виртуальной таблицы равно NULL. To есть для

157
Прикладные объекты

данной записи фактический период действия отсутствует. Такие записи


и есть предмет нашего поиска.

Как сформировать расчетный листок


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

158
Сложные периодические расчеты

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


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

Как организовать сторнирование уже


произведенных расчетов прошлых периодов?
Классическим примером является ввод январского больничного в
феврале или т.п.
Допустим, работаем с регистром расчетов «ОсновныеНачисления»:

159
Прикладные объекты

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


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

Посредством свойства «Движения» документа обращаемся к набору


записей этого документа по регистру расчета «ОсновныеНачисления».
Применяем к этому набору записей метод ПолучитьДополнение().

160
Сложные периодические расчеты

Результатом будет таблица значений, содержащая данные


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

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

162
Бизнес-процессы

В модуле объекта необходимо разместить процедуру - обработчик


события Перед выполнением:

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


пользователе системы выполняющем задачу и дате со временем ее
выполнения.
Далее необходимо определить бизнес процесс «НаМаршруте». В
свойство «Задачи» выбрать «ЭтапПути». Реквизиты бизнес процесса:
• Водитель (ссылка на соответствующий справочник)
• ПоказанияСпидометраНачальные (Число)
• ПоказанияСпидометраКонечные (Число)
• РасходТоплива (Число)

163
Прикладные объекты

У точки «Определение маршрута» в группе свойств «Адресация»


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

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


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

164
Бизнес-процессы

Определен обработчик события При выполнении:

В данном обработчике проверяется, что хотя бы одна точка маршрута


указана, в противном случае выполнить задачу не получится.
У точки условия определен обработчик события Проверка УСЛОВИЯ:

Используется функция:

165
Прикладные объекты

Данная функция возвращает следующую точку маршрута или пустую


ссылку, в случае если весь маршрут пройден.
У точки «Точка маршрута» в свойстве «Подразделение» группы
свойств «Адресация» выбрано «Диспетчерская» (предопределенный
элемент справочника «Подразделения»).
Определен обработчик события При СОЗДЭНИИ задач:

В этом обработчике для задачи устанавливается текущий склад (в


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

При попытке открыть задачу будет открыта форма «Путевой Л ист»


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

166
Бизнес-процессы

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


спидометра и расход топлива.

Как при работе с бизнес процессами


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

167
Прикладные объекты

Для того чтобы после выполнения задачи «Определение рецензентов»


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

«Формируемые задачи» это массив, является параметром


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

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

Обратите внимание на то, что имя файла внешней обработки должно


быть полным.

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


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

169
Прикладные объекты

Далее заполняем «Состав», указывая все объекты, которые должны


попасть в отбор:

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


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

Переменная «Менеджер», переданная в качестве параметра методу


НаЙТИ() должна содержать ссылку на конкретного менеджера (т.е. на
элемент справочника «Пользователи»).
Результат метода - массив. Элементы массива можно перебрать
стандартным способом.

170
Прочие прикладные объекты

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

Параметру запроса «Менеджер» нужно будет установить значение


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

171
Формы и элементы управления

Работа с формами
® Как открыть форму документа?

Методом ПолучитьФорму() обращаемся к основной форме


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

Как открыть форму внешней обработки?


Имя файла внешней обработки содержится в переменной
«ИмяФайла».
Тогда открытие основной формы обработки выполняется так:

Если бы требовалось открыть определенную форму этой обработки


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

Обратите внимание на то, что в любом случае имя файла должно


быть полным.

172
Работа с формами

(D Как отрыть форму отчета так, чтобы она не


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

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


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

Как открыть форму отчета на весь экран?


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

Можно также запретить пользователю минимизировать и


максимизировать открытое окно:

Следует учитывать, что использование свойства


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

173
Формы и элементы управления

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


списка данного документа,
спозиционировавшись на нем же?

Получаем форму списка через объект ДокументМенеджер.<ИМЯ>


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

174
Работа с формами

® В документе есть реквизит «Контрагент».


Как открыть форму подчиненного ему
справочника «ДоговорыКонтрагентов»?

Сначала проверяем заполнен ли реквизит «Контрагент». Если он не


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

175
Формы и элементы управления

© Как в форме отобразить картинку,


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

Следует отметить, что если в реквизит «Фотография» может


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

<Х> Как в журнале документов «УчетКадров»


отобрать только документы
«ПриемНаРаботу»?

Данную работу необходимо проделать посредством основного


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

176
Работа с формами

ф Как узнать интервал дат в открытом


текущем журнале?
Интервал дат является одним из вариантов отбора для объектов типа
ЖурналДокументовСписок.<имя>.
Работу необходимо вести с основным реквизитом формы журнала
« Журнал ДокументовСписок»:

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


объекта отбор по свойству «Дата».
Далее можно просто получить представление элемента отбора с
именем «Дата».

Как при открытии справочника сделать отбор


по контрагентам, входящим в список?
Для случая, когда необходимо делать отбор по контрагентам,
входящим в список значений «СписокКонтрагентов»:

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


Далее назначаем в качестве значения список контрагентов, по которым
нужно осуществить отбор. Устанавливаем для свойства Использование
данного элемента отбора значение Истина.
Обратите внимание, Отбор - это свойство объекта
Справ0ЧНИкСпиС0К.<ИМЯ>, то есть источника данных, а не элемента
управления (табличного поля).

177
Формы и элементы управления

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


покупателя в расходной накладной справочник
контрагенты открывался сразу с открытой
группой «Покупатели»?
Поскольку нам необходимо особым образом открыть форму выбора
именно из формы документа - сначала пропишем обработчик события
Начало выбора поля ввода «Контрагент» формы документа:

Сначала проверяем, заполнено ли значение поля ввода. Если да - то


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

178
Работа с формами

Дальше работа идет уже со справочником: находим, какая форма


указана в качестве основной для выбора:

В найденной форме создаем реквизит «ВыборПокупателя», имеющий


тип Булево. Затем в обработчике события При открытии необходимо
добавить код, обеспечивающий установку значения свойства
Текущий Родитель табличного поля «СправочникСписок».
Но сначала желательно обеспечить однозначное толкование понятия
«группа Покупатели». Есть несколько вариантов:
а) Если справочник уже заполнен и группа «Покупатели» существует,
можно подсмотреть код или наименование и в дальнейшем считать, что
«группа Покупатели» - это элемент с таким то кодом или
наименованием. Но существует опасность, что через какое-то время
пользователь изменит код (наименование) этого элемента. Тогда наша
процедура «потеряет» из виду «группу Покупатели». Поэтому лучше
создать константу (например, «ГруппаПокупатели»), которая будет
хранить ссылку на нужную группу справочника «Контрагенты».
б) Более надежным вариантом видится создание предопределенного
элемента справочника с именем «Покупатели». Такому элементу
«повредить» пользователю сложнее. Но тут возникнет вопрос:
справочник был уже заполнен и в группе «Покупатели» 20000 элементов,
как перенести их в другую группу?. Для ответа на этот вопрос в
настоящем издании есть пример «Как перенести все элементы
справочника «Контрагенты» из одной группы в другую?» на странице 99.

179
Формы и элементы управления

а) если идентификацию группы «Покупатели» делаем по ссылке,


которая хранится в константе «ГруппаПокупатели»::

б) если идентификацию группы «Покупатели» делаем по


предопределенному элементу:

Сначала проверяем значение реквизита «ВыборПокупателя» текущей


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

180
Табличное поле
ф Как запретить пользователю изменять
порядок следования колонок в табличном
поле?
Для этого можно воспользоваться свойством табличного поля
ИзменятьПозициюКолонок:

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


тогда следует использовать свойства ИзменятьПозицию
соответствующих колонок:

® Как запретить пользователю изменять


любые настройки колонок табличного поля?
Для этого можно воспользоваться свойством табличного поля
ИзменятьНастройкуКолонок:

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


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

181
Формы и элементы управления

ф Как вывести информацию о том, какой


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

Если требуется более подробная информация обо всех элементах


отбора, она может быть получена, например, следующим образом:

ф Как в форме справочника установить курсор


на элемент с известным наименованием?

Свойству табличного поля «СправочникСписок» Текущая Строка


присваиваем значение ссылки на найденный по наименованию элемент
справочника.

182
Табличное поле

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


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

ф Как в форме списка сделать отбор по


значению реквизита?
У объекта СправочникСписок.<ИМЯ> есть свойство Отбор. В его
состав входят элементы отбора. Именно работая с ними - можно решить
поставленную задачу.
Если необходимо организовать отбор по единственному значению
реквизита, это можно сделать так:

Методу УСТЗНОВИТЬ() элемента отбора первым параметром


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

Устанавливаем по одному из полей отбора нужное значение.


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

183
Формы и элементы управления

ф Как запретить выдачу сообщения:


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

Или программно:

184
Табличное поле

ф Как заполнить ячейку табличного поля


данными?
У табличного поля «ТабличноеПолеЗаказов» есть колонки «Заказ»
(тип значения - ДокументСсылка.ЗаказПокупателя), «Контрагент»
(тип значения - Строка) и «ДатаОтгрузки» (тип значения - Дата):

Необходимо при вводе или изменении заказа обеспечить заполнение


ячеек «Контрагент» и «ДатаОтгрузки» данными из этого заказа.
Для реализации данной задачи используем обработчик события При
изменении поля ввода «Заказ»:

В процедуре в переменную «СтрокаТаблицы» получаем строку


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

185
Формы и элементы управления

Как изменить цвет фона ячейки табличного


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

Для решения данной задачи используются параметры процедуры -


обработчика события При получении данных. Вторым параметром
получаем коллекцию оформлений выводимых строк.
Считывая данные о численном значении остатка, принимаем решение
об установке цвета фона ячейки «Остаток» в оформлении строки.
Цвет назначаем, подбирая его из системного набора значений
\Л/еЬЦвета.

186
Табличное поле

Как в табличное поле


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

Когда пользователь заполнит ее, он может захотеть увидеть в том же


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

187
Формы и элементы управления

Поскольку в качестве данных табличного поля выступает таблица


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

188
Табличное поле

Как задать список выбора для колонки


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

Если же по какой-то причине необходимо все же дать возможность


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

189
Формы и элементы управления

Как обеспечить возможность отбора и


сортировки данных по реквизитам, не
отображаемым в табличном поле формы
списка справочника?

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


управления отбором и сортировкой по реквизиту «ОсновнойПоставщик»
необходимо поработать со свойствами Настрой каОтбора и
Настройка Порядка расширения табличного поля списка справочника.

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


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

190
Табличное поле

Обработчик события Проверка перетаскивания у табличного


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

191
Формы и элементы управления

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


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

В результате получим возможность «набрасывать с помощью мыши»


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

192
Табличное поле

Как вывести остатки на складах в списке


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

В параметре «ОформленияСтрок» обработчика этого события


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

193
Другие элементы управления
© В форме есть панель со страницами. Как
разместить картинку на закладке?
Допустим, имя панели «ОсновнаяПанель», имя страницы
«СчетаУчета», картинка уже есть в библиотеке картинок с именем
«ДебетКредит». Тогда так:

Если же картинка «свеженарисованная» - необходимо


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

194
Другие элементы управления

® Как обеспечить, чтобы при открытии формы


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

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


устанавливаем свойству ТекущаяСтраница панели «Панель» значение
требуемой страницы.

Как организовать выбор из нескольких списков


документов для открытия?
Необходимо реализовать возможность выбора нескольких списков
документов для открытия:

195
Формы и элементы управления

Это можно выполнить следующим способом:

Создаем список значений «СписокДокументов».


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

196
Другие элементы управления

Как можно организовать подстановку


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

Для решения данной задачи можно поработать с обработчиком


события Окончание ввода текста поля ввода:

Создаем список значений со всеми возможными значениями


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

197
Формы и элементы управления

Как в командной панели создать подменю с


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

198
Другие элементы управления

Поскольку к редактируемой командной панели придется обращаться


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

199
Формы и элементы управления

Тело вызываемой процедуры может выглядеть так:

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


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

Как созданной кнопке назначить «горячие


клавиши»?
Допустим кнопке «СозданнаяКнопка» нужно назначить комбинацию
клавиш «Ctrl+Alt+L».

Устанавливаем значение свойству СочетаниеКлавиш значение,


полученное конструктором НОВЫЙ. Первым параметром конструктору
нужно передать основную клавишу сочетания. Ее значение берем из
системного перечисления Клавиши.
Остальными параметрами передаем признак участия других клавиш:
вторым - «Alt»; третьим - «Ctrl», четвертым - «Shift».
Замечания: горячие клавиши можно назначать только кнопкам с
типом «Действие» (не подменю, и не разделитель).
И обратите внимание на значения системного перечисления
Клавиша - русских букв там нет.

200
Другие элементы управления

Как реализовать заполнение возможных


значений поля выбора
«ОбрабатываемаяТабличнаяЧасть» при
заполнении поля ввода
«ОбрабатываемыйДокумент»?
Есть поле ввода «ОбрабатываемыйДокумент». В качестве данных -
реквизит формы «ОбрабатываемыйДокумент» (тип значения -
ДокументСсылка).
Есть поле выбора «ОбрабатываемаяТабличнаяЧасть». В качестве
данных - реквизит формы «ОбрабатываемаяТабличнаяЧасть» (тип
значения - Строка, имеется в виду представление обрабатываемой
табличной части).
Необходимо обеспечить, чтобы при выборе пользователем значения
«ОбрабатываемыйДокумент» заполнялся список выбора поля ввода
«ОбрабатываемаяТабличнаяЧасть».
Для решения этой задачи используем обработчик события
При изменении поля ввода «ОбрабатываемыйДокумент»:

Сначала создаем переменную «СписокВыбора», содержащую список


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

201
Формы и элементы управления

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


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

Ф Если пользователь указал несколько дат в


поле календаря - как их перебрать?
Если элемент управления ПолеКалендаря имеет режим выделения
даты Множественный, пользователь может выделить несколько дат на
календаре:

202
Другие элементы управления

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


образом:

Как видите, свойство поля календаря ВыделенНЫвДаты содержит


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

В данном случае значение свойству было назначено из системного


перечисления РежимВыделенияДаты.

Как организовать работу с индикатором?


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

203
Формы и элементы управления

Например, так:

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


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

204
Другие элементы управления

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


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

Следующая процедура «переключит» табличное поле в «режим»


работы со справочником «Номенклатура».

205
Формы и элементы управления

ф Как задать представление даты,


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

206
Другие элементы управления

Если поле ввода отображает только время, может использоваться,


например, следующее значение:

207
Формы и элементы управления

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


например, следующее значение:

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

208
Другие элементы управления

ф Как вывести текст в поле картинки в том


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

или программно:

209
Формы и элементы управления

В результате, в случае, если картинка не выбрана, в поле картинки


будет выведен указанный текст:

210
Другие элементы управления

ф Как открыть пользователю стандартный


диалог выбора цвета?
Для работы со стандартным диалогом выбора цвета предназначен
объект ДиалогВыбора Цвета. Организовать выбор цвета пользователем
можно с помощью следующего кода:

Аналогичным образом организуется и выбор шрифта при помощи


стандартного диалога (используется объект ДиалогВыбораШрифта):

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

211
Формы и элементы управления

Как заполнить список в форме данными


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

© Как отобразить в форме файл графической


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

212
Интерфейсы, стили
Как задать различные стили
1С:Предприятия для различных категорий
пользователей?
Для этого следует воспользоваться свойством глобального контекста
ГлавныйСтиль:

Следует учитывать, что изменение данного свойства возможно только


до того, как открыто главное окно приложения (например, в обработчике
события приложения Перед началом работы системы).

213
Формы и элементы управления

Есть список имен интерфейсов с пометками.


Как сделать помеченные интерфейсы
видимыми?

Создаем строковую переменную «СтрокаИменИнтерфейсов» для


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

214
Интерфейсы, стили

Как из формы обработки отключить


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

Отключение - в процедуре модуля приложения:

А в форме обработки - вызов процедуры:

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


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

215
Запросы, отчеты

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

В качестве источника указываем табличную часть документов -


таблицу «Документ. РеализацияТоваровУслуг.Товары».
Выходным полем объявляем поле «Номенклатура», входящее в
состав таблицы источника.
Кроме того, поскольку одна и та же товарная позиция, естественно,
могла присутствовать и не один раз в документах - применяем
РАЗЛИЧНЫЕ для получения только различных строк в выходной
таблице запроса.
В результате получим таблицу вида:

216
Запросы

Как получить данные из табличной части


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

В качестве источника указываем табличную часть документов -


таблицу «Документ.РеализацияТоваровУслуг.Товары».
Выходным полем объявляем поле «Номенклатура», входящее в
состав таблицы источника, применяем РАЗЛИЧНЫЕ для получения
только различных значений в выходной таблице запроса.
Далее вводим промежуточные итоги только по группам, в состав
которых входят найденные в документах номенклатурные позиции.
Если иерархию результата запроса отображать при помощи отступов,
получится следующее:

217
Запросы, отчеты

Замечание: при помощи предложения ИТОГИ ПО к результату


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

Как подсчитать количество одинаковых


элементов в выбираемых данных?
Например, требуется получить список номенклатуры, встречающейся
в документах «Реализация товаров и услуг» с указанием общего
количества каждой позиции номенклатуры по всем документам.
При решении данной задачи опять же необходимо иметь в виду, что
один и тот же товар мог встречаться в документах не один раз. Однако
если и на этот раз применить РАЗЛИЧНЫЕ, то получим в результате
только различные строки. То есть один и тот же товар может встречаться
в комбинациях с разным количеством:

Номенклатура Количество
Женские ботфорты коричневые 1,000
Женские ботфорты коричневые 3,000
Женские ботфорты коричневые 10,000
Ботинки женские демисезонные 1,000
Ботинки женские демисезонные 2,000
Ботинки женские натуральная кожа 1,000
Ботинки женские натуральная кожа 2,000

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


операцией СГРУППИРОВАТЬ ПО с вычислением агрегатной
функцией СУММА() по полю «Количество»:

218
Запросы

Групповым полем указано поле «Номенклатура». В результате


получим таблицу вида:

Номенклатура Количество
Женские ботфорты коричневые 49
Ботинки женские демисезонные 6
Ботинки женские натуральная кожа 6
Женские босоножки 19
Комбайн кухонный BINATONE FP 67 13
Кофеварка BRAUN KF22R 6

Замечание: при помощи СГРУППИРОВАТЬ ПО результат запроса


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

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


значениям полей, вычисленных как результат
агрегатной функции?
Если к вышеприведенному примеру (Как из табличной части
«Товары» документов «РеализацияТоваровУслуг» получить все
номенклатурные позиции с суммированием количества?) добавить еще
условие выводить только те записи, где просуммированное количество
больше 10, тогда текст запроса выглядел бы так:

219
Запросы, отчеты

Для реализации условия отбора на значения агрегатных функция


применяется предложение ИМЕЮЩИЕ. В результате получим таблицу
вида:

Номенклатура Количество
Женские ботфорты коричневые 49
Женские босоножки 19
Комбайн кухонный BINATONE FP 67 13

Замечание: не путайте с условием ГДЕ. Это условие налагается на


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

Как ограничить выборку из виртуальной


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

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


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

220
Запросы

Как просуммировать данные по одинаковым


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

Подразд. Номенклатура Кол-во Стоимость


Оборот Оборот
Отдел оптовой пр 58 167,12
одажи
Отдел оптовой пр Женские ботфорты кор 49,000 4 430,39
одажи ичневые
Отдел оптовой пр Ботинки женские деми 6,000 246,69
одажи сезонные
Отдел оптовой пр Ботинки женские натур 6,000 320,44
одажи альная кожа
Отдел оптовой пр Женские босоножки 19,000 1 028,23
одажи
Отдел оптовой пр Комбайн кухонный BI 13,000 5 493,73
одажи NATONE FP 67
Отдел оптовой пр Кофеварка BRAUN KF 6,000 4 427,36
одажи 22R
Отдел розничной 632,33
продажи
Отдел розничной Причуда (вафли) 5,000 2,36
продажи
Отдел розничной Принц (печенье) 4,000 4,01
продажи
Отдел розничной Сердечко (печенье) 5,000 3,83
продажи

221
Запросы, отчеты

Поскольку в оборотном регистре «Продажи» есть измерения


«Номенклатура» и «Подразделение», решить задачу можно посредством
следующего запроса:

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


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

222
Запросы

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


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

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


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

223
Запросы, отчеты

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


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

Если у одного контрагента может существовать несколько договоров,


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

224
Запросы

Как объединить результаты нескольких


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

Получаем по табличной части «Товары» документа записи с


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

225
Запросы, отчеты

Как выбрать данные из двух таблиц,


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

Номенклатура Заказано Заказано


Покупателями Поставщикам
Ботинки женские демисезонные 20,000 180,000
Ботинки женские натуральная кожа 12,000 120,000
Женские босоножки 13,000 140,000
Комбайн кухонный BINATONE FP 67 1,000 150,000
Кофеварка BRAUN KF22R 4,000 150,000

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


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

Соединение проводим по выполнению условия равенства полей


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

226
Запросы

Как дополнить данные одной таблицы


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

Номенклатура Заказано Заказано


Покупателями Поставщикам
Женские ботфорты коричневые 9,000
Ботинки женские демисезонные 20,000 180,000
Ботинки женские натуральная кожа 12,000 120,000
Женские босоножки 13,000 140,000
Комбайн кухонный BINATONE FP 67 1,000 150,000
Кофеварка BRAUN KF22R 4,000 150,000
Вентилятор оконный 13,000
Вентилятор OPBHTA,STERLING,Hn. 6,000

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


соединения данных источников в запросе:

227
Запросы, отчеты

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


«ЗаказыПоставщикам» в записях результата запроса поле
«ЗаказаноПоставщикам» будет содержать значение NULL. He путать с
нулевым значением! NULL - это не число!

Как объединить данные из двух таблиц по


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

Номенклатура Заказано Заказано


Покупателями Поставщикам
Женские ботфорты коричневые 9,000
Ботинки женские демисезонные 20,000 180,000
Ботинки женские натуральная кожа 12,000 120,000
Женские босоножки 13,000 140,000
Комбайн кухонный BINATONE FP 67 1,000 150,000
Кофеварка BRAUN KF22R 4,000 150,000
Вентилятор оконный 13,000
Вентилятор OPBHTA,STERLING,Hn. 6,000
Кроссовки мужские, кожа 10,000 100,000
Кофеварка JACOBS (Австрия) 150,000
Полусапожки на шнурках 100,000

228
Запросы

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

Обратите внимание, пришлось поле «Номенклатура» формировать


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

229
Запросы, отчеты

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


данных вложенного запроса, полученного объединением запросов:

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


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

230
Запросы

Как вывести некоторое значение вместо NULL


в запросе?
Для этого можно использовать функцию языка запросов
ECTbNULLQ, которая возвращает значение своего первого параметра в
случае, если он не равен NULL, и значение второго параметра в
противном случае:

Артикул Номенклатура
hH-150003 Ботинки мужские
П-130002 Полусапожки на шнурках
18009 Петр!
Арт-88888 Сахарный песок
Арт-4444 Юбилейное (печенье)
Арт-8ЭЭЭЭ Крупа манная
Арт-89000 Крупа гречневая
Инвентарь
Вилы
Услуги
Расходы на рекламу
Расходы на ремонт
Молочные

Как вместе с данными некоторой таблицы


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

Номенклатура Сумма Процентная


продаж доля
Яблоки 500 50
Груши 350 35
Бананы 100 10
Манго-манго 50 5

231
Запросы, отчеты

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


процентной доли.
Решение данной задачи может быть таким:

Сами данные получаем из виртуальных таблиц


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

232
Запросы

Как получить иерархические итоги по группе


справочника?
Например, требуется выбрать номенклатуру вместе с остатками на
складе из нужной группы справочника. Причем по группам остатки
должны суммироваться.
Требуется получить данные в виде таблицы следующего вида:
Номенклатура Остатки на
складе (шт)
КОЛГОТКИ 1120
Sanpellegrino 420
Артикул 123456 (черные) 120
Артикул 123457 (капучино) 300
Sonata+ 700
Артикул 773456 (черные) 700
Артикул 774321 (черные)
Оптимально по скорости данное действие выполняется при помощи
запроса. Например, со следующим текстом:

В данном запросе выполняется левое внешнее соединение двух


таблиц.

233
Запросы, отчеты

Первая таблица получена вложенным запросом по таблице


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

234
Запросы

Как по состоянию на заданную дату по


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

235
Запросы, отчеты

Итак, вложенным запросом по таблице записей регистра


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

236
Запросы

Как подсчитать количество записей с


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

Основной Количество
менеджер закрепленных
покупателя покупателей
Иванов 33
Батов 17
Семашко 10

Лучше всего запросом:

Выходными полями таблицы запроса по справочнику «Контрагенты»


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

237
Запросы, отчеты

конкретный менеджер в реквизите «ОсновнойМенеджерПокупателя».


Для этого параметру запроса «НеЗаполненМенеджер» нужно будет
присвоить следующее значение:

Поскольку самих контрагентов показывать не нужно - применяем


СГРУППИРОВАТЬ ПО. Групповым полем будет
« Контрагенты. ОсновнойМенеджерПокупателя», суммируемым
«Контрагенты.Ссылка», функция КОЛИЧЕСТВО.
В результате получим уже свернутую (сжатую) по менеджерам
таблицу.
Упорядочиваем ее записи по убыванию.

238
Запросы

Как в итоговых записях вывести количество


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

Менеджер Покупатель Количество


Иванов 3
Иванов ООО «Лабан и Ко» 1
Иванов ЗАО «Шустер и сыновья» 1
Иванов Энигма Инк. 1
Батов 1
Батов Краски и Лаки 1

Таблицу можно получить запросом с использованием ИТОГИ ПО.

Источник - таблица «Справочник.Контрагенты». Посредством


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

239
Запросы, отчеты

Далее вводим промежуточные итоги по полю


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

Как узнать количество записей в результате


запроса?
Проще всего это сделать посредством выборки результата.

Метод Количество() возвращает количество записей в выборке.

Как проверить достаточность остатков товаров


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

Номенклатура Размещение Количество Коэффициент

Минск-Атлант 126 Главный склад 1 1


Минск-Атлант 712 Главный склад 2 1
Стинол 101 Главный склад 1 1
Bosh-675 Главный склад 7 1
Минск-Атлант 712 Склад электротоваров 1 1
Минск-Атлант 712 Главный склад 1 1

Причем реквизит «Размещение» имеет составной тип


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

КоличествоСписываемогоТовара = Количество* Коэффициент.

240
Запросы

Регистр «ТоварыНаСкладах» имеет следующую структуру:

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


запросом таблицу вида:

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


списываемое в остатке
Минск-Атлант 126 Главный склад 1 10
Минск-Атлант 712 Главный склад 3 2
Стинол 101 Главный склад 1 11
Bosh-675 Главный склад 7 17
Минск-Атлант 712 Склад электротоваров 1 1

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


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

241
Запросы, отчеты

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


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

242
Запросы

Для измерения «Склад» надо передать таблицу тех складов, которые


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

Как в запросе осуществить отбор по значению


перечисления?
Необходимо отобрать всех работников предприятия, стоящих на
момент «ДатаОтчета» на воинском учете. Данные о воинском учете
данные хранятся в периодическом регистре сведений «ВоинскийУчет».

243
Запросы, отчеты

Тип значения ресурса «ОтношениеКВоинскомуУчету»


«ПеречислениеСсылка.ОтношениеКВоинскому Учету».
Получить требуемое можно посредством запроса:

Источником является виртуальная таблица


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

244

I
Запросы

Как получить курсы валют на две


интересующие даты?
Для получения данных используем запрос. Текст запроса приведен
ниже:

Фактически первый запрос получает курсы валют на первую,


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

245
Запросы, отчеты

Как одним запросом получить таблицу


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

Документ Валюта Курс Курс Превышение


договора взаиморасче официальный
тов
Заказ покупателя
ТК000007 от 05.08.2004 USD 31,51 30,6691 0,8409
12:00:01
Заказ покупателя
ТК000003 от 26.07.2004 руб 1 1
11:42:39
Заказ покупателя
ТК000023 от 26.09.2004 EUR 33,42 33,1609 -2,74
12:00:02

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


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

246
Запросы

Во вложенном запросе получаем необходимые данные из документа и


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

247
Запросы, отчеты

Как написать запрос таким образом, чтобы на


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

Номенклатура Характеристика Остаток Заказ Резерв


Ботинки муж. Размер 45 10 8
Ботинки муж. Размер 45 10
Ботинки муж. Размер 45 Заказ** 1 2
Ботинки муж. Размер 45 Заказ №2 6
Ботинки жен. Размер 38 5 2
Ботинки жен. Размер 38 5
Ботинки жен. Размер 38 Заказ №4 2

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


следующей структуры:
Остатки номенклатуры:

Остатки заказов покупателей:

Следует отметить, что в прямой постановке задача не решается. При


определении раздела «Итоги» агрегатные функции итогов будут

248
Запросы

считаться на всех уровнях иерархии запроса. Но постараться добиться


подобного эффекта можно с помощью запроса:

Первым запросам выбираются остатки, в полях соответствующих


данным о резерве проставляем NULL и 0. Вторым запросом получаем
данные по резервам. Раздел ИТОГИ позволяет внести иерархию в
результат запроса с указанием остатка по позиции и итога по количеству
зарезервированного товара.

249
Запросы, отчеты

Как получить перечень документов, приведших


данные подчиненного периодического
регистра сведений к определенному
состоянию?
По данным периодического регистра сведений «КандидатыНаРаботу»

требуется построить таблицу:

ФизЛицо Документ Статус


Андреева Жанна Отложен
Юрьевна
Андреева Жанна Регистрация кандидатов 000000 Принят к рассмотр
Юрьевна 01 от 31.01.2004 0:00:00 ению
Андреева Жанна Регистрация собеседования канд Отложен
Юрьевна идата 00000005 от 09.02.2004 0:0
0:00
Арефьев Виталий Отложен
Федорович
Арефьев Виталий Регистрация кандидатов 000000 Принят к рассмотр
Федорович 03 от 28.03.2004 0:00:00 ению
Арефьев Виталий Регистрация собеседования канд Отложен
Федорович идата 00000027 от 30.03.2004 0:0
0:00

На первом уровне таблица включать в себя указание всех


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

250
Запросы

Данную задачу лучше всего решить посредством запроса со


следующим текстом:

В качестве источника будет таблица - результат внутреннего


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

251
Запросы, отчеты

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


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

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

253
Запросы, отчеты

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


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

ф Как порекомендовать сопутствующие


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

254
Анализ данных

В результате выполнения фрагмента кода «рекомендации» будут


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

ф Как посмотреть, что будет покупаться в


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

255
Запросы, отчеты

Полученные данные (что клиенты еще будут приобретать


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

256
Представление результатов
отчетов

Табличный документ, текстовый документ


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

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


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

257
Представление результатов отчетов

258
Табличный документ, текстовый документ

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


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

259
Представление результатов отчетов

Как вывести данные в табличный документ с


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

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


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

Как при выводе данных в табличный документ


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

260

I
Табличный документ, текстовый документ

В переменной «УровеньГруппировки» определяется уровень, до


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

Как при выводе данных в табличный документ


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

Установка четвертого параметра метода Выбрать() в значение Ложь


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

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


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

261
Представление результатов отчетов

Метод СоздатьКолонки() элемента управления ТабличноеПоле


удаляет ранее существовавшие колонки и создает новые в соответствии с
новым источником данных.

® Где и как можно увидеть макет,


автоматически генерируемый построителем
отчета?
Поскольку тип значения свойства Макет построителя отчета -
Табличный Доку мент, то, как и всякий табличный документ, - его
можно вывести на экран при помощи метода Показать():

В данном примере имя построителя отчета было


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

262
Табличный документ, текстовый документ

ф Как из построителя отчета передать данные


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

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


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

263
Представление результатов отчетов

Отчет формируется построителем отчета. Как


убрать одну из колонок, поместив ее данные в
расшифровку другой?
По документам «РегистрацияСобеседованияКандидата»:

необходимо построить отчет по форме:

Кандидат Результат
Абрамов Андрей Алексеевич Отклонен
Аввакумов Алексей Аркадьевич Предложили работать
Алексеев Вадим Юрьевич Отклонен
Андреева Жанна Юрьевна Отложен

Кандидаты должны располагаться в алфавитном порядке.


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

264
Табличный документ, текстовый документ

265
Представление результатов отчетов

Используем объект ПостроительОтчета. Текст запроса позволяет


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

Как сохранить настройки построителя отчета


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

Первым параметром указано имя сохраняемого значения. Вторым -


само сохраняемое значение. Поскольку метод сохраняет значение
индивидуально для пары «ИнформационнаяБаза - Пользователь», то

266
Табличный документ, текстовый документ

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


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

Восстанавливаем (сохраненное при окончании предыдущего сеанса


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

267
Представление результатов отчетов

Как организовать показ примечаний в


формируемом табличном документе?
По данным документов «Событие»:

необходимо вывести информацию о зарегистрированных за период


событиях по следующей форме:

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


установлены примечания, содержащие «СодержаниеСобытия»

268
Табличный документ, текстовый документ

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


макет «Отчет» по следующей форме

Обратите внимание, ячейка, содержащая «ОписаниеСобытия» -


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

269
Представление результатов отчетов

Выполняем запрос для получения всех необходимых данных по


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

270
Табличный документ, текстовый документ

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

ф Как обеспечить, чтобы при вводе на печать


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

В качестве комментария: свойству ОбластьПечати необходимо


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

ф Как обеспечить фиксацию верхней части


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

271
Представление результатов отчетов

следовать она будет сразу после области «Заголовок». Значит низ


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

То есть, устанавливаем значение свойства ФиксацияСверху


табличного документа как номер нижней строки области
«ШапкаТаблицы» макета табличного документа.

© Табличный документ формируется


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

В свойство ПовторятьПриПечатиСтроки табличного документа


достаточно передать любую область ячеек табличного документа, и она
станет повторяться в каждом печатаемом листе.
В нашем случае данную область определили по координатам области
«ШапкаТаблицы» автоматически генерируемого построителем отчета
макета.

272
Табличный документ, текстовый документ

ф Как при выводе на печать «длинного»


документа указать в колонтитулах страниц
номер документа, дату и номер страницы?
Работа должна вестись со свойством ВерхниЙКолонитул
табличного документа. Тип значения его объект
Колонтитул ТабличногоДокумента.

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


Далее указываем, что начинать вывод колонтитула следует не с первой
страницы (по умолчанию), а со страницы № 2.
Передаем значения для заполнения свойств ТекстСлева и
ТекстСправа. Обратите внимание, что типы значений этих свойств -
Строка. В текст слева выводим представление и номер документа. В
текст справа выводим номер текущей страницы.

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


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

В данном примере свойству ОриентацияСтраницы табличного


документа «ДокументРезультат» назначается значение Ландшафт
системного перечисления ОриентацияСтраницы.

273
Представление результатов отчетов

Табличный документ формируется


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

274
Табличный документ, текстовый документ

Сначала в переменную «Макет» получаем макет построителя отчета.


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

275
Представление результатов отчетов

это будет первая область от начала макета, на каждом очередном -


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

ф Как для построителя отчета совместить


назначение своего макета и применение
одного из стандартных макетов оформления?

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


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

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


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

276
Табличный документ, текстовый документ

277
Представление результатов отчетов

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


только иерархические итоговые записи?
В примере «Как при получении данных из запроса обойти только
итоговые записи» на странице 276 в методе Выбрать() вместо варианта
обхода ПоГруппировкам необходимо использовать
ПоГруппировкамСИерархией.
В результате часть кода изменится:

В результате в табличный документ будут выведены только:


• запись общих итогов (она относится к иерархическим)
• итоговые записи по группам справочника «Номенклатура»
(иерархические итоговые записи)

278
Табличный документ, текстовый документ

Остальные данные (содержащиеся в результате запроса)


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

ф Как вывести картинку в табличный


документ?
В макете определим именованную область «ОбластьСКартинкой». В
ней разместим элемент управления Картинка (имя «Логотип»), как
показано на рисунке:

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


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

279
Представление результатов отчетов

Как вывести картинку в табличный документ


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

Первоначально создается новый элемент коллекции рисунков


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

Как работать со сводной таблицей?


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

280
Табличный документ, текстовый документ

При этом будет создана сводная таблица с именем


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

В сводную таблицу передается результат запроса. Состав


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

281
Представление результатов отчетов

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


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

282
Табличный документ, текстовый документ

Как создать печатную форму посредством


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

283
Представление результатов отчетов

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


документа « ЗаявкаНаПропуск».

284
Табличный документ, текстовый документ

Макет сделаем следующего вида:

Каждая область заключается внутри маркеров ее начала и конца.


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

285
Представление результатов отчетов

Сам же текстовый документ будет формироваться так:

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


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

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

287
Представление результатов отчетов

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


диаграмма:

288
Диаграммы

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


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

Как заполнить данными измерительную


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

289
Представление результатов отчетов

В результате работы данного кода будут получены данные о продажах


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

290
Диаграммы

<D Как вывести результат запроса в сводную


диаграмму?
Для того чтобы отобразить результат запроса в сводной диаграмме,
следует использовать свойство сводной диаграммы ИСТОЧНИКДЗННЫХ, а
затем установить нужные значения серий, точек и ресурсов диаграммы:

291
Представление результатов отчетов

В данном примере сводная диаграмма «СводнаяДиаграмма1»,


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

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


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

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


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

292
Диаграммы

Как заполнить диаграмму Ганта данными?


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

293
Представление результатов отчетов

Для того чтобы заполнить диаграмму Ганта, необходимо создать


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

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


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

294
Диаграммы

Как связать интервалы диаграммы Ганта?


Диаграмма Ганта позволяет устанавливать связи между различными
интервалами диаграммы. Для иллюстрации этой возможности
доработаем пример «Как заполнить диаграмму Ганта данными?» на
странице 293.
Чтобы связать между собой интервалы дежурств каждого из
сотрудников, добавим в этот пример следующий код:

Для добавления связи необходимо выполнить метод Добавить()


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

295
Представление результатов отчетов

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


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

Как обработать интерактивное изменение


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

Интерактивное изменение интервалов диаграммы Ганта приводит к


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

296
Диаграммы

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


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

Если добавить этот код к примеру «Как связать интервалы


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

297
Представление результатов отчетов

Как разместить непериодические метки в


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

298
Диаграммы

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


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

299
Представление результатов отчетов

Как выделить некоторые интервалы фона


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

Чтобы выходные дни выделить другим цветом, мы добавляем нужные


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

300
Географическая схема
Как отобразить в форме файл
географической схемы?
Для этого следует разместить в форме поле географической схемы
(например, «ГеоСхема») и выполнить метод Пр0ЧИТЗТЬ():

Как отобразить в форме макет


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

Как изменить масштаб географической


схемы?
Для этого следует установить соответствующий режим отображения
географической схемы (ЗадаетсяМасштабом) и задать требуемый
масштаб:

301
Представление результатов отчетов

Как отобразить на географической схеме


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

302
Географическая схема

В этом примере осуществляется обход всех объектов слоя «Города», и


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

Как использовать таблицу значений в качестве


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

303
Представление результатов отчетов

Табличное поле «ИсточникДанныхГеоСхемы» иллюстрирует


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

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

Запуск 1С:Предприятия из командной


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

Для запуска 1С:Предприятие в режиме «Конфигуратор», в случае


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

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


если система функционирует в клиент-серверном варианте.

Для запуска 1С:Предприятие в режиме «Конфигуратор», в случае


если система функционирует в клиент-серверном варианте.

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

ENTERPRISE - режим «Предприятие»


CONFIG - режим «Конфигуратор»
/F Путь к базе, функционирующей в файловом режиме
/S ИмяСервера\ИмяБазы, функционирующей в клиент-серверном
режиме
/N Имя пользователя
/Р Пароль пользователя
Замечание: в этих и последующих примерах командная строка
отформатирована (добавлен перенос на следующую строку) для
повышения наглядности. В реальных примерах весь текст должен
записываться в одну строку.

Как из командной строки заставить


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

Как из командной строки обновить изменения


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

306
Запуск 1С:Предприятия из командной строки

Как выполнить тестирование и исправление


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

Параметр /IBcheckAndRepair позволяет выполнить тестирование и


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

Как выполнить проверку конфигурации в


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

Параметр /Out позволяет задать имя файла, в который будут


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

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

-Client - Работа клиентского приложения. Проверка компиляции


модулей в режиме эмуляции среды клиентского приложения,
выполняемого в файловом режиме.
-ExternalConnectionServer - Работа внешнего соединения.
Проверка компиляции модулей в режиме эмуляции среды внешнего
соединения, выполняемого в режиме клиент - сервер..
-Server - Работа сервера 1С:Предприятия. Проверка компиляции
модулей в режиме эмуляции среды сервера 1С:Предприятия.
-DistributiveModules - Поставка модулей без исходных текстов. В
случае если в настройках поставки конфигурации для некоторых
модулей указана поставка без исходных текстов, проверяется
возможность генерации образов этих модулей.
-IncorrectReferences - Поиск некорректных ссылок. Поиск ссылок
на удаленные объекты. Выполняется по всей конфигурации, включая
права, формы, макеты, интерфейсы и т.д. Также осуществляется поиск
логически неправильных ссылок.
-Config Logical Integrity - Проверка логической целостности
конфигурации. Стандартная проверка, обычно выполняемая перед
обновлением базы данных.
-UnreferenceProcedures - Поиск неиспользуемых процедур и
функций. Поиск локальных (не экспортных) процедур и функций, на
которые отсутствуют ссылки. В том числе осуществляется поиск
неиспользуемых обработчиков событий.
-HandlersExistence - Проверка существования назначенных
обработчиков. Проверка существования обработчиков событий
интерфейсов, форм и элементов управления.
-EmptyHandlers - Поиск пустых обработчиков. Поиск назначенных
обработчиков событий, в которых не выполняется никаких действий.
Существование таких обработчиков может привести к падению
производительности системы.

308
Запуск 1С предприятия из командной строки

Как сократить журнал регистрации


программно?
Для этого следует использовать режим пакетного запуска
конфигуратора из командной строки с параметром
/ReduceEventLogSize:

После параметра /ReduceEventLogSize обязательно должна быть


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

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


виде текстовых файлов из командной строки?
Для этого можно использовать режим пакетного запуска
конфигуратора из командной строки с параметром /DumpConfigFileS:

После параметра /DumpConfigFiles указывается каталог, в котором


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

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

Как загрузить в прикладное решение файлы


справки, сохраненные в формате htm?
Для этого можно использовать режим пакетного запуска
конфигуратора из командной строки с параметром /LoadConfigFiles:

После параметра /LoadConfigFiles указывается каталог, в котором


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

310
Разное
ф Как поменять значение рабочей даты?
Прежде чем устанавливать значение рабочей даты на
«УстанавливаемаяДата», необходимо убедится, что рабочая дата не
определяется системной датой компьютера:

Проверка осуществляется для свойства глобального контекста


ИспользованиеРабочейДаты на равенство значению Назначать
системного перечисления Режим Рабочей Даты. В случае выполнения
условия назначаем значение свойству глобального контекста
РабочаяДата.

Как установить/снять монопольный режим?


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

Как видите, если применение процедуры работы с информационной


базой УстановитьМонопольныйРежим() приводит к ошибке
приходится с этим смириться. Хотя если захотите обеспечить выход
других пользователей из системы - в настоящем издании есть пример

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

того, этого добиться: «Как принудительно завершить работу всех


пользователей информационной базы в клиент-серверном варианте
работы?» на странице 320.
Кроме самой установки монопольного режима можно еще, например,
убедиться, что в текущий момент работа идет в монопольном режиме:

Или же снять монопольный режим:

Как внести запись в журнал регистрации?


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

В качестве параметров можно указывать:


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

312
Разное

ф Как получить данные о зарегистрированных


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

В указанной процедуре работа по получению списка пользователей


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

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

(D Как определить общую системную


информацию?
Получить подобное предупреждение:

можно посредством такого кода:

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


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

314
Разное

Как программно добавить пользователя в


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

Следует отметить, что в свойство Пароль можно только записать


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

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

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


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

Если выполняется попытка добавить нового пользователя с


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

316
Разное

Как создать собственный лог-файл для записи


результатов работы внешней обработки?
Для этого можно использовать объект ЗаписьФаЙЛЗ, который
позволяет выводить текстовые строки в указанный файл:

При создании нового объекта ЗаписьТекста в качестве четвертого


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

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

Как в форме отобразить список пользователей,


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

Как выгрузить журнал регистрации в XML-


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

318
Разное

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


определенными пользователем (пользователями), можно в форме
расположить список (например «СписокПользователей»), заполнить его
имеющимися пользователями:

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


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

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

Как принудительно завершить работу всех


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

320
Интеграция

Текстовый файл
® Как выгрузить данные из справочника в
текстовый файл?

В строке текста значения реквизитов справочника разделяются


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

321
Интеграция

Как загрузить данные из текстового файла?

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


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

Работа с текстом. Модель последовательного


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

322
Текстовый файл

Чтение данных:

323
XML

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


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

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


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

324
XML

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


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

325
Интеграция

Как можно сформировать XML-документ


произвольной структуры?
Путь к формируемому XML-документу указан в переменной
«ПутьКФайлу». Используется модель последовательного доступа (работа
осуществляется только с одним текущим узлом).

В результате будет получен файл вида (просмотр в Internet Explorer):

<?xml version="l,0" ?>


и ||
<Корневой Справочник= Номвнклатура >

с:Элемент Код="6" Артикул="1234">В|д (капилярная)</Э.г


<Элемент Код="3" Артикул---" 1235">Паркер "Golg"</3J18M«
<Элемент Код="5" Артикул="1236">Шариковая о б ы ч н а я
<Элемент Код="7" Артикул= п 1237">КоИ!пог м</Элемент>
< Э л е м е н т К о д=" 8" А р т и к у л= ! ! 12 3 8" > Ко h i n о г т </Эл емент >
< Э л е м ент К од=" 4 й А р т и к у л= i ! 12 3 9" > Ко h i n о г т м </Э л е м е н т >
<Элемент Код="14" Артикул="1240">Агс!о TL 1000 ЕХ-1</
<Элемент Код="15" Артикул=*1241 я >1т1в5Н: WS 105 ТХ</
<Элемент Код="11 ! ! Артикул= Н 1242 Н >ВО8СН KGS 3760 1Е<
< Элемент К од="12" ApTSiK'^n="1243">ELECTROLUX ER 900
</Корневой>

326
XML

Можно сказать, что XML-документ состоит из набора элементов.


Элемент можно упрощенно представить в виде совокупности
структурных единиц:

< НачалоЭ лемента


ИмяАтрибута=Значение Имя Атрибута=Значение >
Текст
<КонецЭлемента>

Создание XML-документа с помощью объекта 3anMCbXML


производится путем помещения в строгой последовательности (иначе
будет нарушена структура) «частей» узлов.

Как сформировать XML-документ в строку?


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

327
Интеграция

Для вывода X ML-доку мента в строку после создания объекта


ЗаписьХМЦ необходимо использовать метод УстановитьСтроку().
Только в этом случае метод Закрыть() вернет строку, которая будет
содержать сформированный X ML-доку мент.

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


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

Метод УстановитьСтроку() устанавливает режим вывода данных не


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

328
XML

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


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

Как можно загрузить XML документ


произвольной структуры?
Путь к загружаемому X ML-доку менту указан в переменной
«ПутьКФайлу». Используется модель последовательного доступа. В
данном примере под загрузкой будет пониматься чтение данных и вывод
их в окно служебных сообщений. Загружать будем документ,
выгруженный в предыдущем примере.

329
Интеграция

Объект ЧтениеХМ1_ производит чтение данных, используя модель


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

330
DBF-файлы
® Как можно построить выгрузку-загрузку
посредством файлов DBF?
Не смотря на то, что формат DBF считается уже устаревшим, может
возникнуть необходимость работы с файлами данного формата.
Выгрузка данных:

Загрузка данных:

331
Работа с HTML-документами
Ф Заполнение HTML-анкет
Необходимо заполнить анкету, реализованную как HTML-документ и
расположенную на веб-сервере. Будем считать, что необходимо внести
данные о фамилии, имени, отчестве физического лица.
Фрагмент HTML-кода анкеты выглядит следующим образом:

Сама анкета в «незаполненном» состоянии будет иметь следующий


вид:

332
Работа с HTML-доку ментам и

В примере используется функциональность элемента управления


ПолеНТМЦЦокумента (его имя в примере «ПолеНТМЬ»),
расположенного в форме обработки. Также в форме обработки
расположено поле ввода «URL», в котором указывается адрес анкеты.
Для перехода к необходимой интернет-странице в обработчике
события При изменении поля ввода «URL» используется строка кода:

Для записи данных следующий код (в данном случае) желательно


размещать в обработчике события Документ сформирован поля
HTML-документа.

333
Интеграция

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


будут заполнены указанными значениями:

334
Работа с файлами

ф Как организовать диалог выбора текстового


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

Выбор каталога:

335
Интеграция

Как прочитать информацию о файле?


При помощи ниже приведенного кода можно дать возможность
пользователю выбрать любой файл и сообщить его параметры:

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


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

ф Как получить список файлов в указанном


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

336
Работа с файлами

Методу НаЙТИФаЙЛЫ() передается в качестве параметров путь и


маска поиска. В результате получим коллекцию найденных файлов.
Замечание: если файлы находятся на ftp-сервере, необходимо
указывать прямые слеши '/', а не обратные '\' в параметре «Путь».

Как переместить файл, выложенный на ftp к


себе на локальный компьютер?

Сначала убеждаемся, что в папке-получателе такого файла не


существует. Если существует - удаляем.
Далее убеждаемся, что нужный файл есть в папке-источнике. Если
есть - перемещаем.
Обратите внимание на написание слешей при работе с ftp-сервером.

Как разделить большой файл на несколько


файлов определенного размера?
При передаче файлов большого размера может возникнуть
необходимость в «разделении» файла на более мелкие «части» (если есть
ограничения на размер писем электронной почты или если, например,
необходимо передать файл на дискетах). В этом случае можно
воспользоваться методами глобального контекста РазделИТьФаЙЛ() и
ОбъединитьФайлы().
Метод РазделитьФаЙл() позволяет разделить указанный файл (в
данном случае «MyFile.exe») на несколько файлов указанного размера (в
примере - 1 Мб), и поместить их в указанный каталог:

337
Интеграция

Метод ОбъединитьФаЙЛЫ() позволяет «собрать» файл из


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

Как поместить файлы в архив?


Для того чтобы создать архив файлов, расположенных в некотором
каталоге, можно использовать объект Запись71РФаЙла:

Для извлечения файлов из ZIP-архива, следует использовать объект


Чтение21РФайла:

Как сравнить два текстовых файла?

338
Работа с файлами

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


создаем конструктором диалог выбора файла. Устанавливаем
соответствующий фильтр (txt-файлы) и режим диалога.
Даем пользователю выбрать первый файл, потом второй.
Далее создаем конструктором объект СравнениеФайлов.
Назначаем имена первого и второго файлов (сравниваемых). Указываем
значения свойств, что нужно игнорировать при сравнении пустое
пространство и что способ сравнения будет Текстовый Документ
(значение устанавливается из системного перечисления
СпособСравненияФаЙЛОВ). Далее посредством метода
ПоказатьРазличия() демонстрируем различия в тексте файлов:

Замечание: кроме текста можно сравнивать файлы как таблицы или


побайтно. Для этого нужно установить лишь соответствующее значение
свойства СпособСравнения.

339
Интеграция

Как организовать контроль формирования


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

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


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

340
ActiveX

(D Как использовать элементы управления


ActiveX?
В качестве примера, на котором продемонстрируем возможность
использования в диалоге формы элементов управления ActiveX,
рассмотрим возможность использования Microsoft Media Player (для
прослушивания музыкальных файлов, воспроизведения видео файлов).
Для вставки в диалог формы соответствующего элемента управления
необходимо воспользоваться пунктом главного меню
«Форма | Вставить ActiveX..». В открывшемся диалоге выбора отметим
нужный нам объект (как показано на рисунке):

341
Интеграция

Определим имя элемента управления: «WMP». Кроме этого


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

В указанной процедуре большинство строк кода работают с объектом


ДиалогВыбораФаЙЛЭ, позволяющим организовывать удобный диалог
выбора файла. Запуск выбранного файла производится с кнопки
«Воспроизведение/Play» элемента управления WMP.

342
Макеты ActiveDocument
Как сформировать новый договор на
основании файла Microsoft Word?
Для заключения договоров с контрагентами разработан типовой
договор («пустышка»). При его оформлении (для реального контрагента)
в определенные места документа вставляются данные о контрагенте.
Подобные фрагменты определены следующим образом «<ИмяОбласти>»
(на практике можно использовать другие способы).
Фрагмент такого договора приведен на ниже следующем рисунке:

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


загружен в качестве макета (при его создании указывается, что тип
макета - «Active document»).

343
Интеграция

Далее в соответствующем обработчике события (например, в


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

344
Работа с Интернет

Работа с электронной почтой


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

Прием сообщения:

345
Интеграция

Как организовать работу с почтой без


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

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

Данные, необходимые для установления подключения к почтовому


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

346
Работа с Интернет

После создания почтового профиля производится создание почтового


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

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

347
Интеграция

Данные, необходимые для установления подключения к почтовому


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

348
Работа с Интернет

почтовое сообщение из выборки разбирается и одновременно идет запись


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

Работа с файлами
Загрузка файлов по FTP
Создадим обработку, которая позволит просматривать файлы в
каталоге по указанному FTP-адресу. Имя FTP-сервера будет
записываться в реквизит «FTPServer», файлы будут отображаться в поле
списка (с отмеченным свойством «Отображать пометку»).
В модуле для кнопок командной панели необходимо определить
обработчики событий:

349
Интеграция

Выполнение HTTP запроса


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

В переменной «HTTPserver» указывается путь к каталогу ресурса.

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

351
Интеграция

Следует отметить, что в реальной ситуации при переходе на другую


базу понадобиться переносить данные и из других объектов системы
(состояние взаиморасчетов и т.п.).

352
Работа с СОМ-объектами

Пример обращения к программе


1С:Предприятие 8.0 из модуля MS Excel через
СОМ-соединение
Например, в файле Excel хранится список контрагентов, который
нужно загрузить в 1С:Предприятие:

Для решения этой задачи в таблице Excel можно создать макрос


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

353
Интеграция

Этот пример представлен на языке MS Visual Basic. Сначала


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

354
Работа с СОМ-объектами

ф Как организовать считывание данных из


файлов *.xls?
Рассмотрим простой фрагмент кода позволяющий работать с книгой,
состоящей из количества страниц, определенных в переменной
«КоличествоСтраниц». Данные в странице расположены следующим
образом:

ООО «Торгуем всем»


Ботинки муж. 10
Ботинки жен. 200

На каждой странице в первой строке, первой колонке расположено


наименование контрагента. Со второй строки идет «табличная часть»: во
второй колонке наименование товара, в третьей колонке его цена.

Выполнение последней строки обязательно для корректной работы с


любыми приложениями Microsoft Office.

355
Интеграция

Как запустить макрос, записанный в книге


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

356
Работа с СОМ-объектами

Как создать документ программы Microsoft


Excel по оформлению, приведенному в другом
документе?
Необходимо создать книгу Microsoft Excel с оформлением, пример
которого приведен в заранее подготовленной книге. Пример оформления
приведен на рисунке.
На листе книги определена именованная область «Шапка»,
предполагается, что в ней будут находиться данные о контрагенте
документа, и в ней же определена шапка табличной части.

Кроме этого определена именованная область «Строка». В ней будут


находиться данные о строках табличной части документа. В колонке
«Сумма» определена формула (умножение цены на количество)

Оформленный таким образом документ сохранен в виде файла.


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

357
Интеграция

358
Работа с СОМ-объектами

Созданная таким образом книга, после наполнения ее данными


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

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


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

359
Интеграция

360
Работа с СОМ-объектами

В первой конструкции «Попытка - Исключение» создаем объект, с


помощью которого будем пытаться создавать новый документ. Вторая
конструкция «Попытка - Исключение» описана на случай, что если при
работе с документом произойдет ошибка, в этом случае созданный
объект «Word.Application» будет закрыт. В противном случае созданный
документ будет открыт в новом окне программы Microsoft Word.

361
Интеграция

® Как выполнить запрос к произвольной базе


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

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


указывается имя сервера, имя базы, пользователя и пароль. Для
подключения к базе используется объект «Connection». Запрос и
получение данных производится через объект «RS». По окончании оба
объекта закрываются.

362
Automation Client/Server (OLE)

(D Как из одной базы 1С:Предприятие 8.0


интерактивно заполнить документ в другой
базе, используя Automation Client/Server (OLE)?
Необходимо реализовать механизм, позволяющий пользователям
одной базы данных заполнять документы другой базы данных.

В переменной «Путь» записан полный путь к открываемой по OLE


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

363
Интеграция

Как из таблицы Excel загрузить список


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

364
Automation Client/Server (OLE)

Для решения этой задачи в таблице Excel можно создать макрос


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

Этот пример представлен на языке MS Visual Basic. Сначала


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

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

366
Обмен данным*

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


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

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


обмена.

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


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

367
Интеграция

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


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

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


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

В вышеописанном обработчике события (он выполняется при приеме


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

368
Обмен данным!

Остается в пользовательском режиме определить состав баз


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

Как при создании начального образа управлять


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

369
Интеграция

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

Перед формированием начального образа для узла необходимо в его


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

370
Обмен данными

Как просмотреть объекты, для которых


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

Так как одним из параметров метода НачатьЗапись() является


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

371
Интеграция

Как организовать обмен данными между


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

372
Обмен данными

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


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

373
Интеграция

Выгрузка осуществляется в узел с кодом «Marl» (правильнее


говорить, что будем выгружать данные, отмеченные как измененные для
данного узла). Далее по тексту процедуры: получаем выборку объектов,
обходим ее. При обходе проверяем тип значения (считается, что все
объекты, которые могут попасть в выгрузку, имеют одинаковую
структуру) и если объект это документ «Реализация товаров», то для его
выгрузки вызывается процедура «Выгрузка реализации». В противном
случае используется метод ЗаписатьХМ1_() (метод платформы,
позволяющий выгружать «сложные» с точки зрения сериализации
значения в X ML-доку мент). Для выгрузки документа понадобилась
отдельная процедура ввиду того, что загрузка будет вестись в документ
«Поступление товаров».

374
Обмен данными

Процедура «ВыгрузкаРеализации» выгружает документ «Реализация


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

375
Интеграция

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


обмена. Перед чтением очередного узла X ML-доку мента проверяется
возможность чтения значения из данного узла (функция
«ВозможностьЧтения Данных»). Для чтения используется функция
«ПрочитатьДанные». Перед записью проверяется необходимость этой
записи (поведение комплекса в случае возникновения коллизий).

Функция проверяет возможность чтения значения из XML-


документа.

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


данных, если это «Document Object. ПередачаТовара», то для чтения
значения используется функция «ЧтениеРеализации()>>, в противном

376
Обмен данным1

случае (остальные значения) для чтения используется метод платформы


ПрочитатьХМЦ).

377
Интеграция

Данная функция записывает данные в документ «Поступление


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

Данная функция позволяет записывать документ «Поступление


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

378
Обмен данными

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


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

Считается что существует узел плана обмена «НаСклады» с кодом


«С1».
Если необходимо разместить объекты только определенного вида
(например, все элементы справочника «Номенклатура»)

Если необходимо разместить только один объект, например


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

Фактически все из приведенных примеров отличаются только


значением второго параметра метода ЗарегистрироватьИзменения().

379
WEB-расширение
® Как в форме списка номенклатуры отменить
все установленные отборы?
Среди типов кнопок V8CornrnandButtonTyp6 объекта
V8CommandPanel не предусмотрено типа кнопки для удаления всех
отборов, установленных для объекта V8ListDataSource. Поэтому
отключение установленного отбора необходимо выполнять
программными средствами.
Например, можно добавить новую кнопку «Отключить отбор» в
пункт «Действия» объекта V8CommandPanel:

Указав также, что это будет кнопка, выполняющая некоторую


произвольную команду (свойство CommandTyp© равно Custom), и

380
WEB-расширение

задав имя выполняемой команды (свойство CommandName равно


«ShowAll»).
После этого в обработчике события ItemCommand объекта
V8Com ma nd Panel можно написать следующий код:

Сначала выполняется проверка выполняемой команды (имя команды


доступно через свойство CommandName второго параметра «е» этого
события). Если это «наша» команда - организуется цикл обхода всех
фильтров, установленных для источника данных - объекта
V8ListDataSource (имя «listDS»), и для каждого из них сбрасывается
флаг использования. После этого вызывается обновление данных в
самом списке - объекте V8GMd (имя «grid»):

381
Интеграция

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


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

Для решения этой задачи можно воспользоваться событием


ItemDataBound объекта V8Grid:

382
WEB -расширение

Это событие вызывается для каждой строки выводимого списка.


Следует организовать цикл обхода всех выводимых ячеек (коллекция
ячеек доступна через свойства Item.Cells второго параметра «е» этого
события). В цикле для каждой ячейки следует сбросить свойство Wrap.
В результате список расходных накладных будет иметь следующий
вид:

383
Интеграция

Как открыть список расходных накладных с


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

384
WEB-расширение

Тогда в обработчике события PageLoad страницы, являющейся


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

385
Интеграция

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


имен 1C.V8.Data:

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


(ListDataSource.Connection.Open()). Затем методом Get() объекта V8
выполняется получение значения свойства «глТекущийПользователь»
СОМ-соединения. Само СОМ-соединение передается вторым
параметром (ListDataSource.Connection.Connection), а имя нужного
свойства - третьим ("глТекущийПользователь"). После этого методом
Call() объекта V8 выполняется вызов метода
«ПолучитьЗначениеПоУ молчанию» СОМ-соединения. Само СОМ-
соединение передается вторым параметром
(ListDataSource.Connection.Connection), имя метода передается третьим
параметром ("ПолучитьЗначениеПоУмолчанию"). За ним следует
перечисление параметров вызываемого метода.
В результате в переменную «mainWH» будет возвращено значение
склада по умолчанию для текущего пользователя.
После этого, если полученное значение не является пустой ссылкой,
выполняется установка фильтра с именем «Склад» для объекта
V8LJStDataSource: задается признак использования, условие сравнения,
тип значения, само значение и представление значения фильтра.
После выполнения перечисленных действий, подключение к
информационной базе закрывается.

386
WEB-расширение

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


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

387
Интеграция

Как добавить кнопку для ввода документа на


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

где «grid» - это имя объекта V8Grid, с которым связана командная


панель:

В результате, при нажатии на кнопку будет вызван ввод новой


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

388
Указатель

?(), 56

ВыборкаИзРезультатаЗапроса, 95
ДокументыМенеджер, 174, 196
Массив, 33, 37, 39, 41
СерииДиаграммы, 288
Соответствие, 59
СтрокаТаблицыЗначений, 71, 73, 187
Структура, 52
ТаблицаЗначений, 20
ТочкиДиаграммы, 287

AddAuthentication() - метод
IV8ServerConnection, 320

Checked - свойство
V8Filter, 381
Connect() - метод
V8.Application, 363
V8.COMConnector, 351
ConnectServer() - метод
V8.COMConnector, 320
CreateInfoBaseInfo() - метод
IV8ServerConnection, 320

Disconnect^) - метод
IV8ServerConnection, 320

389
Указатель

GetIBConnections() - метод
IV8ServerConnection, 320

ItemCommand - событие
V8CommandPanel, 381
ItemDataBound - событие
V8Grid, 382

N
Name - свойство
IlnfoBaselnfo, 320

Pow(), 31

R
Refresh() - метод
V8Grid, 381

иШПространстваИмен - свойство
ТипДанныхХМЬ, 376

АвтоМаксимальноеЗначение - свойство
Диаграмма, 289
АвтоМинимальноеЗначение - свойство
Диаграмма, 289
АвтоОпределениеПолногоИнтервала - свойство
ДиаграммаГанта, 293
АвтоСохранение - свойство
XBase, 331
АВТОУПОРЯДОЧИВАНИЕ
Язык запросов, 251

390
Указатель

Адрес - свойство
ИнтернетПочтовыйАдрес, 346, 348
АдресСервераРОРЗ - свойство
ИнтернетПочтовыйПрофиль, 347
AnpecCepBepaSMTP - свойство
ИнтернетПочтовыйПрофиль, 346
АутентификацияСтандартная - свойство
ПользовательИнформационнойБазы, 315

БазовыйПериодКонец - свойство
РегистрРасчетаЗапись, 160
БазовыйПериодНачало - свойство
РегистрРасчетаЗапись, 160
БиблиотекаКартинок - свойство
Глобальный контекст, 194, 198
БиблиотекаСтилей - свойство
Глобальный контекст, 213
БизнесПроцесс - свойство
ЗадачаОбъект, 168

В
в
Язык запросов, 44, 119, 131, 146, 165, 193, 242
В ИЕРАРХИИ
Язык запросов, 151, 233, 252
ВвестиЗначениеО - метод
Глобальный контекст, 23, 252, 301
ВГраница() - метод
Массив, 39
ВерсияОС - свойство
СистемнаяИнформация, 314
ВерсияПриложения - свойство
СистемнаяИнформация, 314
Верх - свойство
ОбластьЯчеекТабличногоДокумента, 272
РисунокТабличногоДокумента, 280
ВерхнийКолонтитул - свойство
ТабличныйДокумент, 273
Видимость - свойство
СлойГеографическойСхемы, 302, 303
ТочечныйОбъектГеографическойСхемы, 302, 304

391
Указатель

ВидПодписей - свойство
Диаграмма, 287
ВидРасчета - свойство
РегистрРасчетаЗапись, 160
ВидСравнения - свойство
ЭлементОтбора, 51, 177, 183
ВидыСубконто - свойство
ПланСчетовСсылка, 148
Вложения - свойство
ИнтернетПочтовоеСообщение, 346
ПочтовоеСообщение, 345
Вложенный запрос
Язык запросов, 93, 119, 165, 230, 233, 235, 241, 247
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Язык запросов, 147, 226, 232, 235
ВозможностьЧтенияХМЦ) - метод
Глобальный контекст, 328, 376
ВремяОжидания - свойство
ИнтернетПочтовыйПрофиль, 346, 347
Вставить() - метод
КнопкиКоманднойПанели, 198
КоллекцияКолонокТаблицыЗначений, 73
Соответствие, 61, 193
Структура, 50, 51, 319, 384
ВстроенныеТаблицы - свойство
ТабличныйДокумент, 263, 281, 282
ВторойФайл - свойство
СравнениеФайлов, 339
ВЫБОР
Язык запросов, 96, 229, 246
Выбран() - метод
РегистрСведенийМенеджерЗаписи, 133
ВЫБРАТЬ
Язык запросов, 20, 24, 44, 45, 56, 60, 75, 85, 92, 93, 94, 95, 96, 97, 98, 99, 119,
121, 122, 129, 131, 132, 135, 146, 147, 150, 151, 156, 171, 193, 198, 212, 218,
219, 220, 222, 223, 224, 226, 227, 229, 230, 231, 232, 233, 235, 237, 239, 241,
244, 245, 246, 249, 251, 252, 253, 254, 255, 257, 261, 264, 269, 277, 281, 282,
287,290,291,351,359
ВЫБРАТЬ *
Язык запросов, 112, 125
ВЫБРАТЬ ПЕРВЫЕ
Язык запросов, 76, 91, 145, 165
ВЫБРАТЬ РАЗЛИЧНЫЕ
Язык запросов, 118, 165,216,217,225,242

392
Указатель

ВЫБРАТЬ РАЗРЕШЕННЫЕ
Язык запросов, 157
Выбрать() - метод
ВыборкаИзРезультатаЗапроса, 61, 352
ДиалогВыбораФайла, 102, 335, 336, 338, 342
ДиалогВыбораЦвета, 211
ДиалогВыбораШрифта, 211
ДокументМенеджер, 111
ИнтернетПочта, 347
Почта, 345
РезультатЗапроса, 46, 61, 85, 92, 95, 99, 133, 165, 193, 198, 204, 212, 240, 258,
270, 277, 278, 288, 352
СправочникМенеджер, 86, 90, 91, 191, 321, 322
ВыбратьИерархически() - метод
СправочникМенеджер, 326, 327, 331
ВыбратьИзменения() - метод
ПланыОбменаМенеджер, 371, 373
ВыбратьИзСписка() - метод
Форма, 197
ВыбратьПоРегистраторуО - метод
РегистрБухгалтерииМенеджер, 152
ВыбратьЭлемент() - метод
СписокЗначений, 302
Вывести() - метод
ГеографическаяСхема, 301
ПостроительОтчета, 265, 273
ПостроительОтчетаАнализаДанных, 254, 256
ТабличныйДокумент, 258, 260, 261, 270, 277, 278, 279
Выводить - свойство
КолонтитулТабличногоДокумента, 273
Выгрузить() - метод
РегистрСведенийНаборЗаписей, 125
РезультатЗапроса, 20, 76, 130, 135, 262, 290
ВыгрузитьЖурналРегистрации() - метод
Глобальный контекст, 318, 319
ВыгрузитьЗначения() - метод
СписокЗначений, 40
ВыгрузитьКолонкуО - метод
ДокументТабличнаяЧасть, 42
РегистрСведенийНаборЗаписей, 45
Выделенные Даты - свойство
ПолеКалендаря, 203
Выполнить() - метод
АнализДанных, 253, 255, 256

393
Указатель

Запрос, 20, 46, 61, 76, 85, 92, 95, 99, 118, 130, 131, 133, 135, 165, 193, 198,
212, 240, 252, 253, 255, 256, 258, 262, 270, 277, 281, 287, 290, 352, 359
МодельПрогнозаПоискАссоциаций, 255
МодельПрогнозаПоискПоследовательностей, 256
ПостроительОтчета, 265
ВЫРАЗИТЬО
Язык запросов, 24, 242
Высота - свойство
РисунокТабличногоДокумента, 280
ВысотаТаблицы - свойство
ТабличныйДокумент, 271

ГДЕ
Язык запросов, 44, 46, 56, 85, 91,92, 93, 94, 95, 97,98, 99, 112, 118, 122, 129,
133, 135, 145, 146, 147, 157, 165, 212, 223, 233, 235, 237, 239, 242, 251, 252,
269
ГлавныйИнтерфейс - свойство
Глобальный контекст, 214
ГлавныйСтиль - свойство
Глобальный контекст, 213

Д
Данные - свойство
Расширение элементов управления, расположенных в форме, 205
СводнаяТаблица, 283
ДанныеСтроки - свойство
ОформлениеСтроки, 193
Дата - свойство
ДокументОбъект, 111, 377
ЗадачаОбъект, 168
Дата() - метод
Глобальный контекст, 18, 135
ДАТАВРЕМЯ()
Язык запросов, 18, 129, 133
Добавить() - метод
XBase, 331
ДокументТабличнаяЧасть, 107, 192, 377
Записьг1РФайла, 338
ЗначениеДиаграммыГанта, 293
ИнтервалДиаграммыГанта, 295
ИнтервалыФонаДиаграммыГанта, 300

394
Указатель

ИнтернетПочтовыеАдреса, 346
ИнтернетПочтовыеВложения, 346
ИнтернетТекстыПочтовогоСообщения, 346
КнопкиКоманднойПанели, 198
КоллекцияИндексовХВаве, 331
КоллекцияКолонокДереваЗначений, 76
КоллекцияКолонокТаблицыЗначений, 74, 75, 187, 303
КоллекцияПолейХВазе, 331
КоллекцияПолейСводнойДиаграммы, 291
КоллекцияПолейСводнойТаблицы, 283
КоллекцияРисунковТабличногоДокумента, 280
КоллекцияСтрокДереваЗначений, 76
Массив, 23, 33, 38, 42, 43, 44, 46, 73, 94, 168, 187, 191, 319
МеткиЭлементаШкалыВремени, 298
ПланСчетовВидыСубконто, 148
ПолосыИзмерительнойДиаграммы, 289
ПочтовыеАдреса, 345
ПочтовыеВложения, 345
РегистрБухгалтерииНаборЗаписей, 152
РегистрРасчетаНаборЗаписей, 160
РегистрСведенийНаборЗаписей, 124, 127
РолиПользователя, 315
СерииСлояГеографическойСхемы, 303
СписокЗначений, 131, 189, 193, 196, 197, 201, 212, 302, 319, 350
СправочникТабличнаяЧасть, 87
ТаблицаЗначений, 71, 72, 303, 304, 318
ЭлементыШкалыВремени, 298
ДОБАВИТЬКДАТЕО
Язык запросов, 20
ДобавитьСтрокуО - метод
ТекстовыйДокумент, 321
Документ - свойство
ПолеНТМЬДокумента, 333
Документ сформирован - событие
ПолеНТМЬДокумента, 333
Документы - свойство
Глобальный контекст, 348, 352, 363, 377, 379
Доступность - свойство
ЭлементУ правленияОтбором, 190
ЭлементУправленияПорядком, 190

Е
Единица - свойство

395
Указатель

ЭлементШкалыВремени, 298
ЕСТЬ NULL
Язык запросов, 96, 133, 157, 242, 246
ECTbNULL()
Язык запросов, 231

Заголовок - свойство
ДиалогВыбораФайла, 102, 335, 338, 342
Надпись, 182
Загрузить() - метод
РегистрСведенийНаборЗаписей, 130, 135
ЗагрузитьЗначения() - метод
СписокЗначений, 40
ЗакончитьАвтогруппировкуСтрок() - метод
ТабличныйДокумент, 260
ЗакончитьЗапись() - метод
ЗаписьСообщенияОбмена, 373
ЗакончитьЧтениеО - метод
ЧтениеСообщенияОбмена, 375
Закрыть() - метод
ЗаписьХМЬ, 326, 327, 328, 371, 373
ЗаписьТекста, 317, 322
Форма, 120
ЧтениеХМЦ 375
Чтение21РФайла, 338
ЗакрытьФайл() - метод
XBase, 331
Записать() - метод
ДокументОбъект, 106, 107, 109, 111, 115, 348
ЗадачаОбъект, 168
Запись21РФайла, 338
ЗаписьТекста, 317
ПланВидовХарактеристикОбъект, 148
ПланСчетовОбъект, 148
ПользовательИнформационнойБазы, 315
РегистрБухгалтерииНаборЗаписей, 152
РегистрРасчетаНаборЗаписей, 160
РегистрСведенийМенеджерЗаписи, 133
РегистрСведенийНаборЗаписей, 124, 126, 127, 128, 130, 135
СправочникОбъект, 87, 89, 90, 99, 352
ТекстовыйДокумент, 321, 328
3anncaTbXML() - метод

396
Указатель

Глобальный контекст, 328, 373, 374


ЗаписатьАтрибут() - метод
ЗаписьХМЬ, 326, 327
ЗаписатьВФорме() - метод
Расширение формы документа, 120
ЗаписатьКомментарий() - метод
ЗаписьХМЬ, 326, 327
ЗаписатьКонецЭлемента() - метод
ЗаписьХМЬ, 326, 327, 374
ЗаписатьНачалоЭлемента() - метод
ЗаписьХМЬ, 326, 327, 374
ЗаписатьОбъявлениеХМЬ() - метод
ЗаписьХМЬ, 326, 327
ЗаписатьСтрокуО - метод
ЗаписьТекста, 322
ЗаписатьТекст() - метод
ЗаписьХМЬ, 326, 327
ЗаписьЖурналаРегистрации() - метод
Глобальный контекст, 312
Заполнить() - метод
ПараметрыМакетаТабличногоДокумента, 258, 270, 277, 278
ЗаполнитьЗначения() - метод
ТаблицаЗначений, 71
ЗаполнитьЗначенияСвойств() - метод
Глобальный контекст, 72, 117, 212
ЗаполнитьНастройки() - метод
ПостроительОтчета, 282
ЗарегистрироватьИзменения() - метод
ПланыОбменаМенеджер, 379
Значение - свойство
ЗначениеСерииСлояГеографическойСхемы, 302
Индикатор, 204
ОформлениеЯчейки, 186, 193
ПараметрыПеретаскивания, 191, 192
СерияСлояГеографическойСхемы, 303
ТабличноеПоле, 262
ТочечныйОбъектГеографическойСхемы, 304
ЧтениеХМЬ, 329
ЭлементОтбора, 51, 177, 183
ЭлементСпискаЗначений, 196, 319, 349
ЗначениеПо - свойство
ЭлементОтбора, 51
ЗначениеС - свойство
ЭлементОтбора, 51

397
Указатель

и
ИгнорироватьПустоеПространство - свойство
СравнениеФайлов, 339
ИерархическийПросмотр - свойство
Расширение табличного поля списка справочника, 180
ИЕРАРХИЯ
Язык запросов, 262, 282, 291
ИзвлечьВсе() - метод
ЧтениегГРФайла, 338
ИзменениеЗарегистрировано() - метод
ПланыОбменаМенеджер, 368, 378
ИзмененятьСпособОтображенияОкна - свойство
Форма, 173
ИзменятьНастройку - свойство
КолонкаТабличногоПоля, 181
ИзменятьНастройкуКолонок - свойство
ТабличноеПоле, 181
ИзменятьПозицию - свойство
КолонкаТабличногоПоля, 181
ИзменятьПозициюКолонок - свойство
ТабличноеПоле, 181
ИМЕЮЩИЕ
Язык запросов, 219
Имя - свойство
КГРФайл, 350
КолонкаТаблицыЗначений, 43
ОписаниеПараметраЗапроса, 252
ПользовательИнформационнойБазы, 313, 315
Файл, 336
ЧтениеХМЬ, 329, 377
ЭлементОтбора, 51
ИмяКомпьютера - свойство
СоединениеИнформационнойБазы, 318
ИмяПриложения - свойство
СоединениеИнформационнойБазы, 318
ИмяТипа - свойство
ТипДанныхХМЬ, 376
Индекс() - метод
КнопкиКоманднойПанели, 198
КоллекцияКолонокТаблицыЗначений, 73
Индексы - свойство
XBase, 331
ИнтервалыФона - свойство

398
Указатель

ДиаграммаГанта, 300
Использование - свойство
ЭлементОтбора, 51, 177, 182, 183
ИспользованиеРабочейДаты - свойство
Глобальный контекст, 311
ИспользоватьРежимПроведения - свойство
Расширение формы документа, 120
ИсточникДанных - свойство
АнализДанных, 253, 255, 256
Диаграмма, 290, 291
МодельПрогнозаПоискАссоциаций, 255
МодельПрогнозаПоискПоследовательностей, 256
СводнаяТаблица, 263, 281, 283
СлойГеографическойСхемы, 304
ИТОГИ КОЛИЧЕСТВО0
Язык запросов, 239
ИТОГИ МАКСИМУМ()
Язык запросов, 251
ИТОГИ ОБЩИЕ
Язык запросов, 277, 282, 291, 359
ИТОГИ ПО
Язык запросов, 61, 94, 97, 217, 351
ИТОГИ СУММА()
Язык запросов, 222, 233, 249, 258, 261, 277, 281, 282, 291

К
Картинка - свойство
КнопкаКоманднойПанели, 198
ПолеКартинки, 176
РисунокТабличногоДокумента, 279, 280
КартинкаЗаголовка - свойство
СтраницаПанели, 194
Каталог - свойство
ДиалогВыбораФайла, 335
КлючУникальности - свойство
Форма, 180
КнопкаОткрытия - свойство
ПолеВвода, 187
КнопкаСпискаВыбора - свойство
ПолеВвода, 189
Кнопки - свойство
КнопкаКоманднойПанели, 198
КоманднаяПанель, 198

399
Указатель

КОГДА
Язык запросов, 96
Код - свойство
СправочникВыборка, 321, 331
СправочникОбъект, 89, 90
СправочникСсылка, 352
КОЛИЧЕСТВО
Язык запросов, 122
КОЛИЧЕСТВО РАЗЛИЧНЫЕ
Язык запросов, 122
КОЛИЧЕСТВО!)
Язык запросов, 237
Количество!) - метод
ВыборкаИзРезультатаЗапроса, 240
КоллекцияКолонокРезультатаЗапроса, 95
Массив, 37,41,348
ОбъектыСлояГеографическойСхемы, 302
СерииДиаграммы, 288
ТочкиМаршрутаБизнесПроцесса, 165
КОЛИЧЕСТВО!*)
Язык запросов, 92, 93
КоличествоСерий - свойство
Диаграмма, 287, 288
КоличествоСтрок() - метод
ТекстовыйДокумент, 322
КоличествоТочек - свойство
Диаграмма, 287
Колонки - свойство
КолонкаТаблицыЗначений, 43
СводнаяТаблица, 283
ТаблицаЗначений, 187, 303, 318
ТабличноеПоле, 181, 187, 189
Конец - свойство
ИнтервалДиаграммыГанта, 293, 297
ПолосаИзмерительнойДиаграммы, 289
СвязьДиаграммыГанта, 297
КонецМесяца() - метод
Глобальный конеткст, 293
Константы - свойство
Глобальный контекст, 346, 347
Конструктор
СОМОбъект, 320, 351, 356, 357, 359, 362, 363
РТРСоединение, 349, 350
НТТРСоединение, 350

400
Указатель

XBase, 331
АнализДанных, 253, 254, 255
ГрафическаяСхема, 212
ДвоичныеДанные, 102, 345, 346
Действие, 198
ДиалогВыбораФайла, 102, 335, 336, 338, 342
ДиалогВыбораЦвета, 211
ДиалогВыбораШрифта, 211
ЗаписьХМЬ, 326, 327, 328, 371, 373
Записьг1РФайла, 338
ЗаписьТекста, 317, 322
Запрос, 20,44,45, 56, 60, 75, 85, 91,92,95, 97, 99, 112, 118, 129, 131, 132,
135, 165, 193, 198, 212, 252, 253, 254, 255, 257, 261, 269, 277, 281, 287, 290,
291,351,359
ИнтернетПочта, 346, 347
ИнтернетПочтовоеСообщение, 346
ИнтернетПочтовыйПрофиль, 346, 347
Картинка, 102, 279
КвалификаторыСтроки, 74
КвалификаторыЧисла, 75
Массив, 23, 32, 33, 38, 43, 44, 46, 47, 57, 64, 72, 94, 187, 191, 319
ОписаниеТипов, 23, 74, 75, 148, 187, 303
ПостроительОтчета, 264, 282
ПостроительОтчетаАнализаДанных, 253
Почта, 345
ПочтовоеСообщение, 345
СистемнаяИнформация, 314
Соответствие, 61, 193
СочетаниеКлавиш, 200
СписокЗначений, 40, 131, 189, 193, 196, 197, 302
СравнениеФайлов, 339
Структура, 50, 51, 53, 54, 61, 115, 319, 384
ТабличныйДокумент, 254, 255, 270, 279
ТекстовыйДокумент, 321, 322, 328
УникальныйИдентификатор, 174, 377
Файл, 336, 350
ХранилищеЗначения, 102
ЧтениеХМЬ, 328, 329, 375
4TeHHeZH^amia, 338
ЧтениеТекста, 323

л
Лево - свойство

401
Указатель

РисунокТабличногоДокумента, 280
ЛЕВОЕ СОЕДИНЕНИЕ
Язык запросов, 157, 227, 233, 242, 247, 251

м
Макет - свойство
ПостроительОтчета, 262, 265, 272, 274
ПостроительОтчетаАнализаДанных, 254
МакетОформления - свойство
ПостроительОтчета, 276
СводнаяТаблица, 283
МаксимальноеЗначение - свойство
Диаграмма, 289
Индикатор, 204
МАКСИМУМ
Язык запросов, 247
МАКСИМУМ()
Язык запросов, 235
МаксимумСерий - свойство
Диаграмма, 287
МаксимумСерийКоличество - свойство
Диаграмма, 287
Массив, 32
МЕЖДУ
Язык запросов, 269
Метаданные - свойство
Глобальный контекст, 176, 189, 314, 379
Метаданные() - метод
ДокументОбъект, 174, 273
ДокументСсылка, 201
Метки - свойство
ЭлементШкалыВремени, 298
МинимальноеЗначение - свойство
Диаграмма, 289
МножественныйВыбор - свойство
ДиалогВыбораФайла, 102, 335
МонопольныйРежим() - метод
Глобальный контекст, 312

н
Наименование - свойство
ЗадачаОбъект, 168

402
Указатель

ПланВидовХарактеристикОбъект, 148
ПочтовоеВложение, 345
СправочникВыборка, 321, 331
СправочникОбъект, 89, 90
Найти() - метод
Глобальный контекст, 322
КнопкиКоманднойПанели, 198
КоллекцияКолонокТаблицыЗначений, 43, 72, 187
КоллекцияСтрокДереваЗначений, 77
КолонкиАнализаДанных, 256
КритерийОтбораМенеджер, 170
ПланСчетовВидыСубконто, 148
НайтиПараметры() - метод
Запрос, 252
НайтиПоКодуО - метод
ПланОбменаМенеджер, 371, 373, 378, 379
ПланСчетовМенеджер, 148
СправочникМенеджер, 89, 90, 352
НайтиПоНаименованиюО - метод
ПланВидовХарактеристикМенеджэр, 384
ПланВидовХарактристикМенеджер, 148
СправочникМенеджер, 182
НайтиПоНомеруО - метод
ДокументМенеджер, 379
НайтиСтроки() - метод
ДокументТабличнаяЧасть, 53, 115
НайтиТекст() - метод
Табличный Документ, 265, 274
НайтиФайлы() - метод
РТРСоединение, 350
Глобальный контекст, 336, 337, 340
НастройкаКолонок - свойство
АнализДанных, 256
НастройкаОтбора - свойство
Расширение табличного поля списка справочника, 190
НастройкаПорядка - свойство
Расширение табличного поля списка справочника, 190
Начало - свойство
ИнтервалДиаграммыГанта, 293, 297
ПолосаИзмерительнойДиаграммы, 289
СвязьДиаграммыГанта, 297
Начало выбора - событие
ПолеВвода, 178
Начало перетаскивания - событие

403
Указатель

ТабличноеПоле, 190
НачалоДня() - метод
Глобальный контекст, 19, 297
НачалоМесяцаО - метод
Глобальный контекст, 293
НачалоНедели() - метод
Глобальный контекст, 300
НачалоСеанса - свойство
СоединениеИнформационнойБазы, 318
НачальнаяСтраница - свойство
КолонтитулТабличногоДокумента, 273
НачатьАвтогруппировкуСтрок() - метод
ТабличныйДокумент, 260
НачатьЗапись() - метод
ЗаписьСообщенияОбмена, 371, 373
НачатьЧтение() - метод
ЧтениеСообщенияОбмена, 375
Низ - свойство
ОбластьЯчеекТабличногоДокумента, 272
НомерСоединения - свойство
СоединениеИнформационнойБазы, 318
НомерСообщения - свойство
ЗаписьСообщенияОбмена, 371, 373
ЧтениеСообщенияОбмена, 375

о
Области - свойство
ТабличныйДокумент, 272
Область() - метод
ТабличныйДокумент, 265, 270, 271, 272, 274
ОбластьЗаголовка - свойство
Диаграмма, 287, 291
ДиаграммаГанта, 293
ОбластьПечати - свойство
ТабличныйДокумент, 271
ОбластьПостроения - свойство
ДиаграммаГанта, 298
Обновление - свойство
ГеографическаяСхема, 302, 303
Диаграмма, 287, 288
Обработка выбора - событие
Форма, 100
Обработка интерактивной активации - событие

404
Указатель

ТочкаМаршрутаБизнесПроцессаСсылка, 164, 166


Обработка проведения - событие
ДокументОбъект, 152
Обход записей
XBase, 331
РегистрНаборЗаписей, 112, 113
РегистрСведенийНаборЗаписей, 125
Обход строк
ДокументТабличнаяЧасть, 116, 117, 374
ТаблицаЗначений, 72, 73, 123, 160, 187
Текстовый Документ, 322
Обход элементов
Filter-Collection, 381
ВыборкаДанных, 371, 373
ВыборкаИзРезультатаЗапроса, 46, 61, 85, 92, 99, 133, 165, 193, 198, 204, 212,
270, 288, 352
ДокументВыборка, 111
ИнтервалДиаграммыГанта, 297
Кол лекцияВыде ленных Дат, 203
КоллекцияКолонокТаблицыЗначений, 72
Массив, 37, 38, 42, 73, 94, 115, 170, 192, 313, 318, 336, 340, 345, 348, 350
ОбъектыСлояГеографическойСхемы, 302, 304
ОписаниеПараметровЗапроса, 252
Отбор, 51, 182
ОформленияСтрок, 186, 193
ПочтовыеВложения, 345
РегистрБухгалтерииНаборЗаписей, 152
РегистрБухгалтерииСубконто, 152
РолиПользователя, 313
СписокЗначений, 196, 214, 319, 349
СправочникВыборка, 86, 91, 191, 321, 322, 326, 327, 331
Структура, 56
ОБЪЕДИНИТЬ
Язык запросов, 225, 230
ОБЪЕДИНИТЬ ВСЕ
Язык запросов, 75, 93, 156, 245, 249
ОбъединитьФайлы() - метод
Глобальный контекст, 338
Объекты - свойство
СлойГеографическойСхемы, 302
Окончание ввода текста - событие
ПолеВвода, 197
Окр() - метод
Глобальный контекст, 348

405
Указатель

ОперативнаяПамять - свойство
СистемнаяИнформация, 314
Ориентация - свойство
Индикатор, 204
ОриентацияСтраницы - свойство
Табличный Документ, 273
ОсновнойИнтерфейс - свойство
ПользовательИнформационнойБазы, 213, 315
Отбор - свойство
ДокументСписок, 177, 182
ЖурналДокументовСписок, 176
СправочникСписок, 177, 183
ОтключитьОбработчикОжиданияО - метод
Глобальный контекст, 215
Отключиться() - метод
ИнтернетПочта, 346, 348
Почта, 345
Открыть() - метод
Форма, 100, 104, 117, 164, 172, 173, 174, 175, 178, 196
ОткрытьМодально() - метод
Форма, 100, 363
ОткрытьФайл() - метод
XBase, 331
ЗаписьХМЬ, 326, 373
ЧтениеХМЬ, 329, 375
ОтметитьЭлементы() - метод
СписокЗначений, 196
ОтображатьЛинии - свойство
СводнаяТаблица, 283
ОтображатьПериодическиеМетки - свойство
ЭлементШкалыВремени, 298
ОтображатьПоля - свойство
СводнаяТаблица, 263
ОтображатьПроценты - свойство
Индикатор, 204
Отображение - свойство
КнопкаКоманднойПанели, 198
Отправитель - свойство
ИнтернетПочтовоеСообщение, 348
Отправитель - свойство
ИнтернетПочтовоеСообщение, 346
ЧтениеСообщенияОбмена, 375
ОформитьМакет() - метод
ПостроительОтчета, 276

406
Указатель

Очистить() - метод
ДокументТабличнаяЧасть, 377
КоллекцияКолонокДереваЗначений, 76
Массив, 37
Соответствие, 61
Структура, 51
ТабличныйДокумент, 258, 265, 277
Очистка - событие
ПолеВвода, 202

п
Параметр - свойство
ОбластьЯчеекТабличногоДокумента, 265, 275
ПараметрОтборПоВладельцу - свойство
Расширение формы списка справочника, 175
ПараметрРасшифровки - свойство
ОбластьЯчеекТабличногоДокумента, 265
ПараметрТекущаяСтрока - свойство
Расширение формы списка документов, 174
Параметры - свойство
ТабличныйДокумент, 258, 270, 277, 278
ПараметрыСеанса - свойство
Глобальный контекст, 163
Пароль - свойство
ИнтернетПочтовыйПрофиль, 346, 347
ПользовательИнформационнойБазы, 315
ПарольБМТР - свойство
ИнтернетПочтовыйПрофиль, 346
ПарольУстановлен - свойство
ПользовательИнформационнойБазы, 313
ПервыйФайл - свойство
СравнениеФайлов, 339
Перед выполнением - событие
БизнесПроцессОбъект, 163
Перед созданием задач - событие
ТочкаМаршрутаБизнесПроцессаСсылка, 168
Перейти() - метод
ПолеНТМЬДокумента, 333
ПереключитьИнтерфейс() - метод
КоллекцияЭлементовУправленияИнтерфейсами, 214
ПереместитьФайл() - метод
Глобальный контекст, 337
Перетаскивание - событие

407
Указатель

ТабличноеПоле, 192
Перечисления - свойство
Глобальный контекст, 183, 244
Период - свойство
РегистрБухгалетрииЗапись, 152
ПериодДействияКонец - свойство
РегистрРасчетаЗапись, 160
ПериодДействияНачало - свойство
РегистрРасчетаЗапись, 160
ПериодРегистрации - свойство
РегистрРасчетаЗапись, 160
ПланыВидовХарактеристик - свойство
Глобальный контекст, 384
ПланыОбмена - свойство
Глобальный контекст, 371, 373, 375, 378, 379
ПовторятьПриПечатиСтроки - свойство
ТабличныйДокумент, 272
ПоддержкаМасштаба - свойство
ПолеГеографическойСхемы, 301
ПодключитьОбработчикОжидания() - метод
Глобальный контекст, 215, 340
ПодключитьсяО - метод
ИнтернетПочта, 346, 347
Почта, 345
ПОДОБНО
Язык запросов, 97, 129, 133
Показать() - метод
ТабличныйДокумент, 254, 256, 262, 270, 279
ПоказатьРазличия() - метод
СравнениеФайлов, 339
ПоказатьУровеньГруппировокСтрок() - метод
ТабличныйДокумент, 260
ПоказыватьВСпискеВыбора - свойство
ПользовательИнформационнойБазы, 315
ПОЛНОЕ СОЕДИНЕНИЕ
Язык запросов, 229
ПолноеИмя - свойство
БТРФайл, 349
ПользовательИнформационнойБазы, 313, 315
Файл, 336
ПолноеИмяФайла - свойство
ДиалогВыбораФайла, 102, 335, 336, 338, 342
ПоложениеОкна - свойство
Форма, 173

408
Указатель

ПолосыИзмерительнойДиаграммы - свойство
Диаграмма, 289
Получатели - свойство
ИнтернетПочтовоеСообщение, 346, 348
ПочтовоеСообщение, 345
Получить() - метод
РТРСоединение, 349
НТТРСоединение, 350
ВыборкаДанных, 371, 373
КонстантаМенеджер, 346, 347
Массив, 33
ОболочкаАсйуеВоситегИ:, 344
ОбъектыСлояГеографическойСхемы, 302
РегистрСведенийМенеджер, 384
Соответствие, 59, 193
ХранилищеЗначения, 22, 176
ПолучитьСОМОбъект() - метод
Глобальный контекст, 355
ПолучитьХМЬТип() - метод
Глобальный контекст, 376
ПолучитьВремяИзменения() - метод
Файл, 336
ПолучитьГраницы() - метод
ПоследовательностьМенеджер, 123
ПолучитьДополнениеО - метод
РегистрРасчетаНаборЗаписей, 160
ПолучитьЗначениеО - метод
ДиаграммаГанта, 293, 295, 296
СлойГеографическойСхемы, 302, 304
ПолучитьМакет() - метод
ОбработкаОбъект, 344
ОтчетОбъект, 258, 270, 276, 277
ПолучитьМакетОформления() - метод
Глобальный контекст, 276, 283
ПолучитьНевидимость() - метод
Файл, 336
ПолучитьОбласть() - метод
ТабличныйДокумент, 258, 270, 277, 279, 280
ПолучитьОбщийМакет() - метод
Глобальный контекст, 301
ПолучитьОбъект() - метод
Документ, 111
ДокументСсылка, 106, 107, 115, 328, 377
ПланСчетовСсылка, 148

409
Указатель

СправочникСсылка, 87, 99
ПолучитьПользователей() - метод
ПользователиИнформационнойБазы, 313, 319
ПолучитьПоследнее() - метод
РегистрСведенийМенеджер, 54
ПолучитьСоединенияИнформационнойБазы() - метод
Глобальный контекст, 318
ПолучитьСсылкуО - метод
ДокументМенеджер, 377
ПолучитьСтрокуО - метод
Текстовый Документ, 322
ПолучитьТекст() - метод
Текстовый Доку мент, 328
ПолучитьТолькоЧтениеО - метод
Файл, 336
ПолучитьФормуО - метод
ДокументОбъект, 117, 363
ДокументСсылка, 172
МенеджерВнешнихОбработок, 172
ОтчетМенеджер, 173
ПолучитьФормуВыбораО - метод
СправочникМенеджер, 100, 178
ПолучитьФормуНовогоДокумента() - метод
ДокументМенеджер, 104
ПолучитьФормуСписка() - метод
ДокументМенеджер, 174, 196
СправочникМенеджер, 175
ПользователиИнформационнойБазы - свойство
Глобальный контекст, 213, 313, 315, 319
Пользователь - свойство
ИнтернетПочтовыйПрофиль, 346, 347
СоединениеИнформационнойБазы, 318
ПользовательЗМТР - свойство
ИнтернетПочтовыйПрофиль, 346
Поля - свойство
XBase, 331
Пометка - свойство
ЭлементСпискаЗначений, 196, 214, 319, 349
ПометкаУдаления - свойство
ДокументОбъект, 377
ПортРОРЗ - свойство
ИнтернетПочтовыйПрофиль, 347
nopTSMTP - свойство
ИнтернетПочтовыйПрофиль, 346

410
Указатель

Послать() - метод
ИнтернетПочта, 346
Почта, 345
Представление - свойство
ЭлементОтбора, 51
ЭлементСпискаЗначений, 319
ПредставлениеПриложения() - метод
Глобальный контекст, 318
Предупреждение() - метод
Глобальный контекст, 24, 311, 314, 351, 363
ПрерватьЗапись() - метод
ЗаписьСообщенияОбмена, 371
При выполнении - событие
ТочкаМаршрутаБизнесПроцессаСсылка, 165, 166
При изменении - событие
ПолеВвода, 185, 201, 333
При начале работы системы - событие
Модуль приложения, 215
При окончании редактирования интервала - событие
ДиаграммаГанта, 296
При открытии - событие
Форма, 177, 189, 195, 340
При отправке данных подчиненному - событие
ПланОбменаОбъект, 367, 370
При получении данных - событие
ТабличноеПоле, 186, 193
При получении данных от главного - событие
ПланОбменаОбъект, 368
При получении данных от подчиненного - событие
ПланОбменаОбъект, 368
При создании задач - событие
ТочкаМаршрутаБизнесПроцессаСсылка, 166
Примечание - свойство
ОбластьЯчеекТабличногоДокумента, 270
Проверка перетаскивания - событие
ТабличноеПоле, 191
Проверка условия - событие
ТочкаМаршрутаБизнесПроцессаСсылка, 165
ПроверкаОтображенияНовойСтроки - свойство
Расширение табличного поля списка справочника, 184
Процессор - свойство
СистемнаяИнформация, 314
Прочитать() - метод
ГеографическаяСхема, 301

411
Указатель

ГрафическаяСхема, 212
РегистрНаборЗаписей, 112, 113
РегистрСведенийМенеджерЗаписи, 133
РегистрСведенийНаборЗаписей, 45, 125
ТекстовыйДокумент, 322, 328
ЧтениеХМЬ, 329, 377
ПрочитатьХМЬ() - метод
Глобальный контекст, 328, 376, 377
ПрочитатьАтрибут() - метод
ЧтениеХМЬ, 329
ПрочитатьСтрокуО - метод
ЧтениеТекста, 323
Пустая() - метод
ДокументСсылка, 201, 379
ПланВидовХарактеристикСсылка, 148
ПланСчетовСсылка, 148
СправочникСсылка, 41, 52, 89, 90, 94, 175, 178, 352
ПустаяСсылка() - метод
ДокументМенеджер, 75
СправочникМенеджер, 21, 95, 118, 166, 238
Пустой() - метод
РезультатЗапроса, 95
Путь - свойство
Файл, 336
ПутьКДанным - свойство
ЭлементОтбора, 51

РабочаяДата - свойство
Глобальный контекст, 111, 311
РазделитьФайл() - метод
Глобальный контекст, 337
РазмерО - метод
Файл, 336
РазмерКартинки - свойство
РисунокТабличногоДокумента, 280
Расширение - свойство
Файл, 336
Редактирование - свойство
ЗначениеДиаграммыГанта, 296
РежимВыделения - свойство
ПолеКалендаря, 203
Ресурсы - свойство

412
Указатель

Диаграмма, 291
Рисунки - свойство
ТабличныйДокумент, 279, 280
Родитель - свойство
СправочникОбъект, 89, 90, 99
СправочникСсылка, 94
Роли - свойство
ПользовательИнформационнойБазы, 313, 315

Свойство() - метод
Структура, 52
СГРУППИРОВАТЬ ПО
Язык запросов, 218, 219, 224, 230, 235, 237, 242, 247, 258, 281, 282, 287, 291
Серии - свойство
Диаграмма, 288, 291
СлойГеографическойСхемы, 302, 303
Символ() - метод
Глобальный контекст, 321, 322
Системные наборы значений
\¥еЬЦвета, 50, 186, 289, 293, 295, 297
Символы, 24, 314, 317, 336, 348
Системные перечисления
ВариантПоложенияОкна, 173
ВариантПроверкиОтображенияНовойСтроки, 184
ВариантСпособаОтображенияОкна, 173
ВидПодписейКДиаграмме, 287
ВидСравнения, 177, 183
ДопустимаяДлина, 74
ИзменениеСпособаОтображенияОкна, 173
ИспользованиеРежимаПроведения, 120
КодировкаТекста, 322, 323
МаксимумСерий, 287
МетодСжатияг1Р, 338
НаправлениеСортировки, 40
ОбходРезультатаЗапроса, 61, 258, 262, 277, 278, 352
ОриентацияСтраницы, 273
ОтображениеКнопкиКоманднойПанели, 198
ОтправкаЭлементаДанных, 367, 370
ПолучениеЭлементаДанных, 368
РазмерКартинки, 280
РежимВосстановленияПутейФайлов71Р, 338
РежимВыделенияДаты, 203

413
Указатель

РежимДиалогаВыбораФайла, 102, 335, 336, 338, 342


РежимЗаписиДокумента, 106, 109, 120, 352
РежимОбработкиПодкаталoroBZIP, 338
РежимОтображенияГеографическойСхемы, 301
РежимРабочейДаты, 311
РежимСохраненияПутей71Р, 338
СпособСравненияФайлов, 339
СтандартноеОформление, 276, 283
ТипДиаграммы, 289
ТипЕдиницыШкалыВремени, 298
ТипКнопкиКоманднойПанели, 198
ТипКолонкиАнализаДанныхГТоискПоследовательносгей, 256
ТипОрганизацииИсточникаДанныхГеографическойСхемы, 304
ТипОтображенияЛинийСводнойТаблицы, 283
ТипОтображенияСерииСлояГеографическойСхемы, 302, 304
ТипРисункаТабличногоДокумента, 280
ТипУзлаХМЬ, 329
УровеньЖурналаРегистрации, 312
УровеньСжатия21Р, 338
ЧастиДаты, 75
Скопировать() - метод
ДокументОбъект, 111
ТаблицаЗначений, 72
Следующая() - метод
XBase, 331
Следующий() - метод
ВыборкаДанных, 371, 373
ВыборкаИзРезультатаЗапроса, 61, 85, 92, 95, 99, 133, 165, 193, 198, 204, 212,
258, 270, 277, 278, 288, 352
ДокументВыборка, 111
СправочникВыборка, 86, 90, 91, 191, 321, 322, 326, 327, 331
Слои - свойство
ГеографическаяСхема, 302, 303, 304
Создать() - метод
МенеджерВнешнихОбработок, 169
СоздатьГруппуО - метод
СправочникМенеджер, 89
СоздатьДокумент() - метод
ДокументМенеджер, 104, 117, 348, 352, 363, 377
СоздатьЗадачуО - метод
ЗадачаМенеджер, 168
СоздатьЗаписьСообщения() - метод
ПланыОбменаМенеджер, 371, 373
СоздатьИндексныйФайл() - метод

414
Указатель

XBase, 331
СоздатьКолонки() - метод
ТабличноеПоле, 77, 187, 205, 255, 256, 262, 304, 318
СоздатьМенеджерЗаписи() - метод
РегистрСве денийМене джер ,133
СоздатьМодельПрогноза() - метод
РезультатАнализаДанныхПоискАссоциаций, 255
РезультатАнализаДанныхПоискПоследовательностей, 256
СоздатьНаборЗаписей() - метод
РегистрСведенийМенеджер, 45, 125, 126, 127, 128, 130, 135
РегистрСве денийНаборЗаписей, 124
СоздатьПользователя() - метод
ПользователиИнформационнойБазы, 315
СоздатьФайл()- мтод
XBase, 331
СоздатьЧтениеСообщения() - метод
ПланыОбменаМенеджер, 375
СоздатьЭлемент() - метод
ПланВидовХарактеристикМенеджер, 148
СправочникМенеджер, 89, 90, 352
СокрЛП(), 56
Сообщить() - метод
Глобальный контекст, 18, 19, 22, 25, 26, 27, 59, 89, 95, 170, 177, 182, 203,
311, 312, 322, 323, 329, 331, 336, 337, 340, 344, 345, 357, 359, 371
СортироватьПоЗначению() - метод
СписокЗначений, 40
СортироватьПоПредставлению() - метод
СписокЗначений, 302
СочетаниеКлавиш - свойство
КнопкаКоманднойПанели, 200
СписокВыбора - свойство
ПолеВвода, 201
ПолеВыбора, 189
СпособОтображенияОкна - свойство
Форма, 173
СпособСравнения - свойство
СравнениеФайлов, 339
Справочники - свойство
Глобальный контекст, 321, 322, 326, 327, 331, 352
Сред() - метод
Глобальный контекст, 322
ССЫЛКА
Язык запросов, 235
Ссылка - свойство

415
Указатель

ДокументОбъект, 174
СправочникВыборка, 191
СтильОтображения - свойство
Индикатор, 204
Сторно - свойство
РегистрРасчетаЗапись, 160
Страницы - свойство
Панель, 194, 195
СтрЗаменить() - метод
Глобальный контекст, 200, 321, 322
Строка() - метод
Глобальный контекст, 182, 321, 345
Строки - свойство
Сводная Таблица, 283
Структура, 47
СубконтоДт - свойство
РегистрБухгалетрииЗапись, 152
СубконтоКт - свойство
РегистрБухгалетрииЗапись, 152
СУММА()
Язык запросов, 93, 218, 219, 224, 230, 241, 257, 281, 282, 287, 291
СчетДт - свойство
РегистрБухгалетрииЗапись, 152
СчетКт - свойство
РегистрБухгалетрииЗапись, 152

Текст - свойство
Запрос, 44, 45, 56, 60, 75, 85, 91,92, 99, 112, 118, 121, 129, 131, 132, 135, 165,
244, 253, 254, 255, 257, 261, 269, 277, 281, 287, 351, 359
ИнтервалДиаграммыГанта, 293
ИнтернетТекстПочтовогоСообщения, 348
МеткаЭлементаШкалыВремени, 298
ОбластьЗаголовка, 287, 291
ОбластьЗаголовкаДиаграммыГанта, 293
ПостроительОтчета, 264, 282
ПочтовоеСообщение, 345
РисунокТабличногоДокумента, 270
Серия Диаграммы, 288
ТочкаДиаграммы, 287
ТекстНевыбраннойКартинки - свойство
ПолеКартинки, 209
ТекстСлева - свойство

416
Указатель

КолонтитулТабличногоДокумента, 273
ТекстСправа - свойство
КолонтитулТабличногоДокумента, 273
Тексты - свойство
ИнтернетПочтовоеСообщение, 346, 348
ТекущаяДата() - метод
Глобальный контекст, 25, 163, 293
ТекущаяСтраница - свойство
Панель, 195
ТекущаяСтрока - свойство
ТабличноеПоле, 77, 116, 182, 185
ТекущиеДанные - свойство
ТабличноеПоле, 116
ТекущийИндекс - свойство
XBase, 331
ТекущийПользователь() - метод
МенеджерПользователейИнформационнойБазы, 213
ТекущийРодитель - свойство
ТабличноеПоле, 180
Тема - свойство
ИнтернетПочтовоеСообщение, 346, 348
ПочтовоеСообщение, 345
Тип() - метод
Глобальный контекст, 20, 22, 23, 187, 192, 253, 254, 255, 256, 367, 368, 370,
373, 378
ТипАнализа - свойство
АнализДанных, 253, 254, 255
ПостроительОтчетаАнализаДанных, 254, 256
ТипДиаграммы - свойство
Диаграмма, 289
ТипЗначения - свойство
ОписаниеПараметраЗапроса, 252
ПланВидовХарактеристикОбъект, 148
ЭлементОтбора, 51
ТипЗнч() - метод
Глобальный контекст, 20, 22, 192, 348, 367, 368, 370, 373, 378
ТипКолонки - свойство
КолонкаАнализаДанных, 256
ТипОрганизацииИсточникаДанных - свойство
СлойГеографическойСхемы, 304
ТипОтображения - свойство
СерияСлояГеографическойСхемы, 302, 304
ТипУзла - свойство
ЧтениеХМЬ, 329

417
Указатель

ТОЛЬКО ИЕРАРХИЯ
Язык запросов, 94, 97, 217, 233
ТочкаМаршрута - свойство
ЗадачаОбъект, 168
Точки - свойство
Диаграмма, 291

Удалить() - метод
ДокументТабличнаяЧасть, 115
КнопкиКоманднойПанели, 198
КоллекцияКолонокТаблицыЗначений, 73
Массив, 37, 41
Структура, 52
УдалитьРегистрациюИзменений() - метод
ПланыОбменаМенеджер, 375
УдалитьФайлы() - метод
Глобальный контекст, 337
УПОРЯДОЧИТЬ ПО
Язык запросов, 145, 150, 151, 165, 232, 237, 239, 251, 253, 254, 265, 269, 359
Уровень() - метод
ВыборкаИзРезультатаЗапроса, 260, 261
Установить() - метод
ЭлементОтбора, 45, 124, 126, 127, 176, 183
УстановитьЗначение() - метод
Даиграмма, 288
УстановитьМонопольныйРежим() - метод
Глобальный контекст, 311,312
УстановитьНовыйНомерО - метод
ДокументОбъект, 377
УстановитьПараметрО - метод
Запрос, 20,44,46,56, 76, 85,91,92,95,97, 99, 112, 118, 121, 131, 135, 165,
193, 212, 244, 252, 253, 254, 256, 258, 262, 269, 277, 281, 290, 351, 359
УстановитьПолныйИнтервал() - метод
ДиаграммаГанта, 293
УстановитьПометкуУдаления() - метод
ДокументОбъект, 111
УстановитьСерию() - метод
ДиаграммаГанта, 293
УстановитьСсылкуНового() - метод
ДокументОбъект, 377
УстановитьСтрокуО - метод
ЗаписьХМЬ, 327, 328, 371

418
Указатель

ЧтениеХМЬ, 328
УстановитьСхемуО - метод
ПолеГрафическойСхемы, 212
УстановитьТекст() - метод
ТекстовыйДокумент, 328
УстановитьТочкуО - метод
ДиаграммаГанта, 293

Ф
ФиксацияСверху - свойство
ТабличныйДокумент, 272
Фильтр - свойство
ДиалогВыбораФайла, 102, 335, 338, 342
Формат - свойство
ОбластьЯчеекТабличногоДокумента, 275
ПолеВвода, 208
Формат() - метод
Глобальный контекст, 25

Цвет - свойство
ДиалогВыбораЦвета, 211
СвязьДиаграммыГанта, 295, 297
СерияДиаграммыГанта, 293
ЦветЛинии - свойство
МеткаЭлементаШкалыВремени, 298
ЦветТекста - свойство
МеткаЭлементаШкалыВремени, 298
ЦветФона - свойство
ОформлениеЯчейки, 186
ПолосаИзмерительнойДиаграммы, 289

ЧислоПрописьюО - метод
Глобальный контекст, 26, 27

ш
Шаг - свойство
Индикатор, 204

419
Указатель

Ширина - свойство
РисунокТабличногоДокумента, 280
ШиринаТаблицы - свойство
Табличный Доку мент, 271
ШкалаВремени - свойство
ОбластьПостроенияДиаграммыГанта, 298
Шрифт - свойство
ДиалогВыбораШрифта, 211

ЭлементУправления - свойство
КолонкаТабличногоПоля, 187, 189
Элементы - свойство
ШкалаВремени, 298
ЭлементыФормы - свойство
Форма, 181, 182, 184, 185, 187, 189, 190, 194, 195, 198, 201, 203, 204, 208,
209, 212, 258, 262, 263, 277, 281, 282, 287, 289, 290, 291, 293, 301, 302, 303,
304,318,333,342
ЭтаФорма - свойство
Форма, 173
ЭтоГруппа - свойство
СправочникВыборка, 191, 326, 327
СправочникСсылка, 89, 191
ЭтоНовый() - метод
СправочникОбъект, 195
ЭтоФайл() - метод
БТРФайл, 350

Я
Язык - свойство
ПользовательИнформационнойБазы, 315
Ячейки - свойство
ОформлениеСтроки, 186, 193

420