Габец А.П. Гончаров Д.И. 1С Предприятие 8.0. Простые примеры разработки
1.
2. А.П. Габец, Д.И. Гончаров
1С:Предприятие 8.0
Простые примеры
разработки
Москва
ООО «1С-Паблишинг»
2005
3. УДК 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
4. ОГЛАВЛЕНИЕ
Введение 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
5. Оглавление
Ф Как определить размер массива? 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
6. Оглавление
ф В каких ситуациях обычно используются объекты типа
«Соответствие»? 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
7. Оглавление
ф Как добавить запись в табличную часть элемента
справочника? 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
8. Оглавление
Как получить перечень приходных накладных, в которых не
заполнены номенклатурные позиции? 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
9. Оглавление
Ф Как перенести остаток со счета на счет? 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
10. Оглавление
® Как открыть форму отчета на весь экран? 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
11. Оглавление
Как в командной панели создать подменю с кнопками? 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
12. Оглавление
Как вместе с данными некоторой таблицы получить общие итоги
из этой же таблицы? 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
13. Оглавление
Как сохранить настройки построителя отчета до следующего
открытия формы отчета? 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
15. Оглавление
Как можно сформировать 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
16. Оглавление
ф Как выполнить запрос к произвольной базе данных 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
17. Введение
Идея написать эту книгу возникла у нас не случайно. Платформа
системы «1С: Предприятие 8.0» специально ориентирована на то, что ее
будут использовать не только как средство разработки, но и как
инструмент быстрой доработки «на месте». В таких случаях специалисту
важно в сжатые сроки решить конкретную задачу без долгого изучения
всех возможностей системы.
Как преподаватели учебного центра - мы, разумеется, только за то,
чтобы специалист был изначально методологически и всесторонне
«подкован». Но как практикующие разработчики, кроме всего прочего,
зачастую и сами с большей радостью используем описанные примеры
решения тех или иных задач, нежели пытаемся воссоздать их по памяти
или по методическим материалам.
Собственно говоря, именно с целью помочь в подобных ситуациях, и
была написана эта книга. Основой ее создания послужил опыт
преподавания «программистских курсов» по системе, работа на
конкретных внедрениях и активное общение в форумах, посвященных
данному кругу проблем. Фактически книга составлена в результате
анализа того, какие задачи приходится решать чаще всего как
начинающим, так и продвинутым разработчикам.
При подборе примеров мы исходили из того, что спектр навыков и
знаний специалистов, которые будут работать с данным изданием, может
быть очень широк. Поэтому пусть Вас не смущают некоторые особо
«бородатые» советы или, наоборот, - отсутствие подробного описания тех
или иных технологий. А для тех, кто практически не знаком с системой
«1С:Предприятие 8.0», материал самых простых примеров, объясняющих
азы использования объектов и механизмов системы, помечен
специальным значком ф.
Кроме этого, поскольку работа с настоящим изданием не требует
досконального чтения всего материала, по тексту намеренно вставлены
повторы некоторых приемов или предостережений в тех случаях, когда
это имеет смысл.
Также следует заметить, что мы стремились сделать именно сборник
простых примеров, поэтому некоторые материалы вошли в издание в
«разрезанном» виде. То есть вместо сложных и громоздких «сквозных»
примеров, мы старались представить отдельные части, «кирпичики», из
которых впоследствии можно собрать желаемое.
16
18. Введение
Стиль изложения соответствует цели издания, поэтому материал
предоставляется в форме вопросов и ответов, как, например, в
следующем разделе:
Как работать с изданием?
Решение данного вопроса - многовариантно.
Можно читать классическим способом. От начала до конца, помечая
или закладывая понравившиеся места. Впоследствии, при возникновении
конкретных вопросов, зрительная память или закладки помогут найти
нужное решение.
Можно читать выборочно. Любимая поговорка крутых
программистов: «Мануал открывать надо уже в последний момент». То
есть, проблема возникла - нашли раздел и попытались найти решение,
или идею решения по аналогии. Но поговорку, на самом деле, мы совсем
не одобряем!
Можно вообще не читать. Не читать комментарии. А рассматривать
издание как сборник «шпаргалок» кода, решающего те или иные
вопросы.
Остальные варианты использования издания или не очень нравятся
авторам, или достаточно опасны. Например, не надо рассматривать эту
книжку как замену полноценного обучения или работы с методическими
материалами.
17
19. Примитивные типы, системные
функции
Как явно указать нужную дату?
Для указания нужной даты можно пользоваться:
• литералом вида ТГГГММДДччммсс' встроенного языка;
• встроенной функцией преобразования значений Дата();
• литералом типа Дата языка запросов.
В таблице ниже приводится ряд возможностей явного указания даты
при помощи встроенного языка:
Выражение Значение результата
(тип)
'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
20. Примитивные типы, системные функции
Как сравнить две даты (дни)?
Точность данных типа Дата - до секунды. А сравнивать нужно
именно дни.
Тогда проще предварительно для сравниваемых дат воспользоваться
функцией, которая возвращает, например, дату начала дня. А потом уже
сравнивать полученные значения.
Как прибавить к дате день, месяц?
Так как тип Дата содержит дату и время с точностью до секунды, то
для того чтобы к некоторой дате прибавить один день, нужно увеличить
ее значение на количество секунд, содержащихся в одном дне:
Для увеличения или уменьшения даты на некоторое количество
месяцев, можно использовать:
• функции работы со значением типа Дата во встроенном
языке;
• функции работы со значением типа Дата в запросах.
В таблице ниже приводится ряд возможностей использования
функций встроенного языка:
Выражение Значение результата
(тип)
ДобавитьМесяц(Дата(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
21. Примитивные типы, системные функции
А вот пример функции, добавляющей количество дней к исходной
дате при помощи запроса:
В тексте запроса используем функцию ДОБАВИТЬКДАТЕ(). В
качестве параметров ей необходимо передать исходную дату, тип
добавляемых периодов (в нашем случае жестко прописали «День») и
количество добавляемых периодов.
Первый и последний параметры передали запросу, считав их из
параметров (заголовка) нашей функции.
Далее запрос выполняется, и из него получаем значение выходного
поля по первой (и единственной) строке.
Результаты выполнения вышеприведенной функции будут такими:
ПолучитьДень('20052802', 10) = 10.03.2005 0:00:00
ПолучитьДень('20042802', 10) - 09.03.2004 0:00:00, поскольку 2004
год был високосным!
Как можно проверить тип значения
переменной на равенство нужному?
20
22. Примитивные типы, системные функции
ТипЗнч() - функция языка, возвращающая по значению его тип.
Тип () - функция языка, возвращающая значение типа Тип по
строковому имени типа.
Как очистить реквизит формы, имеющий
ссылочный тип?
К примеру, реквизит (имя «Товар») имеет тип
СправочникСсылка.Номенклатура. Для очистки значения в
связанном с ним элементе управления на форме, необходимо выполнить
строку кода:
То есть необходимо установить значение по умолчанию. А им, в
данном случае, будет пустая ссылка на элемент справочника
«Номенклатура».
Как очистить значение, имеющее тип
«Хранилище значения»?
Очистить значение, записанное в реквизит или ресурс (имя
«РеквизитХранилище») можно следующим образом:
Как проверить тип значения, помещенного в
реквизит имеющий тип «Хранилище
значения»?
По причинам не связанным с возможностями системы
1С:Предприятие 8.0, в реквизит «Фотография» (тип
ХранилищеЗначения) справочника «Сотрудники» помещалась либо
Строка (преобразованная к типу ХранилищеЗначения), либо
Картинка (преобразованная к типу ХранилищеЗначения). Как
проверить, что было записано?
21
23. Примитивные типы, системные функции
Проверку можно осуществить, используя следующие строки кода:
Следует отметить, что в реквизит имеющий тип
ХранилищеЗначения можно поместить только значение, имеющее тип
ХранилищеЗначения. Работа со значением, помещенным в хранилище
значения, может начаться только после его получения (метод
Получить()). После получения значение «восстанавливает свой прежний
тип». Если полученное значение равно Неопределено, то это означает,
что никакое значение в реквизит не записывалось.
Как сжать данные, помещаемые в хранилище
значения?
Допустим, в реквизит «СопроводительнаяИнформация» (тип
значения - Хранилище значения) помещается значение переменной
«ПомещаемоеЗначение». Нужно обеспечить максимальное сжатие
данных закладываемого значения.
Вторым параметром конструктора хранилища значения передается
объект СжатиеДанных. Он тоже получен соответствующим
конструктором, с указанием максимального уровня сжатия.
22
24. Примитивные типы, системные функции
Как предоставить пользователю возможность
выбора значения составного типа?
Для реализации этой задачи необходимо воспользоваться
конструктором объекта ОписаниеТипов. А для него необходимо
передавать в качестве параметра массив разрешенных для вводимого
значения типов значения.
Когда конструктором «ОписаниеВозможныхТипов» собрано -
применяем функцию для вызова диалога ввода данных
ВвестиЗначение().
Первым параметром функции необходимо указать доступную в
данном модуле переменную для принятия введенного значения. Вторым
- заголовок открываемого окна. Третьим - объект ОписаниеТипов.
После ввода значения пользователем можно считать значение с
переменной, переданной первым параметром.
23
25. Примитивные типы, системные функции
Как применить округление при работе с
вычисляемыми числовыми полями в запросе?
Например, составляется запрос для оценок средней цены продажи по
данным регистра «Продажи». Для получения данных с точностью до
двух знаков после запятой текст запроса может выглядеть следующим
образом:
Источником для запроса является виртуальная таблица
«РегистрНакопления.Продажи.Обороты», построенная по данным
регистра в интервале между «ДатаНач» и «ДатаКон».
В качестве выходных полей берем «Номенклатура» и результат
деления значения полей источника «СтоимостьОборот» и
«КоличествоОборот». Причем оператором ВЫРАЗИТЬ() тип последнего
поля приводится к примитивному типу ЧИСЛО с определенным
форматом (длинна 15, точность 2).
Как вывести многострочное предупреждение?
Переменные «Остаток» и «Зарезервировано» содержат значения,
которые необходимо вывести в виде предупреждения. Кроме того, нужно
еще вывести свободный остаток, вычисляемый по формуле:
СвободныйОстаток = Остаток - Зарезервировано.
Все это может быть выполнено следующим образом:
24
26. Примитивные типы, системные функции
Процедура глобального контекста Предупреждение() выводит на
экран модальное окно предупреждения. Текст предупреждения
передается первым параметром, вторым - таймаут, содержащий указание
количества секунд, через которое окно самостоятельно закроется (если
раньше его не закроет пользователь), третьим - указывается заголовок
окна.
Многострочность предупреждения в нашем примере осуществляется
за счет добавления значения ПС (перевод строки) системного набора
значений СИМВОЛЫ в текст предупреждения.
Обратите внимание на вычисление свободного остатка в скобках -
для обеспечения корректности выполнения арифметических действий и
преобразования данных к типу Строка.
Кроме того, хотелось бы предупредить об опасности попыток
применения процедуры Предупреждение() в ходе проведения
документов. Проведение документов выполняется в транзакции, поэтому
использование каких либо интерфейсных решений, останавливающих
работу системы, является совершенно неприемлемым. В подобных
случаях лучше информировать пользователей посредством Сообщить().
Как при выполнении обработки сообщить
пользователю текущее время?
Метод ТекущаяДата() возвращает системную дату. Тип значения -
Дата. В его значение входит и дата и время.
Для получения представления только времени можно применяем
функцию Формат().
Как вывести число прописью по-русски, но без
дробной части?
Для этого используется функция ЧислоПрописью(). У нее могут
быть указаны в качестве параметров:
• преобразуемое число;
• форматная строка;
• параметры предмета исчисления (вид этой форматной
строки определяется значением кода локализации).
25
27. Примитивные типы, системные функции
Все возможные варианты локализаций описаны в файле Locllnfo.txt,
входящем в комплект поставки программы.
Для решения нашей задачи можно использовать следующий текст:
В форматной строке указываем код локализации - Русский(Россия).
В параметрах предмета исчисления показываем, что дробная часть не
должна содержать ни одного разряда.
Для ВыводимоеЧисло = 234,4 результат будет: «Двести тридцать
четыре».
Как вывести число прописью по-русски, с
указанием сотых в дробной части?
В параметрах предмета исчисления указываем возможные спряжения
и склонения слов «целая» и «сотая», а так же количество разрядов
дробной части, которые будут выводиться прописью.
В форматной строке указываются код языка локализации и
необходимость вывода дробной части прописью.
Для ВыводимоеЧисло - 123,45 результат будет: «Сто двадцать три
целых сорок пять сотых».
26
28. Примитивные типы, системные функции
Как вывести прописью число килограммов с
указанием дробной части в граммах?
В отличие от вышеприведенного примера здесь предметами
исчисления являются килограммы и граммы, а количество разрядов
дробной части - три.
Для ВыводимоеЧисло = 12,345 результат будет: «Двенадцать
килограммов триста сорок пять граммов»
Как долларовую сумму вывести прописью по-
английски?
Для ВыводимоеЧисло = 1 232,45 результат будет: «One thousand two
hundreds thirty two dollars 45 cents»
Какзагрузитьвнешнююкомпоненту?
Загрузим компоненту, позволяющую работать со сканером штрих-
кодов:
27
29. Примитивные типы, системные функции
В случае ошибки загрузки компоненты или создания объекта
возникает исключительная ситуация, которую рекомендуется
отрабатывать с помощью конструкции Попытка.
Как выполнить команду операционной
системы?
К примеру, требуется удалить все файлы из указанного каталога.
Для реализации данной возможности достаточно выполнить
следующую строку кода:
Для просмотра доступных команд можно в командной строке
системы выполнить команду «help».
Вызвать командную строку, можно выполнив строку кода:
Кроме этого, для запуска внешнего приложения (или открытия файла
с использованием ассоциированного с ним приложения) может быть
использован метод глобального контекста ЗапуститьПриложение(). В
этом случае запуск приложения будет осуществляться непосредственно,
минуя командный интерпретатор. Например:
28
30. Примитивные типы, системные функции
Как реализовать код процедуры в зависимости
от режима выполнения (на клиенте, на
сервере, во внешнем соединении) ?
Если алгоритм должен выполняться по-разному в зависимости от
места выполнения процедуры, то можно воспользоваться инструкциями
препроцессора:
29
31. Примитивные типы, системные функции
Как при групповой обработке объектов
реализовать стратегию «либо все, либо
ничего»?
Требуется загрузить либо все данные по справочнику «Единицы
измерения», либо, в случае возникновения ошибки, нужно чтобы ни один
элемент не был записан.
Для реализации стратегии «либо все, либо ничего» можно
использовать следующий фрагмент кода:
Если необходимо но мере накопления каких-либо признаков
«искусственно» отменить действия, совершаемые в транзакции, можно
использовать метод системы:
МО
32. Примитивные типы, системные функции
Как посчитать сумму по формуле сложного
процента?
Возведение в степень реализуется функцией Pow(). Первым
параметром передается основание степени, вторым - показатель степени.
Замечание: кроме работы со степенями математический аппарат
системы позволяет работать с корнями, логарифмами и
тригонометрическими функциями.
31
33. Универсальные коллекции
Массив
В каких ситуациях обычно используются
массивы?
Массив является универсальной коллекцией, то есть объектом,
предназначенным для работы с временными наборами данных в течение
сеанса работы пользователя.
Необходимость в его использовании возникает, когда требуется
работать с временным набором данных. Чаще всего это промежуточные
операции обработки информации: подготовка отборов, реализация
поиска, подготовка группирования, передача параметров и проч.
Массивы могут создаваться оператором Новый или получаться в
результате применения методов некоторых объектов.
Как создать массив?
Создание массивов чаще всего происходит посредством оператора
Новый:
где «СозданныйМассив» - имя переменной, которая будет содержать
созданный объект типа Массив. После создания к массиву можно
добавлять элементы (произвольное количество).
Если же мы хотим создать массив с заранее определенной
размерностью, это можно сделать так:
В результате в переменной «СозданныйМассив» будет создан массив
с десятью значениями. Для такого массива можно потом сразу
обращаться к любому из десяти значений (начиная с нулевого по
девятое) для записи или для чтения. А при необходимости к такому
массиву можно так же еще добавлять новые элементы. Первый же
добавленный элемент получит индекс «10».
32