Текст
                    А.П. Гобец, Д.И. Гончаров
1 С:ПРЕДПРИЯТИЕ 8.0
ПРОСТЫЕ ПРИМЕРЫ
РАЗРАБОТКИ
ПАБЛИШИНГ
Москва
«1С-Паблишинг»
2005

ITLIB.WS Твоя IT библиотека
А.П. Габец, Д.И.Гончаров 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». Издание будет полезно начинающим разработчикам, администраторам, у которых на предприятии внедряется система, и продвинутым пользователям, которые хотят самостоятельно дорабатывать прикладные решения. Книга содержит большое количество практических примеров, сгруппированных по тематике использования. Кроме этого книга содержит подробный указатель на используемые в примерах свойства, методы и события встроенного языка. Данная книга дополняет, но не заменяет штатную документацию к программному продукту, входящую в комплект поставки, и позволяет более эффективно использовать возможности программы. Под редакцией М.Г. Радченко. 4601546 025616 Право тиражирования и распространения книги принадлежит фирме "1С-Паблишинг". Полное или частичное копирование материалов книги без письменного разрешения фирмы "1С-Паблишинг" запрещается. 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 ф Как задать различные стили ЮПредприятия для различных категорий пользователей?.....................................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 И
Оглавление Как сохранить настройки построителя отчета до следующего открытия формы отчета?........................................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 © Как запустить ЮПредприятие из командной строки?...........305 Как из командной строки заставить ЮПредприятие сделать выгрузку базы данных?.......................................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 ф Как из одной базы ЮПредприятие 8.0 перенести остатки товаров в другую базу, используя СОМ-соединение............351 Пример обращения к программе ЮПредприятие 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 ф Как из одной базы ЮПредприятие 8.0 интерактивно заполнить документ в другой базе, используя Automation Client/Server (OLE)?.......................................363 Как из таблицы Excel загрузить список номенклатуры в ЮПредприятие с возможностью редактирования?..............364 Обмен данными....................................................366 О Как организовать работу удаленных складов?...................366 Как при создании начального образа управлять тем, какие виды объектов перегружаются, а какие нет?.......................369 Как просмотреть объекты, для которых зарегистрированы изменения?.................................................371 Как организовать обмен данными между произвольными конфигурациями ЮПредприятие 8.0?...........................372 Как принудительно зарегистрировать изменения объектов?.........379 WEB -расширение..................................................380 ф Как в форме списка номенклатуры отменить все установленные отборы?......................................380 Как запретить перенос содержимого ячеек в форме списка расходных накладных?.......................................382 Как открыть список расходных накладных с отбором, установленным по определенному складу?.....................384 Как добавить кнопку для ввода документа на основании?..........388 Указатель 389 15
Введение Идея написать эту книгу возникла у нас не случайно. Платформа системы «1 С: Предприятие 8.0» специально ориентирована на то, что ее будут использовать не только как средство разработки, но и как инструмент быстрой доработки «на месте». В таких случаях специалисту важно в сжатые сроки решить конкретную задачу без долгого изучения всех возможностей системы. Как преподаватели учебного центра - мы, разумеется, только за то, чтобы специалист был изначально методологически и всесторонне «подкован». Но как практикующие разработчики, кроме всего прочего, зачастую и сами с большей радостью используем описанные примеры решения тех или иных задач, нежели пытаемся воссоздать их по памяти или по методическим материалам. Собственно говоря, именно с целью помочь в подобных ситуациях, и была написана эта книга. Основой ее создания послужил опыт преподавания «программистских курсов» по системе, работа на конкретных внедрениях и активное общение в форумах, посвященных данному кругу проблем. Фактически книга составлена в результате анализа того, какие задачи приходится решать чаще всего как начинающим, так и продвинутым разработчикам. При подборе примеров мы исходили из того, что спектр навыков и знаний специалистов, которые будут работать с данным изданием, может быть очень широк. Поэтому пусть Вас не смущают некоторые особо «бородатые» советы или, наоборот, - отсутствие подробного описания тех или иных технологий. А для тех, кто практически не знаком с системой «ЮПредприятие 8.0», материал самых простых примеров, объясняющих азы использования объектов и механизмов системы, помечен специальным значком ф. Кроме этого, поскольку работа с настоящим изданием не требует досконального чтения всего материала, по тексту намеренно вставлены повторы некоторых приемов или предостережений в тех случаях, когда это имеет смысл. Также следует заметить, что мы стремились сделать именно сборник простых примеров, поэтому некоторые материалы вошли в издание в «разрезанном» виде. То есть вместо сложных и громоздких «сквозных» примеров, мы старались представить отдельные части, «кирпичики», из которых впоследствии можно собрать желаемое. 16
Введение Стиль изложения соответствует цели издания, поэтому материал предоставляется в форме вопросов и ответов, как, например, в следующем разделе: Как работать с изданием? Решение данного вопроса - многовариантно. Можно читать классическим способом. От начала до конца, помечая или закладывая понравившиеся места. Впоследствии, при возникновении конкретных вопросов, зрительная память или закладки помогут найти нужное решение. Можно читать выборочно. Любимая поговорка крутых программистов: «Мануал открывать надо уже в последний момент». То есть, проблема возникла - нашли раздел и попытались найти решение, или идею решения по аналогии. Но поговорку, на самом деле, мы совсем не одобряем! Можно вообще не читать. Не читать комментарии. А рассматривать издание как сборник «шпаргалок» кода, решающего те или иные вопросы. Остальные варианты использования издания или не очень нравятся авторам, или достаточно опасны. Например, не надо рассматривать эту книжку как замену полноценного обучения или работы с методическими материалами. 17
Примитивные типы, системные функции Как явно указать нужную дату? Для указания нужной даты можно пользоваться: • литералом вида ТГГГММДДччммсс' встроенного языка; • встроенной функцией преобразования значений Дата(); • литералом типа Дата языка запросов. В таблице ниже приводится ряд возможностей явного указания даты при помощи встроенного языка: Выражение Значение результата (тип) '20050308' 08.03.2005 0:00:00 (Дата) Дата(2005, 1,1) 01.01.20050:00:00 (Дата) Дата(1, 1, 1) 01.01.00010:00:00 (Дата) Дата(2005, 1, 1, 10, 29, 50) 01.01.2005 10:29:50 (Дата) В случае же, если в тексте запроса необходимо жестко указать некую дату - используется литерал ДАТАВРЕМЯ(). Например, поле со значением '01.01.2005 0:00:00' можно получить так: ДАТАВРЕМЯ(2(Х)5.01.01) Как проверить дату на пустое значение? Значение типа Дата не бывает «пустым». Если в явном виде значение переменной типа Дата не задано, она будет иметь значение по умолчанию: начало первого дня первого месяца первого года (00 часов 00 минут 00 секунд). Поэтому проверку проще сделать так: Если ДатаПровсрясмая = Дата! 1. 1,1) Тогда Сооб|цить("Пустая дата!"); КоисцЕсли; 18
Примитивные типы, системные функции Как сравнить две даты (дни)? Точность данных типа Дата - до секунды. А сравнивать нужно именно дни. Тогда проще предварительно для сравниваемых дат воспользоваться функцией, которая возвращает, например, дату начала дня. А потом уже сравнивать полученные значения. Если Н»чалоДн»(Дата11 = НачалоДня(Дат«2) Тогда СообщитьС'Дни совпадают!")-, КоиецЕсли; Как прибавить к дате день, месяц? Так как тип Дата содержит дату и время с точностью до секунды, то для того чтобы к некоторой дате прибавить один день, нужно увеличить ее значение на количество секунд, содержащихся в одном дне: С.ледующийДень « ТекущааДатэ)> + 60 » 60 • 24: Для увеличения или уменьшения даты на некоторое количество месяцев, можно использовать: • функции работы со значением типа Дата во встроенном языке; • функции работы со значением типа Дата в запросах. В таблице шоке приводится ряд возможностей использования функций встроенного языка: Выражение Значение результата (тип) ДобавитьМесяц(Дата(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
Примитивные типы, системные функции А вот пример функции, добавляющей количество дней к исходной дате при помощи запроса: Функция 11олучитьДсиь(ИсхолнаяДата, Количество! 1рпбавлясмыхДней) Запрос = Новый Запрос!" |ВЫБРАТЬ | ДОБАНИТЬКДАТЕС&ИсходнаяДата. ДЕНЬ, ^Количество) как Дата*): За11рос.Установи1ьПараметр("Исходн11яДвга”. ИсходндяДата): Запрос.УстановитьПараметр! "Количество". Колнчество11рпбав.1*емыхДней) Возврат Запрос.Выполнить!).Вы1рузк1ьО|0|.Дата; КонецФункнии В тексте запроса используем функцию ДОБАВИТЬКДАТЕ(). В качестве параметров ей необходимо передать исходную дату, тип добавляемых периодов (в нашем случае жестко прописали «День») и количество добавляемых периодов. Первый и последний параметры передали запросу, считав их из параметров (заголовка) нашей функции. Далее запрос выполняется, и из него получаем значение выходного поля по первой (и единственной) строке. Результаты выполнения вышеприведенной функции будут такими: ПолучитьДень('20052802', 10) = 10.03.2005 0:00:00 11олучитьДень('20042802', 10) - 09.03.2004 0:00:00, поскольку 2004 год был високосным! Как можно проверить тип значения переменной на равенство нужному? ИмяНужноюТина *ДокументСсылкя. Реализация Товаров"; Если ТипЗич((Х»раСк11Ь1ваемыЙД0кум<Ж1) ® ТИл(ИмяНужногоТМпв) Тогда // С троки кода, выполняемые при истинности условия. Конец Если; 20
Примитивные типы, системные функции ТипЗнч() - функция языка, возвращающая по значению его тип. Тип () - функция языка, возвращающая значение типа Тип по строковому имени типа. Какочиститьреквизитформы, имеющий ссылочныйтип? К примеру, реквизит (имя «Товар») имеет тип СправочникСсылка. Номенклатура. Для очистки значения в связанном с ним элементе управления на форме, необходимо выполнить строку кода: Товар * Спра»очиики.Ноыснюш1ура.Пуспи|Ссылка< >; То есть необходимо установить значение по умолчанию. А им, в данном случае, будет пустая ссылка на элемент справочника «Номенклатура». Как очистить значение, имеющее тип «Хранилище значения»? Очистить значение, записанное в реквизит или ресурс (имя «РеквизитХранилище») можно следующим образом: РеквкштХранилищс = Неопрсдслсно; Как проверить тип значения, помещенного в реквизит имеющий тип «Хранилище значения»? По причинам не связанным с возможностями системы ЮПредприятие 8.0, в реквизит «Фотография» (тип ХранилищеЗначения) справочника «Сотрудники» помещалась либо Строка (преобразованная к типу ХранилищеЗначения), либо Картинка (преобразованная к типу ХранилищеЗначения). Как проверить, что было записано? 21
Примитивные типы, системные функции Проверку можно осуществить, используя следующие строки кода: Значение « Фотография ЛолучитЫ): Если Значение о Неоггределено Тогда Если ТипЗнч(Значенис) = Тнп("Строка"'i Тогда // Обработать строку ИначеЕелн ТипЗич(Змачение) = Тип ( Картинка*) Toi да if Обработать картинку. Сообщи гь( ” Карт и н ка"); КоиецЕсли: КоиецЕсли; Следует отметить, что в реквизит имеющий тип ХранилищеЗначения можно поместить только значение, имеющее тип ХранилищеЗначения. Работа со значением, помещенным в хранилище значения, может начаться только после его получения (метод Получить()). После получения значение «восстанавливает свой прежний тип». Если полученное значение равно Неопределено, то это означает, что никакое значение в реквизит не записывалось. Как сжать данные, помещаемые в хранилище значения? Допустим, в реквизит «СопроводительнаяИнформация» (тип значения - Хранилище значения) помещается значение переменной «ПомещаемоеЗначение». Нужно обеспечить максимальное сжатие данных закладываемого значения. Сопроводи гсльнаяИнформаиня « Новый ХраннлишсЗначеннж ПомещасмоеЗначснне. Новын С'жатнеДанных(М)); Вторым параметром конструктора хранилища значения передается объект СжатиеДанных. Он тоже получен соответствующим конструктором, с указанием максимального уровня сжатия. 22
Примитивные типы, системные функции Как предоставить пользователю возможность выборазначения составного типа? МассивТшюв = Новый Массив: МассивТипов.ДобивиШТипС "СправочннкСсылка ФнзЛнца")): И Добавить другие типы Для реализации этой задачи необходимо воспользоваться конструктором объекта ОписаниеТипов. А для него необходимо передавать в качестве параметра массив разрешенных для вводимого значения типов значения. Когда конструктором «ОписаниеВозможныхТипов» собрано применяем функцию для вызова диалога ввода данных ВвестиЗначение (). Первым параметром функции необходимо указать доступную в данном модуле переменную для принятия введенного значения. Вторым - заголовок открываемого окна. Третьим - объект ОписаниеТипов. После ввода значения пользователем можно считать значение с переменной, переданной первым параметром. 23
Примитивные типы, системные функции Как применить округление при работе с вычисляемыми числовыми полями взапросе? Например, составляется запрос для оценок средней цены продажи по данным регистра «Продажи». Для получения данных с точностью до двух знаков после запятой текст запроса может выглядеть следующим образом: ВЫБРАТЬ Продаж иОбороты. Номенкяа туре, ВЫРАЗИТЬ! 1фодажиОборозы.СтоимостьОборот/!I род аж и Обороты. Кол имеет мЮбороз КАК ЧИСЛО! 15. 2)) КАК СредняяЦенаПродажи IB Pei нсгрНакоптения.Продажи.ОборотьН&Ла гаМач. &Дп аКон) КАК ПродажиОбороты Источником для запроса является виртуальная таблица «РегистрНакопления.Продажи.Обороты», построенная по данным регистра в интервале между «ДатаНач» и «ДатаКон». В качестве выходных полей берем «Номенклатура» и результат деления значения полей источника «СтоимостьОборот» и «КоличествоОборот». Причем оператором ВЫРАЗИТЬ() тип последнего поля приводится к примитивному типу ЧИСЛО с определенным форматом (длинна 15, точность 2). Как вывести многострочное предупреждение? Переменные «Остаток» и «Зарезервировано» содержат значения, которые необходимо вывести в виде предупреждения. Кроме того, нужно еще вывести свободный остаток, вычисляемый по формуле: СвободныйОстаток = Остаток - Зарезервировано. Все это может быть выполнено следующим образом: Предупреждение! "На складе: * 4 Остаток 4 Символы ПС 4 "В резерве : " 4 Зарезервировано 4 Сим волы. ПС 4 "Свободный остаток: * 4 (Остаток Зарезервировано), 20. ’Состояние остатков"): 24
Примитивные типы, системные функции Процедура глобального контекста Предупреждение () выводит на экран модальное окно предупреждения. Текст предупреждения передается первым параметром, вторым - таймаут, содержащий указание количества секунд, через которое окно самостоятельно закроется (если раньше его не закроет пользователь), третьим - указывается заголовок окна. Многострочность предупреждения в нашем примере осуществляется за счет добавления значения ПС (перевод строки) системного набора значений СИМВОЛЫ в текст предупреждения. Обратите внимание на вычисление свободного остатка в скобках - для обеспечения корректности выполнения арифметических действий и преобразования данных к типу Строка. Кроме того, хотелось бы предупредить об опасности попыток применения процедуры Предупреждение () в ходе проведения документов. Проведение документов выполняется в транзакции, поэтому использование каких либо интерфейсных решений, останавливающих работу системы, является совершенно неприемлемым. В подобных случаях лучше информировать пользователей посредством Сообщить(). Какпри выполнении обработки сообщить пол ьзователютекущее время? ТекущсеВремя = Формат(Тску таяДата<), ”ДЛФ=В"); СообшитЫТеку nice Время): Метод ТекущаяДата() возвращает системную дату. Тип значения - Дата. В его значение входит и дата и время. Для получения представления только времени можно применяем функцию Формат(). Как вывести число прописью по-русски, но без дробной части? Для этого используется функция ЧислоПрописью(). У нее могут быть указаны в качестве параметров: • преобразуемое число; • форматная строка; • параметры предмета исчисления (вид этой форматной строки определяется значением кода локализации). 25
Примитивные типы, системные функции Все возможные варианты локализаций описаны в файле Locllnfo.txt, входящем в комплект поставки программы. Для решения нашей задачи можно использовать следующий текст: ФорматнаяСтрока "Jl^ruRU"; ПарахкчрыПредметаИсчислення "........О"; Сообп1ить(ЧнстоПрописыо|В|.п>олим<хЧисло. ФорматнаяСтрока. _________________________11арамстрыПрслмстаИсчисления)); В форматной строке указываем код локализации - Русский(Россия). В параметрах предмета исчисления показываем, что дробная часть не должна содержать ни одного разряда. Для ВыводимоеЧисло = 234,4 результат будет: «Двести тридцать четыре». Как вывести число прописью по-русски, с указанием сотых в дробной части? Параме1рыПредме1аИсчнсления "целая, целых. целых, к. сотая, сотой. сотых, ж. 2"; ФорматнаяСтрока = "JI=ru_RU; ДП=Истииа"; Сообщить' Число! 1рописькй ВыволимосЧисло. ФорматнаяСтрока, ПарамегрыПредметаИсчисления));__________________ В параметрах предмета исчисления указываем возможные спряжения и склонения слов «целая» и «сотая», а так же количество разрядов дробной части, которые будут выводиться прописью. В форматной строке указываются код языка локализации и необходимость вывода дробной части прописью. Для ВыводимоеЧисло - 123,45 результат будет: «Сто двадцать три целых сорок пять сотых». 26
Примитивные типы, системные функции Каквывести прописьючислокилограммовс указаниемдробной части в граммах? Г ЬрамсгрыПредмегаИсчислсния "килограмм. кижлрамма. килограммов. м. (грамм. грамма, граммов. м. 3*; ФорматнаяС грека = Д11»Истина*; Сообщи 1 ЫЧислоПрописью( ВыводимоеЧисло, Формат нааС трока. 11арамстры11рсдмста11 счисления)); В отличие от вышеприведенного примера здесь предметами исчисления являются килограммы и граммы, а количество разрядов дробной части - три. Для ВыводимоеЧисло = 12,345 результат будет: «Двенадцать килограммов триста сорок пять граммов» Какдолларовую сумму вывести прописью по- английски? Форма г наяСт рока = "Jl=cn_US”, 11арамстры1!рслмстаИсчислсння ="doltar. dollars, cent, cents, 2”; Сообщить! Ч нслоПроп немо! Су м ма, ФорматнаяСтрока. Пираме! рыПреаметаИсчисления)): Для ВыводимоеЧисло = 1 232,45 результат будет: «One thousand two hundreds thirty two dollars 45 cents» Какзагрузитьвнешнююкомпоненту? Загрузим компоненту, позволяющую работать со сканером штрих- кодов: Загрузи гь В иен i н кноКом поненту (" scanopos .di I * I 27
Примитивные типы, системные функции В случае ошибки загрузки компоненты или создания объекта возникает исключительная ситуация, которую рекомендуется отрабатывать с помощью конструкции Попытка. Как выполнить команду операционной системы? К примеру, требуется удалить все файлы из указанного каталога. Для реализации данной возможности достаточно выполнить следующую строку кода: I КомандаСистсмыС'Дс! *.* /д", "c:\lctnp~); Для просмотра доступных команд можно в командной строке системы выполнить команду «help». Вызвать командную строку, можно выполнив строку кода: КомаиааСис1емы< "and"): Кроме этого, для запуска внешнего приложения (или открытия файла с использованием ассоциированного с ним приложения) может быть использован метод глобального контекста ЗапуститьПриложение(). В этом случае запуск приложения будет осуществляться непосредственно, минуя командный интерпретатор. Например: Запуст итьПриложениеС "ШаблонДог опора, doc"): 28
Примитивные типы, системные функции Как реализовать код процедуры в зависимости от режима выполнения (на клиенте, на сервере, во внешнем соединении) ? Если алгоритм должен выполняться по-разному в зависимости от места выполнения процедуры, то можно воспользоваться инструкциями препроцессора: #Если ЬнсшнесСоединенис Тогда И Фра« мент кода, который должен выполняться в сессии внешнею соединения #КонецЕсли #Еслн Клиент Тогда // Фрш мент кода, который должен выполняться на сервере # Коне и Если #Если Сервер Гог да // Фра1 мент кода, который должен выполняться на клиентском месте. ДКонецЕсли 29
Примитивные типы, системные функции Как при групповой обработке объектов реализовать стратегию «либо все, либо ничего»? Требуется загрузить либо все данные по справочнику «Единицы измерения», либо, в случае возникновения ошибки, нужно чтобы ни один элемент не был записан. Для реализации стратегии «либо все, либо ничего» можно использовать следующий фрагмент кода: НачатьТранзакцикХ); И В переменной "ВыборкаДанных” содержаicn данные длн записи в справочник. Пока Выборка/Данных.Следующий! .1 Цикл Эл смен i Объект = Справочники. ЕдииицыИзыерсния.СоздатьЭлеменгС); ЭлсментОбъект.Код = Выборка. Код; Элемен гОбъект.Наименование * Выборка. Наименование: Элемент Объект ЗапнсатъО; Конец! Ьшла; Зафиксировать Тран закцшоО; Если необходимо но мере накопления каких-либо признаков «искусственно» отменить действия, совершаемые в транзакции, можно использовать метод системы: МЭ
Примитивные типы, системные функции Как посчитать сумму по формуле сложного процента? Пусть первоначальная сумма долга равна Р, тогда через один год Р(1+») сумма долга с приссхиннениыми процентами составит ' через и р(1+ <•)". лет ' 7 Таким образом, получаем формулу наращения для сложных процентов: 5 = Р(1 + /)", где S - наращенная сумма, i - годовая с тавка сложных процентов, п - срок ссуды, Для вычисления можно использовать функции работы со значениями типа «число»: Функция С ложныйПроцен н Кредит. Ставка, Срок ж I) Возврат KpcanT*Pow(l + Ставка/НЮ, Срок); КонеиФункции Возведение в степень реализуется функцией Pow(). Первым параметром передается основание степени, вторым - показатель степени. Замечание: кроме работы со степенями математический аппарат системы позволяет работать с корнями, логарифмами и тригонометрическими функциями. 31
Универсальные коллекции Массив ф В каких ситуациях обычно используются массивы? Массив является универсальной коллекцией, то есть объектом, предназначенным для работы с временными наборами данных в течение сеанса работы пользователя. Необходимость в его использовании возникает, когда требуется работать с временным набором данных. Чаще всего это промежуточные операции обработки информации: подготовка отборов, реализация поиска, подготовка группирования, передача параметров и проч. Массивы могут создаваться оператором Новый или получаться в результате применения методов некоторых объектов. ф Каксоздатьмассив? Создание массивов чаще всего происходит посредством оператора Новый: Со ыанныйМассив = Новый Массив (); где «СозданныйМассив» - имя переменной, которая будет содержать созданный объект типа Массив. После создания к массиву можно добавлять элементы (произвольное количество). Если же мы хотим создать массив с заранее определенной размерностью, это можно сделать так: СспданныйМасснв = Новый Массив (10); В результате в переменной «СозданныйМассив» будет создан массив с десятью значениями. Для такого массива можно потом сразу обращаться к любому из десяти значений (начиная с нулевого по девятое) для записи или для чтения. А при необходимости к такому массиву можно так же еще добавлять новые элементы. Первый же добавленный элемент получит индекс «10». 32
Массив Как создать многомерный массив? Массив является линейной динамической коллекцией с произвольным типом значений. Поэтому значениями массива могут выступать другие массивы. То есть создание массива массивов и решает задачу создания многомерного массива. Эго можно делать при использовании конструктора массива: ДвумернынМассив = Новый .Массив (2. 8): или в процессе добавления очередных элементов к массиву: ДвумерныйМассив = Новый Массив, МассивВторогоПорядка = Новый Массив (8): ДвумерныйМасснв.Добавм гь( МассивВюро! о 1 1оря дка); Дву черны «Массив Добавиты МассивВторогоПорядка); И в том и в другом случае мы решим задачу создания двумерного массива размерностью 2x8. Чтение и запись значений такого массива можно производить посредством директивного указания индексов: или при помощи метода Получить(): Значение = ДпумерныйМассив ПолучитМЗ).Получить^) Хотелось бы еще раз отметить, что создание массива определенной размерности конструктором ограничивает только количество возможных к заполнению значений массива, но не препятствует добавлению новых значений (в качестве которых могут выступать массивы произвольной размерности). 33
Универсальные коллекции Как добавить элементы в массив? Допустим, массив, к которому нужно добавить значение из переменной «НовоеЗначение», называется «НашМассив». Если нужно просто добавить очередной элемент (с индексом на единицу больше самого старшего) - действуем следующим образом: НашМассив.Добави гь! Новое Значение). Если нужно, чтобы новые значения добавлялись с определенным индексом, то можно использовать метод Вставить(): Массив = Новый Массив; Массив.Вставнты^, "ООО "''Лабан'"*): • Как определить размер массива? Чтобы определить количество элементов массива «НашМассив» можно сделать так: Размер = НашМасеив.КоличествоО: Однако имейте в виду, поскольку индексация элементов массива начинается с нуля - значение переменной «Размер» будет на единицу больше значения самого старшего индекса. Как обратиться к элементу массива? При обращении как для записи, так и для чтения элементов массива лучше пользоваться оператором [ ], указывая индекс элемента. Помните, что индексация начинается с нуля. Пусть в переменную «ПервоеЗначение» нужно считать значение самого первого элемента массива, а в элемент массива с индексом «9» записать значение из переменной «ДесятоеЗначение»: ПервоеЗначение = НашМассив{()|; НашМасснв(9) = ДосятоеЗначение; 34
Массив Аналогичных результатов можно добиться при помощи методов Получить() и Установить(): ПервосЗначспис = НашМассив.ПолучитЫО); 11аи1Массхв.Усга1ЮВИТъ(9. ДесягоеЗиачсние Г. Замечание: в любом случае, чтобы иметь возможность обратиться к элементу массива, он должен уже существовать. Иначе получим ошибку с сообщением о том, что индекс находится за границами массива. Как перебрать элементы массива? Если перебор элементов массива нужен для чтения данных из массива - проще всего организовывать посредством цикла перебора коллекции. Например, чтобы вывести сообщения о каждом числе, найденном в массиве «МассивЭлементов», достаточно сделать следующее: Дли Каждого ЭлементМассим Из МассивЭлеменюв Цикл Если ТипЗнч(ЭлементМассива) Тмп( "Число") Тогда Сообщи 1ъ(ЭлемснтМасси8а); КонецЕсли; КовеиЦнкла; Обратите внимание, «ЭлементМассива» - это произвольное имя переменной, принимающей в себя очередное значение элемента коллекции при выполнении цикла. Если же при переборе элементов массива нужно их редактировать, то для этого нужно работать еще и с индексами элементов. Лучше тогда использовать так называемый «цикл-счетчик». Например, чтобы обнулить все числовые элементы массива, достаточно сделать следующее: Дтя Сч = 0 по МассивЭлемснтов.ВГранмиаО Цикл Если 7 илЗнч( МасснвЭ.1гчснтон(Сч |)« ТипС Число*) Тогда Массив')лсментов|Сч| (Е. КонецЕсли. КонецЦикла; 35
Универсальные коллекции «Сч» - это переменная, принимающее очередное значение счетчика на каждом выполнении цикла. Именно из нее и будем считывать значение индекса очередного элемента массива. Значение самого большого индекса массива определяется посредством метода ВГраницаЦ- Как удалить элемент массива? Удаление отдельных элементов массива происходит с обязательным указанием индекса удаляемого элемента. Так, например, будет удален первый элемент массива: МасенвЭлс ментов. Удал ить(О); Естественно, если указанный индекс будет выходить за границы массива - получим сообщение об ошибке. Кроме того, необходимо учитывать, что удаление элемента «из середины» массива приведет к уменьшению на единицу индексов элементов, стоявших «после» удаленного. Массив как бы «сомкнет ряды». Поэтому, например, один из наиболее простых вариантов удаления всех числовых элементов массива может выглядеть так: Индекс = Масснв'Элсмснтоп.Ш ранинаС); Пока Индекс >® 0 Цикл Если ТилЗнч(МжхивЭлементов| Иидекср » Тип( "Число") Toi да МасснвЭлементов.Удалнт ь! Индекс); КонсцЕс.ш; Индекс = Индекс • 1; КонецЦикла; Сначала определяем самый старший индекс элементов массива. Цикл проверок и удалений чисел будет выполняться, пока очередное значение индекса не окажется меньше нуля. В цикле определяем тип значения элемента с текущим индексом. Если это число - удаляем данный элемент. Кроме того, в любом случае уменьшаем на единицу значение переменной «Индекс». В результате, поскольку перебор элементов массива проводится с конца, эффект «смыкания рядов» будет производиться только для уже проверенных элементов. 36
Массив ® Как удалить все элементы массива? Если требуется полное удаление элементов из массива, операция выполняется гораздо проще: Какудалить повторяющиеся элементы массива? Поскольку объект «массив» является одной из самых простых универсальных коллекций, методами поиска по значению он не обладает. Поэтому для того, чтобы удалить повторяющиеся элементы, следует перебрать все элементы массива и проверить их значения. Для выполнения поставленной задачи организуется два цикла: в первом цикле осуществляется перебор элементов массива и для каждого выбранного элемента осуществляется вложенный цикл сравнения 37
Универсальные коллекции текущего элемента с последующими элементами массива. В случае совпадения значений последующий элемент массива удаляется. Когда для очередного элемента с индексом «ТекущийИндекс» завершился вложенный цикл проверки с последующими - увеличиваем значение «ТекущийИндекс» на единицу с тем, чтобы следующий по индексу элемент попал в положение проверяемого. Как скопировать массив? Фу и кипя С копиром 1 ьМассив( ИсходныйМассив) Массив Копия = Новый Массив; Для Кдждош Элечсн! Из ИсхолныйМассив Цикл МасснвКопия. Добавить! Элемент); КоиеиЦикла; Возврат МэсснвКопня; Коне цфу и кци и Для получения копии массива в другом объекте (массиве) необходимо создать новый массив (массив-копию) конструктором. Далее в цикле перебора элементов исходного массива добавлять эти элементы в массив-копию.
Массив Как проверить, что два массива идентичны? Эго можно выполнить при помощи следующей функции. В качестве параметров ей передаются сами проверяемые массивы «ПервыйМассив» и «ВторойМассив». Функция UpoBcpHTbHaeHW4Hovn»MavcHBOiid IcpRuAMaccHB. ВторойМасснв) Наибольший Индекс = 11срвый Массив. ВГриницаО; Если НаибольшийИнлекс о Второй Массив. ВГраиица () Тогда BojspoT Ложь; КовецЕслн; Для Счетчик = 0 По Наибольший Индекс Цикл Если 11ервыйМасснв[Счстчик] о ВтороиМассив[Счстчик| Тогда В* пират Ложь; КонецЕсли; КонсцЦнклэ; Возврат Истина, КонецФункциа Сначала проверяем совпадение наибольших индексов в массивах, если совпадения нет - массивы уже не идентичны. Значит функция возвращает значение ЛОЖЬ Далее необходимо произвести проверку идентичности элементов массивов с одинаковыми индексами. Поскольку индексация элементов массива начинается с нулевого значения — выполняем цикл-счетчик от нуля до значения наибольшего индекса массива. Внутри цикла при выполнении неравенства очередных элементов функция возвращает значение Ложь. Если цикл пройден до конца - значения всех элементов с одинаковыми индексами совпали. Значит функция может вернуть значение Истина. 39
Универсальные коллекции В массив выгружены данные, содержащие наименования контрагентов. Каких отсортировать? Список значений позволяет выполнять сортировки по представлению или по значению и, кроме того, обладает возможностями загрузки данных из массива и выгрузки в массив. Поэтому один из вариантов решения данной задачи может быть таким: СписокЗначений = Новый СписокЗначений; СписокЗначений ЗагрузигьЗначення(МассивНаименовапнй>; СпнсокЗначений.СортироватьПоЗначениюО; МассивНаимснований = СписокЗначений. Выгрузи гьЗначснияр; Создаем список значений. Загружаем значения из массива «МассивНаименований». Сортируем список значений по значениям. Поскольку параметр не указали, направление сортировки будет - по возрастанию. Если нужно по убыванию - в качестве параметра надо передать соответствующее значение системного перечисления НаправлениеСорТИрОВКИ: С пнсокЗначений.С оргирояаткП оЗначеникм I ЬправлениеС 0|пировжи.У быв); После выполнения сортировки выгружаем значения из списка значений в массив. 40
Массив Есть массив, в который выгружены значения типа СправочникСсылка.Номенклатура. Как удалить все пустые значения массива? 11роиедура Удалш ьПустыс Элементы!МассивНомснкдэтуры) Счетчик = 0; КаЯйчесгвоЭлементов » МассивНомснклзтуры.Количество! I Пока Счетчик < КоличеспюЭлементов Цикл Если МасснвНоменклатуры | С метчик]. Пу стая!) Тогда Массив Номенклатуры. У далить! Счетчик); Кол и чес твоЭ леменгов = КоличествоЭлементов - 1; Иначе Счетчик = Счетчик ♦ I; КонсцЕслн; Коней Цикла: Консц1 Процедуры Получаем в виде параметра процедуры массив номенклатурных позиций. Устанавливаем нулевое значение счетчика - переменной «Счетчик». Организуем цикл, который будет выполняться, пока значение переменной «Счетчик» меньше количества элементов массива. Поскольку индексы элементов массива начинаются с нулевого значения, то наш цикл прервется в момент, когда значения индекса («Счетчик») и количества элементов совпадут. Внутри цикла проверяется условие, является ли ссылка, содержащаяся в очередном элементе массива - пустой. Если это так - текущий элемент массива удаляется. В результате у следующих за ним элементов автоматически на единицу уменьшаться индексы. Кроме того, необходимо уменьшить на единицу значение переменной, отслеживающей количество элементов в массиве. Если же ссылка не пустая - увеличивается на единицу значение «Счетчик» с тем, чтобы на следующем ходе цикла работать уже со следующим элементом. 41
Универсальные коллекции Замечание: проверка на пустое значение для разных типов данных проводится по-разному. Только для ссылочных типов данных можно ее осуществлять посредством метода Пустая(). Как получить массив номенклатурных позиций, использованных в табличных частях «Номенклатура» и «Тара» накладной? Имеем ссылку на документ «СсылкаНаДокумент». Номенклатурные позиции могут быть указаны в колонке «Номенклат}фа» табличной части «Номенклатура» и в колонке «Номенклатура» табличной части «Тара». Тогда массив номенклатуры из обеих табличных частей можно получить следующим образом: Массив! Ьмснклатуры = СсылкаНаДокумснт.Номснклатура.ВыгрузитьКолонху<ЧГомснклатура'.); МассивНомсиклазуры Гара Ссы,1каНаДокуме1П Возвра। наяТара.Выгру5итьКолонку("Номе<1кл;пура’>; Для Каждого Элсмеи i Массива! ара Из МасеивНомснклатурыТара Цикл Массив! 1оменк.1атуры.Добави1ь1 ЭлсмснлМассиваТара): Конец Цикла: Формируем массив «МассивНоменклатуры» посредством выгрузки колонки «Номенклатура» табличной части «Товары» документа. Аналогично формируем массив «МасеивНомснклатурыТара» по табличной части «Тара». Далее в цикле перебора элементов второго массива добавляем их в первый. 42
Массив Есть две табл и цы значений. Как получить массив совпадающих имен колонок? Данная операция может применяться для вспомогательного контроля перед загрузкой таблицы значений в таблицу записей регистра. Итак, есть «ТаблицаИсточник» PI «ТаблицаПриемник», требуется получить массив имен совпадающих по имени колонок. Масс ивСовпадаюшнх Колонок — Новый МассивО; Для Каждою Колонка Из ТаблицаПриемник,Колонки Цикл Имя Колонки Приемника » Колонка.Имя: Если ТаблицаИсточник.Колонки.Нанти( ИмяКолонкнПрисмника) о Неонределено Тогда МассивСовпадающнхКолонок.Добав)ггы ИмяКолонки! 1рисмника): КонеиВслн; КонсцЦикла; Создаем сначала конструктором «МассивСовпадающихКолонок». Далее выполняем цикл перебора колонок одной из таблиц. Внутри цикла в переменную «ИмяКолонки» получаем имя очередной колонки. Далее обращаемся к коллекции колонок другой таблицы значений и при помощи метода Найти() пытаемся найти такую же по имени колонку. Если поиск успехом не увенчается - метод выдаст значение Неопределено. А если удалось - добавляем очередной элемент к массиву «МассивСовпадающихКолонок». 43
Универсальные коллекции Как в запросе сделать отбор по нескольким вариантам заполнения реквизита типа «ПеречислениеСсылка»? Одним из приемов программирования, использующим массивы, является формирование коллекции возможных значений для заполнения параметров запроса. Это выполняется, например, когда в запросе используются отборы с операндами В или В ИЕРАРХИИ. Вот пример решения задачи: Запрос = Новый Запрос; Запрос Текс г = "ВЫБРАТЬ | ОтпускаОр! амичацииРаботникиОрганиищии.ФнчЛнцо. | ОтпускаОрганнътцмиРабапгикиОргапммции.ДйгаНачала | ОтпускаОр!анмзашшРаботннкиОр!анимации.ДтаОкончанмя |ИЗ | Документ.ОтпускаОргани'ШЦИИ.РаГюгникнСЭргами шции КАК ОгпускаОрганизашшРабо! никиОр! аничалим |ГДЕ | ОтпусК10ргаинмцимРвбст<нкиОрганизацнм.Прнчнн10тсутст»ия В (&МасснвПрнчин)‘ Массив! 1ричнм = Новый Массив: МассивПричннДобави г Перечисления J1 рн ч и н ыОтсутст ви я Н аРаботеВО рган и здци и .ОптускБстС \>хранснияЗарплэты): МассивПричин.ДобавнтЦ Перечисления J (ричиныОгсутсг вияНаРаботеВОрганизации ОтпускУ чебный); 'Запрос.Установить! !арамстр( "Массив! 1ричин". Массив! 1ричин); В параметр «МассивПричин» устанавливается значение - массив возможных причин, набранный из элементов перечисления « ПричиныОтсутствия». Замечание: для решения подобных задач (с операндами В и В ИЕРАРХИИ) можно передавать не только данные типа Массив, можно еще СписокЗначениЙ или вообще сформировать коллекцию возможных значений вложенным запросом в самом тексте запроса. Вариант выбора заполнения параметра зависит от конкретики самой задачи. 44
Массив Как из регистра сведений «РасчетчикиЗарплатыОрганизации»получитьв виде массива всех расчетчиков зарплаты определенного подразделения организации? Периодический независимый регистр сведений «РасчетчикиЗарплатыОрганизации» имеет следующую структуру: Э ’ К змедоыя Данную задачу можно решить посредством применения методов объектной модели или запросом. Пример решения посредством объектной модели: Функция ПолучитьМассивРасчстчикоМПодразделение) НаборЗаписсн ж Регистры Сведен ни . Расчетч и киЗарцлатыОрган изац и и .СозлатьПэ6орЗапнссй(); Набор3ai।неги Отбор.ПодрлзделеннсОрганизации.УстановитЫ 11одразделение); Набор 3ai । всей. Проч игаты); МасснвРасчстчиков НдборЗацисей.ВыгрузитьКолонку^ ’Пользователь"); Возврат Масси вРасчетчиков; КонепФу нкции Создаем набор записей регистра. Устанавливаем отбор по значению измерения « Подразделение Организации». Читаем данные набора записей. Выгружаем колонку набора записей «Пользователь» в массив. Пример решения задачи посредством запроса: Функция ПолучигьМжхивРасчетчиковС11одраздедемме) Запрос * Новый Запрос: Запрос Текст * ВЫБРАТЬ | РасчстчюсиЗарплатыОрганизацмм.Польэомтелъ КАК Расчетчик ИЗ 45
Универсальные коллекции | Pet'исгрСведсннн. РасчетчикиЗарнлаз ыОрс пни зацнн | КАК РасчегчикиЗарилапдОртниз^ции |ГДЕ | РасчстчикнЗарг1лзтыОр| анн зации.Подразде.1снисОр| анн шцин » & II одра j делен ие Запрос. Установить! 1арамстр("1!одраздслснис*. Подразделение); Результат ж Запрос. ВыдодюпьО; Выборка = Результат.ВыбратьО*. МассивРасне1 чикав = Новый Массив; Пока Выборка.СлсдукмиийО Цикл МассивРасче! чиков. Добавить! Выборка. Расчетчик); КонецЦнкла; Возврат МасснвРасчстчиков; КонсцФункции Источником в запросе будет таблица регистра «РегистрСведений.РасчетчикиЗарплатыОрганизации». Накладываем отбор по условию равенства поля «ПодразделениеОрганизации» определенному значению. В качестве выходных полей выбираем только «Пользователь». После выполнения запроса делаем выборку по результату запроса и в цикле перебора ее - формируем нужный массив. В данных примерах оба способа возвращают одинаковые результаты примерно за одинаковое время потому, что никаких дополнительных действий в процессе получения информации не требуется. Второй способ на первый взгляд кажется более длинным в отношении написания кода. Но если нам понадобится произвести отбор более чем по одному условию, или получить массив неповторяющихся значений — то вторым способом получить такие данные будет значительно легче и быстрее с точки зрения скорости исполнения. 46
Структура ® В каких ситуациях обычно используются объекты типа «Структура»? Структура является универсальной коллекцией, то есть объектом, предназначенным для работы с не хранящимися в базе данных совокупностями значений. Необходимость в ее использовании возникает, когда требуется работать с временным набором данных с чуть более сложной природой, нежели в массиве. Если элемент массива можно было характеризовать только числовым индексом и значением произвольного типа, то элемент структуры характеризуется строковым ключом и значением произвольного типа. Чаще всего структуры применяют в ситуациях, когда необходимо узнать или использовать имена реквизитов, свойств, полей, подчиненных объектов для тех или иных объектов; узнать или использовать значения реквизитов, свойств, полей, подчиненных объектов по их именам для тех или иных объектов. Кроме того, структуры удобно использовать для передачи параметров при работе с различными объектами. Структуры могут создаваться конструктором НОВЫЙ или получаться в результате применения методов некоторых объектов. Ввод элементов в структуру можно осуществлять как посредством параметров конструктора, так и посредством метода Вставить(). Как создать структуру? Создание структуры чаще всего происходит посредством оператора НОВЫЙ: | СозланимПруктура = Новый Структура: | где «СозданнаяСтруктура» - имя переменной, которая будет содержать созданный объект типа Структура. После вышеприведенного создания в структуру можно вставлять элементы (произвольное количество). 47
Универсальные коллекции Если же мы хотим создать структуру с заранее определенными элементами - это можно сделать, например, так: Оппонент = Новый Структуре ("Фамилия. Имя. Отчество, Возраст". "Иванов". ’Иван*. "Иванович". 7); Первым параметром передается строка, в которой через запятую перечисляются ключи элементов структуры. Остальные параметры содержат значения для элементов структуры в том же порядке, в котором были перечислены ключи. Для такой структуры впоследствии можно обращаться к любому из элементов для записи или для чтения значения. А так же, при необходимости, к этой структуре можно еще добавлять новые элементы. Как добавить элементы в структуру? Для добавления элементов в структуру используется метод Вставить(). Первым параметром указывается ключ, вторым - значение нового элемента. Замечание: если в составе структуры уже был элемент с подобным ключом - то старый элемент будет замещен новым. Например: Оппонент = Новый Структура ("Фами лия. Имя. Отчество. Возраст". 'Иванов". ’Иван". ’Иванович". 7); Оппонент. Вставить! "Обращение". "Господин"); Ошюнент.ВставитМ "Возраст*. 25);________________ Как обратиться к элементу структуры? Для чтения значений элементов структуры можно использовать несколько вариантов написания кода. Для структуры «Оппонент», в составе которой есть элемент с ключом «Возраст» можно использовать явное указание значения ключа: ТекущийНозраст = Оппонсг. Возраст; 18
Структрура или передачу ключа в переменной: Также можно использовать метод СвоЙСТВО(), который получает значение элемента структуры по указанному ключу: Текущий Возраст = Нсопрслелсно; Оппонсз.Свойство! "Возраст", Текущий Во фас i); Для записи значений элементов структуры также можно использовать несколько вариантов написания кода. Если мы хотим изменить значение возраста в структуре из вышеописанного примера - можно это сделать так: Огпюнет.Возрасг = 32; или так: Оппонет{ Возраст”] = 32; или так: Оппонент Вставить!"Возраст". 32); Как перебрать элементы структуры? Поскольку структура является коллекцией - перебрать элементы структуры можно посредством цикла перебора коллекции. Например, чтобы сообщить обо всех ключах и значениях элементов структуры «СтруктураПараметров», можно сделать следующее: Для Каждого Элемент из СтруктураПараметров Цикл СообщитМЭлемеит.Ключ + " + Элемент.Значение); КонецЦикла; 49
Универсальные коллекции Какудалить элемент структуры? Чтобы удалить элемент структуры - необходимо знать его ключ. Например, чтобы удалить из структуры «СтруктураПараметров» элемент с ключом «Номенклатура», достаточно сделать следующее: С тру к ту pa 11 ара ме । ро в, У дал и т Н о м с нкл а т у pa" к Если же нужно удалить все элементы структуры - применяется метод ОЧИСТИТЬ»: СтруктураПараметров ОчнститЫ): Каквструктуреустановитьзначениедля элементасопределенным ключом? Все ключи элементов структуры - уникальны. Поэтому добавление новых элементов и замена (установка) значений для «старых» элементов выполняется одним и тем же методом Вставитьл): Структура = Новый Структура; // Добавить новый элемент. С грукту pa. Вс ।авнты * I (нет”, Web!(иста Ik: л ын ); // Установить значение для элемент с ключом ’Цвет" Структура .Вета виты’ Цвет". WebI (ве ш Синий); Результатом примера выше будет структура, состоящая только из одного элемента: ключ у него - «Цвет», значение - «Синий» из системного набора значений \Л/еЬЦвета.
Структрура Как получить в структуру многомерные данные? Как собрать информацию по установленным в формежурналаотборам? Для формы журнала документов установлены некие отборы. Чтобы сформировать многомерную структуру всех используемых отборов объекта «ЖурналДокументовСписок», можно сделать следующее: СтруктураОгборов = Новый Структура: СзруктураПарамезровОтбора = Новый Структура. Для Каждого 'ЭлсмснтОтбора из ЖурналДокумснтовСписок.Отйор Цикл Если 'Элсме1ггОгбора.Использование Тогда СтруктураПарамегровОтбора.ОчиститЫ»; СгруктураПараметровОтбора.ВетавитьСИия", Э:к:метО1бора.Имя): СтруктураПараметровОтбора Ветавигь! 'ВилСравнения“, ЭлемеитОгбора.ВидСра виси ня); Структура! 1арамстровОтбора.Вставить!Значение", ЭлсмснтОтбора.Значсннс): СтруктураПараметровОтбора Вставить! "ЗначениеПо”, Элсмс1пОтбора.ЗначсннеПо); СтруктураПараметровОтбора. Вставит ы 'ЗначенисС’. ЭлеыенгОтбора.ЗначениеС); СтруктураПараметровОтбора.ВставитъСПрелставление”. Э.земснтОтбора.11редставленис); СтруктураПараметровОтбора. Вставить!" 11 утьКДап н мм", ЭлемснтОтбора.11утьКДанным); СтруктураПараметроттОтбора.Встави ть( "ТипЗначения". ЭлемешОтбора.ТииЗиачения); СтруктураОтборов Вставить!'ЭлемситОтбора.Имя, СтруктураПараметровОтбора!: КоиецЕсли; КинеиЦикла: Создаем конструкторами две структуры. Структура «СтруктураОтборов» впоследствии будет содержать элементы, где в качестве ключа будет указано название отбора, а в качестве значения - « СтруктураПараметровОтбора». В цикле перебора коллекции отборов объекта «ЖурналДокументовСписок» сначала проверяем, используется ли данный отбор. Если используется — заполняем структуру параметров данного отбора. Полученную структуру используем в качестве значения добавляемого элемента объекта «СтруктураОтборов». Впоследствии, если нам потребуется информация из полученной структуры, можно будет, например, перебрать элементы 51
Универсальные коллекции «СтруктураОтбора», а для каждого из этих элементов - перебрать элементы ее значения - структуры «ПараметрыОтбора» Как определить, есть ли в структуре элемент с ключом «Контрагент», и если есть, но содержитпустоезначение справочника ил и Неопределено - удалить этот элемент? Гели Стру1пураХ’войстэо("Кпнтрагснт", Значение')лсмснта) Тогда Если ЗначснисЭлемснта = Неопределено или ЗначениеЭлгмента.Пустм() Тогда (грукту ра. Удал ип»( ’ Контра i ент “); КооецЕсли; КонецЕсли; В качестве параметров метода СвоЙСТВОО можно указать ключ и переменную для получения значения по ключу. Кроме того, сам метод возвращает Истина, если элемент с данным ключом существует, и Ложь - если нет. Получив значение и проверив его на требуемые условия, удаляем элемент с указанным ключом из структуры. Замечание: кроме метода СвоЙСТВОО получить значения элемента структуры позволяют следующие варианты обращения по ключу: Структура- Контрагент или Структура! "Контрагент"
Структрура Как из табличной части «Товары» документа получить все строки, где значение реквизита «Цена» равно нулю, а значение реквизита «СтавкаНДС» равно значению «НДС18» перечисления «СтавкиНДС»? Для поиска строк, соответствующих условию определенного отбора, можно сделать следующее: СтруктураДляПоиска = Новый Структура ("Цена, СтавкаНДС", О, Перечисления. СтавкиНДС.НДС 18); МассивСтрок = Товары. НайтиСтроки(СтруктураДляПоиска); Сначала создаем структуру для поиска. Далее посредством метода НаЙТиСтрОКИО из табличной части документа «Товары» получаем массив строк, соответствующих отбору по структуре поиска. Обратите внимание, в данном примере был показан вариант добавления и заполнения элементов структуры непосредственно в конструкторе. Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату? Периодический регистр сведений «УчетнаяПолитикаБухгалтерскийУчет» имеет следующую структуру: 0 J. - И L- L. Opr»w«iM« Э f Ресфсы I Слособ0и**^413 -1 Дк*»т<осг^г я Реквизиты Тип значения измерения «Организация» СправочникСсылка. Организации. Ссылка на организацию находится в переменной «ЮрЛицо». Дата, на которую необходимо получить данные - переменная «ДатаПолучения». 53
Универсальные коллекции Получение необходимых данных можно организовать посредством метода ПолучитьПоследнее() менеджера регистра: Метод предназначен для получения данных наиболее поздней записи регистра, соответствующей указанным периоду и значениям измерений регистра. Значения измерений регистра должны предаваться в виде структуры. Каждый элемент структуры в качестве ключа должен использовать имя измерения. В качестве значения элемента структуры передаем значение отбора по этому измерению. Дату получения и полученную структуру отбора используем в качестве параметров для метода ПолучитьПоследнее(). Результатом применения метода к периодическому регистру сведений «УчетнаяПолитикаБухгалтерскийУчет» будет структура. Элементы полученной структуры состоят из названия ресурса в качестве ключа и значения ресурса в качестве значения. 54
Структрура Каксформироватьструктуруназваний реквизитов табличной части произвольного документа? Пример функции, решающую данную задачу - ниже. В качестве параметров необходимо передать ссылку на документ и имя табличной части документа. Функция СфсрмировагьСтруктуру ГабличнойЧастиДокумснтэ!Документ, ИмяТаблнчнонЧасти СтруктураТа6ли*1нойЧасти71окумснта = Новый Структура; Для Каждого Реквизит из Документ .МпаданныеО .Табличн ысЧасти[ И м яТ аблнч ной Части| Реквизиты Цикл ( трук гура Табл и мной Части Доку мента .Вставить! Реквизит Имя, Реквизит Имя); КонеиЦякла; Возврат СтруктураТабл нч ной Част иДокумекта; КонецФункции Конструктором создаем структуру «СтруктураТабличнойЧастиДокумента». В цикле перебора реквизитов нужной табличной части полученного документа вставляем в структуру элементы с названиями полученных реквизитов. Замечание: значения элементам структуры можно было и не указывать - все зависит от того, как в дальнейшем собираемся использовать полученную структуру. Как получить запросом данные табличной частидокумента, имея структуру названий реквизитов табличной части? Пример функции, решающей данную задачу - ниже. В качестве параметров необходимо передать ссылку на документ или объект документа, имя табличной части и структуру названий реквизитов этой табличной части. 55
Универсальные коллекции Функция основана на сборе информации запросом, чей текст собирается «кусочками» из строковых переменных: Функция СформированкЗлпросПоТабличнойЧастн!Доку мент. Имя ТаблнчнойЧасти, Струк lypallujieA) Экспорт Поля Реквизитов = Дзя Каждою Реквишз Из СтрукгураПолей Цикл ПоляРсквизитов = Поля Реквизитов +", |Док." 4 Реквизит. Значение 4 ?(Значен11еНсЗаполисно(Рсквнзн1 Ключ), *”*. * КАК * + СокрЛГ 1( Реквизит. Ключ) ); КоиецЦикла: Запрос = Новый Запрос; Запрос .Текст « "ВЫБРАТЬ | Док. НомерСз роки " -4 Поля Реквизитов 4 " |ИЗ Документ." 4 Докумсит.МетаданнъаеО.Имя 4 "."4- СокрЛП(ИмяТз6личной*1асти) -4 “ КАК Док | ГДЕ Док.Ссылка = ЛДокументСсылка": И Установить иараме1р14 запроса Запрос. Установить! 1арамстр( "Докумс1ТгСсылка", Доку мсит.Сс мл ка); Возврат Запрос Выполни тМ); Конет (Функции Создаем переменную «ПоляРсквизитов». В цикле перебора элементов структуры имен полей табличной части добавляем к переменной «ПоляРсквизитов» «по кусочкам» будущие имена выходных полей запроса. Добавляются они через запятую. Далее формируем запрос, к тексту которого добавляем строку имен выходных полей запроса. Источником указываем таблицу нужной табличной части нужного документа. Кроме того, накладываем отбор по полю «Ссылка». Функция возвращает результат выполнения запроса. 56
Соответствие ф В каких ситуациях обычно используются объекты типа «Соответствие»? Соответствие является универсальной коллекцией, то есть объектом, предназначенным для работы с не хранящимися в базе данных совокупностями значений. Необходимость в его использовании возникает, когда требуется работать с временным набором данных с чуть более сложной природой, нежели в структуре. Если элемент структуры можно было характеризовать только строковым ключом и значением произвольного типа, то элемент соответствия характеризуется ключом произвольного типа и значением произвольного типа. Чаще всего соответствия применяют в ситуациях, когда необходимо хранить в оперативной памяти для последующей обработки данные с ключами произвольного типа. Кроме того, соответствия удобно использовать для передачи параметров при работе с различными объектами. Соответствия могут создаваться конструктором НОВЫЙ. ф Как создать соответствие? Создание соответствия происходит посредством оператора Новый: где «СозданноеСоответсивие» - имя переменной, которая будет содержать созданный объект типа Соответствие. После вышеприведенного создания в соответствие можно вставлять элементны «пщриизвольное жпиииство). ф Как добавить элементы в соответствие? Допустим к соответствию «ВозрастСотрудников» нужно добавить новый элемент. В качестве ключа должна выступать ссылка на сотрудника (ее можно считать из переменной «Сотрудник»), в качестве значения - возраст сотрудника (его можно считать из переменной « ВозрастОмцрвдриюа»)). 57
Универсальные коллекции Тогда добавление нового элемента можно произвести так: ВотрастСотрудннксиз.Вставить1 Сотрудник. ВтнраеЧструдпикаг. или так: ВозрастСотрудников [Сотрудник) ~ Возрас [Сотрудника; Как обратиться кэлементу соответствия? Запись значений элементов соответствия можно выполнять теми же способами, которые рассмотрены в вопросе «Как добавить элемент в соответствие?» на странице 57. А чтение значений элементов соответствия можно выполнять следующим образом: ВозрастСотрудникэ = Возраст*отру.тников.ПолучитьО отрудннк); или так: ВозрастСотрудника ж ВозрасзСотрудников (Сотрудник): В приведенных примерах из соответствия «ВозрастСотрудников» по ссылке на сотрудника в качестве ключа будет получено значение элемента соответствия. Какперебратьэлементы соответствия? Поскольку соответствие является коллекцией - перебрать элементы соответствия можно посредством цикла перебора коллекции. Например, чтобы сообщить обо всех ключах и значениях элементов соответствия «Замены», можно сделать следующее: Для Каждого Элемент из Замены Цикл Сообщить*Элемент.Ключ +" • ’ + Элемент.Значение). Конец! (икла; 58
Соответствие Какудалитьэлемент соответствия? Чтобы удалить элемент соответствия - необходимо знать его ключ. Например, чтобы удалить из соответствия «Замены» элемент со ссылкой на объект, содержащийся в переменной «УдаляемыйТовар», в качестве ключа, достаточно сделать следующее: Замеиы.УдалигъСУ.иляемыйТояар); Если же нужно удалить все элементы соответствия — применяется метод ОЧИСГИТЬ(): Замены ОчмсгитьО; Как получить данные из соответствия? В соответствии «КурсыВалютДокумента» в качестве ключа используется значение валюты, а значениями являются структуры, содержащие «Курс» и «Кратность». Как получить курс и кратность валюты «УправленческаяВалюта» ? Значение = Ку рсыВал ю гДокумента. Полу чипД У правленческая Вал нгга); Если Значение = I !соирсдслсно Го1да Сообшиты "Данная валюта в соответствии отсутствует”); Иначе Курс - Значение!"Курс**]; Кратность w Значение!" Кратность"]; КонецЕсли; Сначала по ключу (ссылке на управленческую валюту) получаем значение соответствия. Поскольку значением является структура курса валют - далее получаем значения структуры по их названиям. 59
Универсальные коллекции Как получить многоуровневое соответствие видов расчетов, обладающих базовыми видами расчетов? Для плана видов расчетов «ОсновныеНачисления» необходимо получить соответствие «ВидыРасчетов», где в качестве ключей будут использоваться виды расчетов, обладающие базовыми. А в качестве значений - соответствия базовых видов расчетов. В качестве ключей последних - базовые виды расчета, в качестве значений - структуры, содержащие их свойства «Наименование» и «Предопределенный». Вцды расчета Базовые виды расчета Свойства базового вида расчета Ежегодный отпуск Оклад по дням "Наименование" - "Оклад по дням" "Предопределенный" - Истина Оклад по часам "Наименование" - "Оклад по часам" "Предопределенный" - Ложь Оплата по часовому т арифу "Наименование" - "Оплата по часовому тарифу" "Предопределенный" - Ложь Оплата по дневному тарифу "Наименование" - "Оплата по дневному тарифу" "Предопределенный" - Истина Оплата по произволе твенным нарядам "Наименование" - "Оплата по производственным нарядам" "Предопределенный" - Истина Надбавка за в редностъ Оклад по дням "Наименование" - "Оклад по дням" "Предопределенный" - Истина Оклад по часам "Наименование" - "Оклад по часам" "Предопределенный" - Ложь Оплата по произволе твенным нарядам "Наименование" - "Оплата по производственным нарядам" "Предопределенный" - Истина Первичный сбор информации удобнее осуществить при помощи запроса с использованием итогов. Последующий перебор группировок результат запроса даст возможность сформировать необходимые объекты: Запрос = Новый Запрос; Запрос.Текса - ’ВЫБРАТЬ | Оснокныс'Начис.пенияСЗрганизацннБаюныеНндыРасчега Ссылка КАК Ссылка. | Оснопныс'Начис.1енияОр<аниза11ИиБамлаыеВмдыРасч<ла-ВидРасчега. (ОсновнысНачислснняОрганизацпиЬаювысВилыРасчста. Ви 11’зс чета. Наименование. 60
Соответствие | ОсновныеНачнс.тенняОрганнзаимнБа'ювыеВи;1ыРасчета.Предопределенный |ИЗ | 11ланВидовРасчета.Осн[>внысНачислсния<)ртанз<за||ни.БазовысВидыРасчста КАК Основные!ичисленииОртнизацинБа ювыеВндыРзсчета (ИТОГИ по Ссылка”; Результат = Запрос.Выполнит ь(); ВыборкаВндовРасчсга = Результат . Выдра тЫ Обход РезультатаЗалрося- I lol рун пиров кд м г. ВидыРасчста - Новый Соответствие; БазоныеВидаРасчсли « Новый Соответствие; СвойстваВидаРасчета » Новый Струпура( IIанменованнс. Предопределенный"): // Цикл по видам расчета, обладающим базовыми. Пока ВыборкаВидовРасчета.Следук>ший() Цикл БазовыеВилзРасчета.Очистить!); Выборка Базовых = ВыборкаВндовРасчсга . Выбрит ы Обход Резу л ьтат u3ai (река. ПоГру! шировка.м к // Цикл по базовым видам расчета. Пока Выборка1хзэивыхХ ледуюшийО Цикл // Заполнении* значения структуры "СвойстваВилаРасчепГ СвоЙстваВилаРасчета. Наименование = Выборка Базовых Наименование. СвоЙстваВилаРасчета. I 1рслопрс деленный = ВыборкаБазпвых .11редопределенный; // Запелпенить соответствие " Ба зовыеВидА Расчета". БазовысВндаРасчета. Вставить! ВыборкаБазовых.ВндРвс чета, С вой ст ваВ иди Рас че га К Конец! Циста; // Занолнигь соответствии ' ВидыРаичега". ВидыРасчста.ВставитмВыборкаВидовРасчста.Ссылка. Базовые Вилл Расчета к КоиецЦикла; Для запроса источником является таблица «ПланВидовРасчета.ОсновныеНачисленияОрганизации.БазовыеВидыРас чета». Выходными полями делаем все, необходимые для решения нашей задачи. Кроме того, вводим дополнительные итоги по полю «Ссылка» (ссылка на виды расчета). После выполнения запроса делаем выборку по верхнему уровню группировок результата запроса. 61
Универсальные коллекции Создаем конструктором три объекта - соответствие «ВидыРасчетов», в которое будем впоследствии добавлять виды расчетов, обладающие базовыми; соответствие «БазовыеВидыРасчетов», в которое будем добавлять базовые виды расчетов для каждого отдельного вида (владельца); структуру «СвойстваВидовРасчетов» для добавления информации о свойствах базовых видах расчетов. В цикле перебора верхнего уровня группировок (по видам расчета) сначала очищаем соответствие «БазовыеВидыРасчета». Далее открываем цикл перебора записей второго уровня группировки результата запроса (то есть уже по базовым видам расчетов определенного владельца). В этом цикле заполняем значения структуры «СвойстваВидовРасчетов» по ключам - названиям свойств. Далее добавляем сформированные структуры в качестве значений соответствия «БазовыеВидыРасчета» с конкретным базовым видом расчета в качестве ключа. По окончании вложенного цикла добавляем очередной элемент в соответствие «ВидыРасчетов» с заполнением значения ключа из поля «Ссылка», и заполненным соответствием «БазовыеВидыРасчета» в качестве значения.
Список значений, таблица значений, дерево значений ® В каких ситуациях обычно используются списки значений, таблицы значений, дерево значений? Все эти объекты являются универсальными коллекциями, то есть объектами, предназначенным для работы с не хранящимися в базе данных совокупностями значений. Необходимость в использовании списка значений возникает, когда требуется работать с временным набором данных для решения интерфейсных задач. Дело в том, что в отличие от более простых универсальных коллекций (массива, структуры, соответствия) список значений состоит из объектов - ЭлементСпискаЗначениЙ. А элемент списка значений характеризуется следующим набором свойств: • Значение; • Представление. Содержит строковое пользовательское представление. То есть именно его пользователь увидит на экране. По умолчанию - генерируется автоматически; • Пометка; • Картинка; Применение списков значений для обычных задач универсальных коллекций, но не связанных с интерфейсными действиями, как правило - излишне. Обычно с этой функциональностью справляются объекты «попроще»: Массив, Структура, Соответствие. Таблицы значений позволяют работать с данными сущностей, представимых в виде таблиц, то есть «раскладываемых» на колонки и строки. А ведь с точки зрения многих систем автоматизации вообще «весь мир = совокупность таблиц». При этом можно добавлять/удалять данные (и колонки, и строки, и значения); искать данные (и колонки, и строки, и значения); сортировать данные (по любым колонкам); выгружать-загружать данные; подсчитывать итоги по колонкам; сворачивать данные и т.д. Дерево значений позволяет в добавление к вышеприведенным операциям еще вводить уровни иерархии для этих данных и оперировать в пределах уровней или игнорируя их. 63
Универсальные коллекции Подобный набор возможностей помогает решать самый широкий спектр задач промежуточной обработки данных произвольного типа. Как создать список значений? Список значений можно создать посредством оператора IЮВЫЙ СотинныйСписок = Ионий СписокЗначений: где «СозданныйСписок» - имя переменной, которая будет содержать созданный объект типа СписокЗначении. Как добавить элементы в список значений? Например, требуется добавить в список значений «СписокСотрудников» новый элемент со значением ссылки на сотрудника (содержится в переменной «ТекущийСотрудник»), ФИО сотрудника в качестве представления (содержится в реквизите «ФИО» объекта «ТекущийСотрудник») и фотографии сотрудника в качестве картинки (содержится в переменной «Фото»): СписокСогрудников.ДобавитъСГекущийСогрудиик. ТекущийСотрудник ФИО, Фото); Если нужно, чтобы новые значения добавлялись с определенным индексом (переменная «Инд»), то можно использовать метод Вставить(): СписокСотрудников.Вставите Инд. ТекущийСотрудни к. ТскушийСотрудник.ФИО. Фото): Если при этом в списке значений уже был элемент с таким индексом, то старый элемент получит индекс на единицу больше предыдущего; аналогично сдвинуться индексы у всех последующих. Если при использовании метода Вставить() указать индекс, выходящий за границы списка, - получим сообщение об ошибке. 64
Список значений, таблица значений, дерево значений Как найти элемент списка значений? Например, в списке значений «СписокСотрудников» надо найти элемент, в котором в качестве значения указан сотрудник, на которого ссылается переменная «ИскомыйСотрудник». Затем нужно сообщить индекс найденного элемента. Это можно выполнить следующим образом: Элемсн тСпнскж = СписокСотрудников. Найти! 1оЗначснию(ИскомыйСотрулннк>; Если ЭлемеггтСписка о Неопрежелено Тогда Сообицггь(СписокС<ттрудииков.Индскс( Элементеписка)); КоиецЕсли. Замечание: если искомое значение в списке может встретиться несколько раз - при таком подходе найдем только первый элемент, где оно содержится. Поэтому смотрите по ситуации. Поскольку список значения - объект, предназначенный, прежде всего для визуализации возможностей выбора пользователем, обычно при его заполнении уже сразу предотвращают возможность повторов. Если же такая возможность осмыслена, то получить все элементы списка значений, содержащие определенное значение можно, например, в цикле перебора элементов списка значений. Как обратиться к элементу списка значений? Если требуется получить доступ к элементу списка значений с определенным индексом (пусть содержится в переменной «Инд»), можно поступить так: ЭлсмопСписха * СпнсокС<прудников[Ицд]'. или так: ЭпементСпискз = СпмсокСотрулников .По.тучитМИил В любом случае - то, что получаем, еще не есть значение, заложенное в этот элемент списка (это еще не сотрудник), а именно объект типа ЭлементСпискаЗначений. 65
Универсальные коллекции Впоследствии с него можно считать значения свойств: Сотрудник = ЭлсмснтСпмска.Значенис; Преле iBBJieifife ЭлементСпискя.Представление; Пометка = Элементе пнекм. Пометка; Картинка ® ЭлемешСписка-Картинка; Как перебрать элементы списка значений? Поскольку имеем дело с индексированной коллекцией, то можно использовать цикл перебора элементов коллекции или «цикл-счетчик». Например, чтобы сообщить значения всех элементов списка значений «СписокСотрудников», можно использовать следующий код: Для Каждого ЭлементСпмска Из СпнсокСозрулнико* Цикл Соо6шить(ЭлементСлнска.Значение): К'онецЦикла; То же через «цикл-счетчик»: Старший Индекс = СписогсСотрудникокКодичество) )• 1; Для Сч = 0 по СтяршийИндекс Цикл С оо6|цип»(СписокСогру, ||1Нкок|См] Значение): КонецЦикла; Какудалить элемент списка значений? Удаление отдельных элементов списка значений происходит с обязательным указанием индекса удаляемого элемента. Так, например, будет удален первый элемент массива: Естественно, если указанный индекс будет выходить за границу индексов списка - получим сообщение об ошибке. Кроме того, необходимо учитывать, что удаление элемента «из середины» списка приведет к уменьшению на единицу индексов элементов, стоявших «после» удаленного. Список значений - «сомкнет ряды». 66
Список Значений, таблица значений, дерево значений Решим задачу удаления всех элементов списка значений «СписокОбъектов», содержащих числовые значения: Индекс = СпнсокОбьекюиКоличеств)) - I; 11ока Индекс >= О Цикл Если ТипЗнч|СпнеокОбъскгоо|И1шекс|.Значение) = Тип! Число") Тогда С|1ИсокО6к‘К7ов.Уда.1ип.(Индеке); КоиецЕсли: Индекс = Индекс -1: КонепЦикла; Сначала определяем самый старший индекс элементов списка значений. Цикл проверок и удалений элементов будет выполняться, пока очередное значение индекса не окажется меньше нуля. В цикле определяем тип значения элемента с текущим индексом. Если это число - удаляем данный элемент. Кроме того, в любом случае уменьшаем на единицу значение переменной «Индекс». В результате, поскольку перебор элементов списка значений производится с конца, то эффект «смыкания рядов» будет актуален только для уже проверенных элементов. ф Как создать таблицу значений и заполнить ее поля? Для создания таблицы значений используется оператор Новый: ТаблицаЗпачений = Новый ТаблииаЗначеций: После этого молено создать колонки таблицы (при необходимости можно задать допустимые типы значений для колонки, заголовок и ширину колонки в символах). И Создать нужные колонки Т аблииаЗначсн ий. Колон ки. Добаии тьСФам ил и я ’’ I, Тэ().1ииаЗнзчсннй.Ко.юнки.Добави1М “Возраст ’ к Затем можно добавить новую строку и установить значения в колонках таблицы: 67
Универсальные коллекции // Добавить новую строку и задать значения в колонках iаблицы НоваяС трока = ТаблицаЗнзченнй. Добавите). НоваяС 1 рока.Фамилия "Иванов**; НонаяСтрокн. Возраст « 23; или так: И Добавить новую строку и задать значения в колонках та НоваяСтрока = ТаблниаЗ|мчсмнй.Добавигм); НонаяС грока("Фамилия" ] ж Иванов": НомяСгроккГ Возраст" | = 23; блины. Как найти значение в таблице значений? Если требуется найти первую строку таблицы значений «ТаблицаЗначений», где присутствует «ИскомоеЗначение», можно сделать так: I Найден наяСгрока = ТаблицаЗначений.Найти( ИскомоеЗначение); Если требуется найти первую строку, где «ИскомоеЗначение» может быть найдено, например, в колонках «Поставщик» и «Покупатель», то: НайдениаяСтрока • ТаблицаЗначеиий.Найt ж ИскомоеЗначение. 'Поставщик. Покупатель”); Если же нужно найти все строки, где в колонке «Сотрудник» присутствует искомое значение, то это можно выполнить при помощи метода НаЙТиСтроки(): И Сформировать структуру отбора. СтрукгураПоиска = СтруктураССотрудник". Искомое Значение); И Найти строки. МассивНайлснныхСтрок = Тзб.тинэЗначсний.НзйтнСтрокнГСтруктураПоискаК Сначала создаем структуру поиска, каждый элемент которой будет содержать название колонки таблицы значений в качестве ключа и искомое значение в этой колонке - в качестве значения. Далее структуру поиска передаем в качестве параметра методу НаЙТиСтроки(). Результат - массив строк таблицы значений, соответствующих структуре поиска.
Список значений, таблица значений, дерево значений Замечание: если в этом примере в структуру поиска добавить поиск- нужного значения, например, еще и в колонке «Ответственный» - то в результате применения метода НаЙТиСтроки() получим все строки, где и «Сотрудник» и «Ответственный» равны искомому значению. Как перебрать строки таблицы значений? Поскольку имеем дело с индексированной коллекцией, то можно использовать цикл перебора элементов коллекции или «цикл-счетчик». Например, чтобы сообщить значения колонки «Сотрудник» всех строк таблицы значений «ТаблицаСотрудников», можно использовать следующий код: Для Каждого ТскушаяС трока Из ТаблицаСотрулников Цикл Сообщи гы Т скушаиС трока.Сотру линк >. КоиецЦикла: То же через «цикл-счетчик»: СтаршиПИцдскс = ТаблицлСотрудинков.КоличествоО -1; Для = 0 no СтаршийИклекс Цикл Сооб1цитЫСпис<жСотрудников^Сч1.Сотрудник); КоиецЦикла; ® Какудалить строки (колонки) таблицы значений? Удаление отдельных строк таблицы значений происходит с обязательным указанием удаляемой строки или индекса удаляемой строки. Если нужно удалить строку «УдаляемаяСтрока», входящую в таблицу значений «ТаблицаЗначений»: А так, например, будет удалена первая строка таблицы значений: ГаблицаЗиачений.У лаинп ыО); 69
Универсальные коллекции Естественно, если указанный индекс будет выходить за границу индексов строк таблицы значений - получим сообщение об ошибке. Аналогично и для колонок. Только работать уже надо с коллекцией колонок таблицы значений. Доступ к ней - через свойство КОЛОНКИ таблицы значений. ТайлниаЗначсннй Ко донки. Удалить! Удаляемая Колонка) или ТаолниаЗначений. Колонки. Удал итъ!О); Кроме того необходимо учитывать, что удаление строки (или колонки) «из середины» таблицы значений приведет к уменьшению на единицу индексов строк, стоявших «после» удаленной (эффект «смыкания рядов», вернее -«смыкание строк»). Например, решим задачу удаления всех строк таблицы значений «ТаблицаЗначений», содержащих числовые значения хотя бы в одной колонке: СтаршийИндексКолонок ^ТаблниаЗначсннй.Колонки.КоличсствоО - I; Индекс = ТаблмцаЗначений Количество!) I Пока Индекс >= 0 Цикл Дл> Сч = О По СтаршийИндексКолонок Цикл ЕслиТнп'Знч(Табли1|аЗначсний|Икдекс||Сч1) — Тип)’Число") Тогда 1 аблииаЗначсний.Удалить! Индекс), Прервать; КонецЬсли: КонецЦикла; Индекс Индекс - 1; Конец! (мкл а: Сначала определяем самые старшие индексы строк и колонок таблицы значений. Цикл проверок и удалений строк будет выполняться, пока очередное значение индекса строки не окажется меньше нуля. Внутри цикла но строкам делаем цикл-счетчик перебора индексов колонок. Во вложенном цикле определяем тин значения элемента находящегося в строке с текущим индексом и в очередной колонке. Если 70
Список значений, таблица значений, дерево значений это число - удаляем строку таблицы значений и прерываем вложенный цикл. Кроме того, в любом случае на каждом шаге внешнего цикла уменьшаем на единицу значение переменной «Индекс». В результате, поскольку перебор строк таблицы значений производится с конца, то эффект «смыкания рядов» будет актуален только для уже проверенных элементов. Какзаполнитьтаблицузначений,если имена колонок содержатся в переменных? Если имя колонки, для которой требуется установить значение, содержится в переменной, можно использовать оператор [ ]: НоваяСтрока = Таблнца1начсннн.Добавит1»(); Новая! I рок а| Имя Колонки] = Значение. В вышеприведенном коде: «ТаблицаЗначений» - имя таблицы значений; «ИмяКолонки» - строковая переменная, содержащая имя колонки, по которой нужно заполнить значение; «Значение» - переменная, содержащая само заполняемое значение. Как заполнить всю колонку табл и цы значений нужнымзначением? Колонку «ФлагФискального Учета» в таблице значений «ТаблицаЗначений» необходимо заполнить значением Ложь. ТэблнниЗмачений Зана титьЗначсния!Ложь. "ФлагФнскальногоУчсга*); Применяем для таблицы значений метод ЗаполнитьЗначения(). Первым параметром передаем заполняемое значение. Вторым параметром - имя заполняемой колонки. Замечание: если нужно заполнить несколько колонок значением - их имена указывают через запятую во втором параметре. Если не указать второй параметр - значением заполнятся все поля таблицы. 71
Универсальные коллекции Как таблицу значений «ТаблицаПолучатель» заполнить данными таблицы значений «ИсходнаяТаблица»? Если «ТаблицаПолучатель» на момент выполнения операции еще не существует, или ее предыдущие колонки сохранять не нужно, можно создать ее, как полную копию исходной: Таблица! (олучатсль — Таблица! 1схолная.( копировал ы); Вариант второй: таблица «ТаблицаПолучатель» существует, и жалко терять ее колонки и ограничения на типы данных колонок. Но нужно заполнить данные по колонкам, имена которых совпадают с именами исходной таблицы. Тогда можно так: Для КаждогоСтрокаИсходнойТаблицы Ил ИсходнаяТаблица Цикл НоваяСгрока = ТаблииаПолучатсльДобавитьО; ЗаполнитьЗначенияСвойств(НоваяСтрока. СтрокаНсхолнойТаблицм); КонецЦикла: Для каждой строки исходной таблицы добавляется новая строка в таблицу получатель и выполняется заполнение значений в тех колонках новой таблицы, имена которых совпадают с именами колонок в исходной таблице. Замечание: если у таблиц не будет колонок с одинаковыми именами - таблица-получатель будет в результате содержать столько же строк с пустыми значениями, сколько строк было в таблице-источнике. Если у каких-то одноименных колонок тип значения данных из таблицы-источника не попадет в массив разрешенных типов колонки таблицы-получателя - в таких полях получим пустые значения. Рассмотрим третий случай. В случае одноименных колонок - колонку таблицы-получателя нужно привести в полное соответствие колонке таблицы-источника. ОлиоимсинысКолоики = Новый Массив!): Для каждого Колонка Из ИсходнаяТаблица.Колонки Цикл СовпалаюиизяКолоика = ТаблицаПолучатель. Колонки.! 1ай г и! Колонка. Имя); Если ( овпадаюшаяКолонка О Нсопрслслсно Тогда 72
Список значений, таблица значений, дерево значений // Получить СВОЙС1ВЛ колонки. Индекс = ТаблицаПолу чатель.Колонки.Ин,дскс(Сов11адакзщаяКалонка) Имя = Колонка.Имя: ГипЗнзчсния - КолонкаТипЗначения Заголовок s Колонка. Заголовок; Ширина = Колонка. Шири на: // Заменить колонки в гоблимс-получастеле. Т долина! 1олучагель. Колонки. УдалитМ I !ндскс); ТаблнцаПолучатель.Колонкн.Вставигы Индекс. Имя. ТипЗначсния Заголовок. Ширина): //Добавить очередное имя совпадающих колонок в массив. ОдноименныеКолонки Добавить( Коло* гка. Имя>; КонсцЕслн; КонецЦикла; // Цикл перебора строк исходной таблицы. Для каждого СтрокаИсходнойТаблнпы Из ИсходиаяТаблнца Цикл //Добавить новую строку в таблицу-получатель НоваяТ трока = Таблица! 1олучатсль.Добавить(); // Заполнить значения в совпадающих ячейках Для каждого ИмяКолонки Из ОдноимсннысКолонки Цикл НоваяС грока| Имя Колонки) = СтрокаНсходнойТаблицы) ИмяКолонки). КонецЦикла. КонецЦикла: Нам придется заменить колонку в таблице получателе на новую, чьи свойства полностью будут соответствовать колонке таблицы-источника. Поэтому в случае обнаружения в таблице-получателе одноименной колонки собираем в переменных все свойства для новой колонки. Далее удаляем старую и создаем новую колонку. Далее выполняем цикл перебора строк исходной таблицы. В цикле добавляем к таблице-получателю новую строку и открываем цикл перебора имен колонок в массиве совпадающих колонок. Внутри этого вложенного цикла производим заполнение ячеек таблицы получателя данными ячейки таблицы-источника. 73
Универсальные коллекции Какдобавить колонки ктаблице значений «ТаблицаЗначений» с ограничениями по типу? При добавлении колонки можно просто указать ее имя, а второй параметр метода Добавить() - не трогать. В этом случае тип данных колонки - произвольный. // Добанн и, колонку бел ограничений по типу. ТаблицаЗначений. Колонки .ДобавитЫ "Объект*); Можно заполнить значение второго параметра. Туда необходимо передавать описание разрешенного для колонки типа. Само описание можно получить при помощи конструктора, передав последнему в качестве параметра строковое название типа (если много типов - через запятую) или массив допустимых типов. //Ограничения по гипам данных колонки: // Только мемепгы справочника *'Контрагенты". ТаблицаЗначений .Колонки ДобавитМ "Контрагент". Новый ОписаниеТипов("С провочннкСсылм.Конiран енты i Если среди типов разрешенных к заполнению данных колонки есть строка - можно ограничить ее разрядность (длину), указать использование неременной или фиксированной длинны. Все это обеспечивается созданием объекта при помощи конструктора КвалификаторыСтроки. Далее этот объект будет использован в качестве одного из параметров конструктора ОписаниеТипов. Д оп уст >1маяДаина.Персменная >; ДсшустимысТнпы = Новый Описание! иповССТрока",. КвалификаторыСтроки); ТаблицаЗкачений Колонки.Добавигь("Примеча»1ИеСцх>ковоеКорогкос", Допустимые! нпы 1 Аналогичные действия можно осуществлять в отношении квалификаторов числа и даты. 74
СписокЗначений, таблица значений, дерево значений Обратите внимание, описание типов можно строить конструктором как «с нуля», так и использовать как основу уже существующее описание типов. И Расширение уже использованного ранее описания типов. КщынфикаюрыЧисла = Новый КвалнфнкаторыЧнсла(Ю. 2, Доп усти м ы й 3 на к. Н со грнцатсл ьн ы й I; К кал и фи ка горыДа гы = Новый Ква.1ифика1ирыДа1ы(ЧасзиДагы.Дата>; РасширеннысДонустнмысТипы = Новый Описа11нсТипо<йДопустммысТи11ы. "Чисто, Дата",, Квалификаторы Числа,. Ква. । и фм к а । оры Да гы); Табл ииаЗначснкй. Колонки .Добавить(" 11 римечан ие". Расп । и рен иы е Дои у ст и мыеТш пи г. Какизменитьтип значения колонки таблицы значений, полученной выгрузкой из запроса? Запросом собираются данные по документам «Посту плениеТоваров Услуг» PI выгружаются в таблицу значений «ТаблицаСсылок» (колонка «Ссылка»). Впоследствии к этой таблице значений будут добавляться еще строки. Как обеспечить возможность добавления в полученную таблицу значений в колонку «Ссылка» документов других видов («ОприходованиеТоваров», « ВозвратОтПокупателя») ? При выгрузке данных из запроса в таблицу значений тип значения колонок определяется типом значений колонок результата запроса. Поэтому одним из самых простых вариантов решения задачи может быть воздействие на запрос, а не на таблицу значений. // Создать пустые ссылки ПусгоеОпричодойание 3 Документы.ОприходоааниеТоварое.ПустаяСсылка!Г I I усгой Возврат Докумснш.Во’гвратТоваровСИ Покупателя.! 1устаяСсылка(); // Выполнить запрос. Запрос Новый Запрос; Зап рос.Текст = ’ВЫБРАТЬ | Ссылка Гиз | Докумен । ПоступленнеТомровУслуг (ОБЪЕДИНИТЬ ВСЕ 75
Универсальные коллекции [ВЫБРАТЬ ПЕРВЫЕ О *ПестойДоку ментОпрнходованнс [ОБЪЕДИНИТЬ ВСЕ | ВЫ БРА ГЬ ПЕРВЫЕ 0 гШустойДоку мент Возврат Запрос.Установить! (арамстр! Hl I устой Доку ментОириход<>1Ч1Ние. Пустое Оприходование); Запрос Установит ьПараметр! "ПустоЙДокументВозвраг". 1lycroRBoiBpai >: И Выгрузить в таблицу значений. ТаблиизС'сьсюк « Запрос.Выполнить( >.Вьи рузи i ь4); Создаем пустые ссылки на документы «ОприходованиеТоваров» и « ВозвратОтПокупателя». Далее в запросе делаем объединение с записями, содержащими эти пустые ссылки. Причем в объединяемых запросах по пустым ссылкам применяем ПЕРВЫЕ 0 для того, чтобы впоследствии не удалять строки с пустыми ссылками из таблицы выгруженного результата запроса После выполнения и выгрузки запроса в таблицу значений «ТаблицаСсылок» тип значения колонки «Ссылка» будет составным: «NULL, ДокументСсылка ЛоступлениеТоваровУслуг, ДокументСсыл ка. Оприходование!" оваров, ДокументСсылка. ВозвратОтПокупателя». То есть - то, что и требовалось. Как самостоятельно заполнить дерево значений? Для иллюстрации данной возможности создадим обработку, в которой определен реквизит «Дерево» (тип ДеревоЗначениЙ). В диалоге определено табличное поле, связанное через свойство данные с реквизитом «Дерево» (имя элемента управления «Дерево»). Следующая процедура произведет запись данных в дерево значений. Процелура Зшюл пен иеДерева)Кнопка) Дерево. Колонки. Очистить)); Дерепо.Колонкн.Добавила "ИмяКолонкм'); И Создать первую строку. Правильнее сказать создать цемент И коллекции. Он помешается и переменную «СтрокаВерхнегоУровня» С трокаВерхнегоУровня Дерево.Строки.Добав|гть(): 76
Список значений, таблица значений, дерево значений В колонку «И м я Колон ки» записать значение ««Стари! 1 рокаВсрхнегоУ ровня. Имя Колонки • "Старшая * // Сомагь строку подчиненную «Старшей». ПодчиненнаяСтрока хСтрокаВерхнеюУровня.Строкн Добавнть(); ПодчнненнаяСтрока.ИмяКолонки • "Первая подчиненная"; Подчиненная ВторО1 оУровня = ПодчингннаяСтрока.Строки.ДобйвнттН); Подчиненная В торогоУ ровня. ИмяКолонки = "Первая нижняя '; 11одчинсннляВторогоУ ровня = 11одчинсннаяСтрока.( троки.ДобавитъО; Подчиненная ВторогоУровня.ИмяКолонки = "Вторая нижняя"; ПодчинениаяС трока = СтрокаВсрхнегоУровня.С грокн^ДобавиiU); ПодчнненнаяСтрока.ИмяКолонки = "Вторая подчиненная"; // Использование метода позволит увидеть результат работы И с деревом значений в табличном поле. Эл ем е н т ыФорм ы. Дере во. Созда тъ Ко лон к и (); Коней!Троцсдуры Следующая процедура показывает один из вариантов установки текущего значения в элементе управления, связанного с деревом (табличном поле). Процедура ОгкрытнеВетки< Кнопка) // Сделать текущим именно элемент коллекции «Строки» Результат Поиска я Дерево.Сгроки.НнйтнС'Первая нижняя". ’’ИмяКолонки", Истина); Если Результат! I опека о Нсоп редел ено Тогда ЭлементыФорм ы. Дерево ТскущаиСтрока = РезультатПонска, КонецЬхлн; КонсиП роцедуры 77
Прикладные объекты Справочники © Как создать элемент (группу) справочника? Создание нового элемента в неиерархическом справочнике можно выполнить при помощи следующего кода: НовыйЭлсмснт » Справочники .Доку ментыУ достолсряю|цие.’1 ичность Создать Элемаш ,i; НовынЭлемент.Наименование « "военный билет"; // Установить другие реквизиты. НовыйЭлсмснт ЗаписатъО; Если справочник иерархический, то выполнение этого кода приведет к созданию нового элемента в корне справочника. Для того чтобы создать новый элемент в определенной группе иерархического справочника, необходимо также указать родителя создаваемого элемента: НовыйЭлсмснт = Справочники.Банки.СоздятъЭлс.ментО; // Получить ссылку на группу, в которой будет находиться новый элемент Родитель = Справочники. Банки. Найти! 1оКоду("(ХМХХХМХ11"); НовыйЭлсмснт.Наименование « "АКБ*; НовыйЭлсмснт.Код = *00000001 Iм; НовыйЭлемен!. Родитель Родитель; // Установить другие реквизиты. 11овыйЭлсмент.Записать()*. Если требуется создать новую группу в иерархическом справочнике, то для этого следует использовать метод менеджера справочника СоздатьГруппуО. Если группа должна находиться внутри 78
Справочники определенной группы справочника, также следует указать и родителя создаваемой группы: НоваяГруппа - Справочники ! 1оменклатура.СоэдатьГ'р)Т1пуО: И Получить ссылку на группу, в которой должна находиться создаваемая ipynna. Родитель « Справочники.Номенклагура. Ний г иПоНаименоваммкй "Обувь". Истина): НоваяГруппа.Наименование = "Модельная обувь", НоваяГруппа Родитель Родитель; // Установить другие реквизиты. Новая! руппа. Записи ты); Следует обратить внимание на тот факт, что у реквизитов, в которые будет производиться запись значений в свойстве «Использование» должно стоять одно из перечисленных ниже значений: • Для группы • Для группы и элемента Если для справочника установлен вид иерархии Иерархия элементов, то для создания новых элементов следует использовать метод СоздатьЭлемент() менеджера справочника, а иерархия создаваемых элементов будет определяться значением свойства Родитель объекта справочника: // Создать новым элемент н корне справочника. НовыЙЭ.темснг « Справочники.Подразделения.СоздатьЭлеменП I; НовыЙЭлемент. Наименование = ’IT отдел"; 11овыЙЭ.темен i. hn I исатЫ): // Получить ссылку на родителя добавляемых )л с ментов. Родитель = Новы йЭлсмснт .Ссылка: fl Со 1 да 1ь дочерний элемент НоеыйЭ.тсменг = С нравом ники. Подраздсления.СотдатьЭлементО; НовыйЭлсмснт.Наименование = "I руппа разработки"; Новый")лемент.Роди гель Родитель; НовыйЭлемепт.Записаты к 79
Прикладные объекты Какнайти элементсправочника? Для поиска элемента справочника можно использовать несколько способов. По коду: Результат Поиска ® Справочники. Номснк.,1атура.НайтиПоКоду( "00030"); Если Результат! 1онска.Пустая() Тогда И Выполнить действия. предусмотренные в случае, когда элемент нс найден. КоиецЕсли; При организации поиска по коду обращайте внимание на тип кода справочника (Число или Строка). По наименованию: Резу лыжгН опека «( правочники .Номенклатура .Найти! !о! !аимснованию< "Кроссовки'); По реквизиту: Результат! 1оиска ш Справочники .Номенклатура . Найти ПоРсквизитуСАртикул", "К-121)002" Во всех методах поиска есть параметры позволяющие искать в нужной группе, в рамках подчинения определенному элементу справочника владельца и ряд других параметров. 80
Справочники Какудалить элемент справочника? Для корректного удаления элемента справочника необходимо убедиться в том, что другие данные не содержат ссылок на удаляемый элемент справочника. Например, в переменной «СсылкаНаУдаляемыйЭлемент» содержится ссылка на удаляемый элемент справочника: // Найти ссылки на удаляемый элемент. МассиаС’сылок = Новый Массив; Масси вСсы/юкЛобавитыСсы л каНаУ ла ляемыЙ Элемент); НандснныеСсылки = НайтиПоСсылкамСМассивСсылокк Если НайдснныеСсылк11.Кои1нчесгво() > О Тогда Сообщит ы "Нельзя удалять элемент, на него имеются ссылки”); Иначе УдаляемыйЭлеме1Гт = СсылкаНаУлаляемыиЭлемент.ПолучитьОбъекН); У д&пясмыйЭлемент.Удалить!); КоНСЦ 1'СТН, Для пометки элемента справочника на удаление можно использовать метод УстановитьПометкуУдаления() объекта справочника: У;ис1яе«ый1.1смент.Устан<>ннтьПометку Удаления!Ис тиа); Использование этого метода позволяет установить или снять пометку на удаление элемента справочника, причем будут инициированы события Перед записью и При записи объекта справочника, поскольку выполняется сохранение измененного свойства ПометкаУдаления объекта справочника. 81
Прикладные объекты Как перебрать элементы справочника? Для того чтобы перебрать элементы справочника, необходимо сформировать выборку элементов с нужными параметрами и затем обойти ее в цикле. Например, для перебора всех элементов справочника «Номенклатура» в иерархическом порядке, можно использовать следующий код: Выборка «(л 1рав*»чники.Номенклатура. Выбрел ьИсрармшсскмО: Пока Выборка. Следующий! > Цик.1 Нанменонание = Выборка Наименование; // Обращение к друшм данным справочника. КонсцЦикла: Аналогичного результата можно добиться, используя запрос: Запрос = Новый Запрос!" [ВЫБРАТЬ | Ссылка, | I ^именование: (ИЗ | Справочник.Номенклатуре |АВТОУ!1ОРЯДОЧИВАНИЕ"); Результат в Запрос ВынолнитьО.Выбра1ьО; Пока Ре jyni.iar.Следующий!» Цикл Наименование » Результат.Наименование; КонецЦикла; Благодаря использованию запроса можно формировать выборку элементов справочника более «гибко», поскольку запрос позволяет задать произвольные условия на выбираемые данные. 82
Справочники ® Как выбрать все элементы из определенной группы? Организуем выборку элементов справочника из группы, ссылка на которую определена в переменной «ПолеВводаРодитель»: Выборка = Справочники. Номенклатура. Выбрать (ПолсВводаРолигель); Пока Выборка.СледуюшнЙ( i Цикл Наименование = Выборка.Наименование; КоиецЦикла;___________________________________________________ В результате работы этого кода будут получены все дочерние элементы выбранного элемента справочника. Аналогичное действие, выполняемое с помощью запроса, будет выглядеть следующим образом: Запрос = Новый Запрос*" (ВЫБРАТЬ | Ссылка, | Наименование |ИЗ | Справочннк.Номснклатура (ГДЕ | Родитель = &Роднтель |АВТОУПОРЯДОЧИВАНИЕ"): Запрос.УстановитьПараметрСРошггель', ПолеВаодаРодитель); Результат = Запрос. Выполнить* ). Выбрать*); Пока Рсзультагт.СлелующийО Цикл Наименование Е Результат.Наименование; КоиецЦикла; 83
Прикладные объекты Если необходимо получить не только дочерние элементы, но и все элементы, находящиеся в иерархии выбранного элемента, следует, при использовании объектной техники, выполнять метод ВыбратьИерархически() менеджера справочника: м.Выбраг лсВт ттсль): иы1н»рка='. правочннкн.н*. м сикли у; 11ока Выборка.Следующий (> Цикл Наименование Выборк 1.11анменс ванне. КонецЦикла; а при использовании запроса применять условие В ИЕРАРХИИ: Запрос Новый Запрос! " (ВЫБРАТЬ | Ссылка. 1 Наименование |ИЗ | Спраночник.Номенк.шура |ГДЕ | Родитель В ИЕРЛРХИИ(&Роди1ель) | А ВТОУ ПОРЯДОЧ ИВАН И Е"); Запрос.Установить! 1араметр("Родитель", 11олеВводаРодн1 ель): Результат = Запрос. Выполнить! i Выбраггь(); 11ока !’сзультат.Слсдующий() Цикл Наименование = Результат. Наименование; КонецЦикла; 81
Справочники ® Как перебрать элементы подчиненного справочникаспомощьюзапроса? Справочник «КонгактныеЛица» подчинен справочнику «Контрагенты». Требуется перебрать всех контактных лиц определенного контрагента. Ссылка на данного контрагента находится в переменной «Контрагент». Процедуре 11еребор11одчннсныхЭлсмснтов( Контрагент» Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Контактт1ыеЛицаСсылка |ИЧ | Спраночник.КонтакпнаеЛииа КАК Конгакгные.Чица I |ГДЕ | Контакп1ыеЛица.Владелец = &В л «делец"; Запрос. Установить! 1 арамстр*" Владелец". Контрагент); Результат - Запрос. ВыгюлниИкЦ: Выборка = Результат. В ыбратЦ); Пока ВыборкаСледу инцнй() Цикл Очередной! 1одчнненый - Выборка.Ссылка; КоиецЦикла: Конец! !ропслурм Делаем запрос по таблице справочника «Контактные лица» с отбором по полю «Владелец». В качестве владельца передаем ссылку на элемент справочника «Контрагенты». 85
Прикладные объекты ® Как перебрать элементы подчиненного справочника с помощью выборки справочника? Справочник «Контактные Лица» подчинен справочнику «Контрагенты». Требуется перебрать всех контактных лиц определенного контрагента. Ссылка на данного контрагента находится в переменной «Контрагент». Процедура ! 1ерсбор| 1одчинсныхЭлемснтов(Контрагсип // Получить выборку но указанному контрагенту. Выборка = Справочники КонтактиыеЛнца Выбрать*, К* Пока Выборка.Слслуюшнй* > Цикл ОчсрслнойПолчипсный = Выборка.Ссылка; КонсцЦикла: КонецПроцедуры »нтрегент). ф Как открыть форму списка (элемента) справочника? Для того чтобы открыть форму списка справочника, можно воспользоваться методом ПолучитьФормуСписка() менеджера справочника: Форма = Справочники Номенклатура.ПолучнтьФормуСписка*); Форма. Открыты); Для того чтобы открыть произвольную форму справочника, можно использовать метод ПолучитьФорму() менеджера справочника: Форма = Справочники . X ран ил и шсДопол н ител ьной И нфор Mai i и и Получит ьФорму! иФормаС'инскаФайловИИзображсний”); Форма. ОткрытЦ); Однако следует помнить, что если методом ПолучитьФорму() выполняется получение формы элемента или группы справочника, то будет получена форма нового элемента (группы).
Справочники Для того чтобы открыть форму существующего элемента или группы справочника, следует использовать метод ПолучитьФормуО ссылки или объекта справочника: Элемен! = Справочники.11оме>1к.шпра.11ш1ГиП1>1<оду( ”00030*), Форма = Элемент. ПолучитьФорму(); Форма.О| кры । U). ® Как добавить запись в табличную часть элемента справочника? Имеется ссылка на элемент справочника «Контрагенты». Как добавить запись в табличную часть «ВидыДеятельности» этого элемента? Модифицировать можно только объект справочника. Поэтому так: ЭлемеиЮиъекл = СсылкаКо1прагепг.ПолучигьОбьект(); НояаяСтрока = ЭлеиеягЮбьект.ВидыДсятсльности.ДобмитьО; И Заполнить рсквититы. НомяСтрока.ВнлДсятсльностн = ПолеВиолаВндДеятсльности; Получаем объект справочника от ссылки на элемент. Добавляем новую строку к табличной части полученного объекта. Заполняем реквизиты табличной части в данной строке. Записываем измененный элемент справочника. ф Как удалить строки из табличной части справочника? Для того чтобы полностью очистить табличную часть элемента справочника, можно воспользоваться методом ОЧИСППЪО табличной части справочника: Элементе правой ника = Справочники. Контрагенты. Найти ПоКодуС К ХХЮб”); ОбъсктСпрааочника = ЭлсмснК'правочникаЛ 1о.тучитъОпъ<пст!); Объектеиравочн ика ВидыДея i ель мостн.Очнспп ы); О&ъсктСгтравочникя. Записать^ >: 87
Прикладные объекты Если требуется выборочное удаление строк табличной части (например, в зависимости от значения их реквизитов), можно сначала отобрать строки, удовлетворяющие условию, а затем удалить каждую из них методом Удалить() табличной части справочника. В следующем примере подразумевается, что переменная «ВыбранныйЭлемент» содержит ссылку на обрабатываемый элемент справочника, а переменная «ВыбранныйВидДеятельности» содержит ссылку на вид деятельности, который не должен присутствовать у обрабатываемого элемента: ОбъсктСправочиика = ВыбранныйЭлсмент.ПапучитьОбъсктО; И Создать структуру для отбора удаляемых строк СтруктураОтбора = Новый Структура* 'ВидДсятельности' ВыбранныйВкдДсятсльности); // Получить массив улхтясмых строк Подходя щиеСтрок и = ОбъектСправочника . ВндыДеятельности Пай гиСтрокШ СтруктураОтбора к // Удалить строки Для Каждое о ОчсредиаяС грека Из ПодходяluneCi роки Цикл ()6ъскт(’пра!ючннка.ВилыДсятс,1ьности.У ш1нть(Очсре!1наяСтрока): Конец! (нкла; ОбьскгСправочника.Заинсаты): ф Как перебрать строки табличной части справочника? Табличная часть справочника представляет собой коллекцию строк, которую можно перебрать в цикле. Реквизиты табличной части будут доступны как свойства строки табличной части. Например, перебор строк табличной части «ВидыДеятельности» справочника «Контрагенты» может быть выполнен следующим образом: 1оКоду (" Ю0006"); Элементе праьочлика ж Спривочникн.Кон1раге1пы.НиП'ти1 Для Каждого ТскушаяСтрока Из'ЭлсмснтСправочника.ВндыДеятельности Цикл Сообщить* Теку iiiaaC трока. ВидДеятсльности I; Коне и Цикла;
Справочники ® Как создать элемент в нужной группе? Необходимо создать элемент справочника номенклатура, так чтобы при этом он попал в нужную группу. Если группы с указанным кодом нет, то тогда такая группа должна быть создана. КодГруппы = "330100", ПоискПоПолномуКоду = Ложь, // значение по умолчанию Группа Справочники. Номенклатура .НаЛтмПоКолуЧКодГру ппы. ПонскПоПолномуКоду): Если Группа. Пуст ая( I Тогда Группа = Справочники.Номенклатура СоодмьГрулпу) г. Группа. Код = Код Группы, Группа. Наименование = 'Загруженные"; Г руппа. Зап ис ать(); Иначе Гели Нс I руппа. ЭтоГруппа Тогда Сообщили”Найден элемент справочника с указанным кодом!*); // Предусмотреть прерывание ал горитма. КонсиЕсли; Сир = Справочники. Номенклатура.Сол.'игп»Элемен г(); Сир.Наименование = "Нрсмраммно созданный": // Реквизиты заполняются в соответствии с тал** чей. Сир. Родитель = Группа. Ссылка; Сир. Записи гы Г, - *’ И ' Можно использовать предопределенную группу, в этом случае вместо поиска и создания новой группы можно использовать строку: Груши = Спршючники.Помешенаiура .Загружейные; 89
Прикладные объекты Обратите внимание на тот факт, что механизм работает, только если в справочнике установлен вид иерархии «Иерархия групп и элементов». В противном случае код будет выглядеть следующим образом: КодЭлсмента = "330100": ПоискПоПол ному Коду = Ложь. //Значение по умолчанию Родитель = Справочники Номенклатура .Найти! к»Колу(КодЭ. »емеита. IкнккНо Полном у Коду); Если Родитель.ПустаяО Тогда Родитель Справочники.! к>менк.1ату ра.СотдатьЭлементО: Роди ieni» Кол = КодЭлемен ia: Родитель Намменотшннс = "Затружениые”; Родитель. Записать!); КонепЕсли; Сир * Справочники.HoMciHGurrypa.Cuj-iai ьЭлемен и): Спр. Наименование = Программно созданный"; // Реквизиты залолияются в cooi вест вин с задачей. Спр.Родтпель = Родни-дь.Ссылка. Спр. Записать! г. Если вид иерархии справочника «Иерархия элементов», то понятие группы в нем отсутствует. Как узнать, есть ли утекущего элемента подчиненные? Пусть ссылка на текущий элемент справочника содержится в переменной «Владелец». Необходимо узнать, есть ли в справочнике «Единицы измерения» элементы, подчиненные текущему элементу. Если использовать объектную модель доступа: Выборка = С правой ники. Номенклатура. Выбрать! . Владелец), Если Выборка Следующий!) = Истина Тогда И Есть подчиненные элементы. КонецЕслн; 90
Справочники Фактически получаем выборку всех подчиненных элементов и если в выборке есть хоть одна позиция, считаем, что подчиненные элементы существуют. Именно этот факт и говорит о неэффективности использования данного варианта (выбираемые данные мы не используем, а получаемый блок данных может быть большим). Лучше всего подобную проверку можно выполнить, используя возможности запросов: Запрос = Новый Запрос. Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ I | Единицы И ? мерен и я ( силка |ИЗ | Справочник ЕдиницыИэмерення КАК ЕдиницыИзмерсния |ГДЕ | Единицы Измерен ия Владелец « ^Владелец*; Запрос. У спшов1ПъПарамстр( "Владелец*. Владелец); Если НЕ Запрос.Выполшпы).Пусп>й() Тогда // Есть подчиненные элементы! КонсцЕсли: Так как не предполагается, что нам понадобятся данные о подчиненном элементе, выборку результата запроса в переменной не сохраняем. Как узнать количество подчиненных элементов у выбранного элемента справочника? Необходимо определить количество элементов в справочнике «ЕдиницыИзмерения» подчиненных элементу справочника, ссылка на который находится в переменной «Владелец». С помощью объектной модели: Выборка = Справочники ЕдинццыНзмсрсння Выбраты , Влад< Количество Элементов - О; Пока Выборка.Следующий! i Пик. 91
Прикладные объекты Данное решение в общем случае является не эффективным. Связано это с тем, что выборка фактически получает все данные о подчиненных элементах справочника, а в рамках данной задачи нужно только количество элементов. Если решать задачу с помощью запроса, то решение выглядит следующим образом: 'Запрос = Новый Запрос; Запрос.Tckci = ВЫБРАТЬ | КОЛИЧЕСТВО*) КАК Количество Записей |ИЗ | Справочник.ЕдиницыИзмерения КАК ЕднницыИзмереиия |.,.г | Единицы Измерен ия, Владелец = & Владелец*; Запрос. Установить! Iарамстр( "Владелец''. Владелец); Выборка = Запрос. ВыполнитМ).ВыбратьО; Если ВыборкаХ’лсдукициГц) Тогда Количсс! воЗаписен = Выборка-КоличсствоЗапнсей: Конец Если; В результате в переменной «КоличествоЗаписей» будет находиться нужная нам величина.
Справочники Как узнать количество подчиненных элементов у выбранногоэлемента справочника, если количество подчиненныхсправочников больше чем один? Если у справочника есть несколько подчиненных справочников, то запрос может выглядеть следующим образом: ВЫБРАТЬ СУММА<К0.1ичесгвоПолчиненных) КАК КоличесиюПолчиненныхЭле.меитов ИЗ (ВЫБРАТЬ КОЛИЧЕСТВО*) КАК КштчествоПодчнненных ИЗ Справочник.ЕдннииыИлмсрсння КАК ЕдиницыИчмсрсння ГДЕ ЕлиннцыИчмсрсння.Владелец = &Влалслсц ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОЛИЧЕСТВО* ♦) И3 , Справочник. Серии Номенклатуры КАК Сери и Номенклатуры ГДЕ Серим Номенклатуры. Владелец ~ & Владе ieu I КАК В ютенныйЗапрос Данный запрос позволяет получить количество записей в двух подчиненных справочниках. В качестве источника данных в основном запросе используется подзапрос («ВложенныйЗапрос»). Сам подзапрос состоит из двух запросов (происходит их объединение). Каждый из объединяемых запросов получает данные о количестве записей в одном из подчиненных справочников. В выборке результата запроса (в случае если у элемента справочника, ссылка на который находится в переменной «Владелец», есть подчиненные элементы) будет одна строка, в поле «КоличествоПодчиненныхЭлементов» которой содержится количество подчиненных элементов. 93
Прикладные объекты Как получить всех родителей выбранного элемента справочника? В переменной «СсылкаНаЭлеменг» находится ссылка на элемент справочника. Необходимо получить всех родителей данного элемента МассиьРодшелей ~ Новый Массив: Родитель = СсылкаНаЭлемен i .Родитель; Пока Нс Родитель.! lycraai) Цикл Масс ив Родителей ДобавнтьС Родитель К Роди гель = Родитель. Родитель: КонецЦикла: Перебрать всех родителей можно используя строки кода: Для Каждого Текущий Родит ель II i МасснвРодрггелей Цикл // РаСчпа с текущим родителем. КонецЦикла Данную задачу можно решить и с помощью запроса, однако следует учитывать, что в языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться, например, иерархическими итогами, текст запроса будет выглядеть следующим образом: ВЫВРАТЬ Номенклатура.Ссылка К АК Ссылка ИЗ С правочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура,Ссылка = А Ссылка итоги ио Ссылка ТОЛЬКО ИЕРАРХИЯ Результат запроса будет содержать одну «лишнюю» запись, которую легко «отсеять» проверкой свойства «ЭтоГруппа». 94
Справочники Однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями, например, так: Теку ший Эле мен тНомснкла туры = ЭлсментНомснклатура; Запрос = Новый Запрос) "ВЫБРАТЬ | Номенклатура. Родитель, | Иомен к ла i ура Родитель. Родитель. | Номенкла1ура. Родитель. Родитель, Ролш ель. | Номенклатура. Родитсль.Роднтсль.Родитель. Родитель. | 11оменклатура.Родитель Родитель.Родитсяь.Родите.ть.Родитель |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | 1(оменклатура.Ссылка m & Геку щмнЭлемен i Номенклатуры”; Пока Истина Цикл Запрос.УстановитьИараметр) *'Тск)тциГ<ЭлементНомснклатурыи, ТекутийЭлемен т Номенклатуры); Результат » Запрос. Вы полнить)); Если Результат.ПустоЙ)) Тогда Прервать; КонсиЕсли; Выборка = Результат. Выбрать)); Выборка.Следующий)); Для НомерКолонки = О По Результат.Колонки.Количество)) I Цикл ТскущийЭлемсит Номенклатуры = Выборка) НомерКолонки); Если Теку щнЙЭ;н:мсча Номенклатуры « Справочники .1 (оменклатура .ПустаяСсылкаО Тогда Прервать; Иначе С ообшить( Теку щи Гт Эл с ме нт Н о мен кд ат у ры) ; КонепЕсли; КонсиЦикла; Если ТскущиПЭлементНомснклатуры = Справочники .1 (омен клатура ПустаяСсылкаО Тогда Прервать: КонецЕсли; К о ней Ци к та; 95
Прикладные объекты В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную «ЭлементНоменклатура». В цикле выбирается по 5 родителей ссылки. Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла. Как получить запросом «полный» код элементов справочника, если тип кода - Строка? Понятие «Полный код» соответствует объектной модели системы. Это свойство объектов «СправочникСсылка» и «СправочникОбъект», содержащее указание кодов элемента и всех родителей его иерархии. Представляет собой строку, в которой указаны коды всех вышестоящих элементов иерархии, начиная с самого верхнего уровня и разделяемые символом «/» заканчивая кодом самого элемента. В табличной модели хранения информации никакого поля «ПолныйКод» для таблиц справочника не существует. Однако можно говорить о значении поля «Родитель» каждой из записей таблиц справочников и о значении поля «Код». Поэтому запрос по трехуровневому справочнику «Контрагенты» будет выглядеть следующим образом: ВЫБРАТЬ Контрш ен ты.Ссылка. ВЫБОР КОГДА (Контрагенты. Родитель. Кол ЕС ТЬ NULL ) ТОГДА Контрагенты.Код КОГДА (Контра! енты. Родитель. Родитель.Код ЕСТЬ NULL ) ТОГДА KoirrparcH гы.Родитель.код г 'Г t Контр агенты. Код ИНАЧЕ Контрагенты.Родитель. Родитель. Кол + "Г ♦ Контрагенты. Родитель.Код + ’7й + Контрагенты. Код КОНЕЦ КАК ПолныйКод ИЗ Справочник.KoinpareiiiM КАК Контрагенты Источником является таблица справочника. Из нее выбираем поле «Ссылка» и вычисляемое поле «ПолныйКод». Вычисление полного кода производим путем сборки его из значений кодов самого элемента и кодов всех вышестоящих родителей. Для этого для каждой записи сначала определяем ее уровень. 96
Справочники Уровень определяем следующим образом: для записей корневого уровня поле «Родитель» содержит пустую ссылку на элемент справочника, поэтому значение поля «Код» этого «Родителя» будет NULL. Если это условие выполнилось - значит, элемент находится на корневом уровне, и в качестве полного кода достаточно указать код. Если условие не выполнилось - проверяем аналогичным способом элемент на принадлежность к первому уровню. В случае выполнения условия — выводим уже код родителя и код самого элемента через «/». Таким же образом можно построить «сборку» поля «ПолныйКод» для случаев 4-х, 5-ти и т.д. уровневых справочников. В отношении возможных возражений о «неуниверсальности» подобного подхода: хотя, в общем случае, количество уровней справочника может быть не ограничено, сложно представить себе реальную практику использования справочника более чем с 10 уровнями вложенности из-за явного неудобства работы пользователя с таким «глубоким» справочником. Как получить все элементы справочника, содержащие в наименовании определенную подстроку, со всей иерархией, в которую они входят? Допустим, речь идет о справочнике «Контрагенты». Лучше всего с данной задачей справится запрос со следующим текстом: Запрос = Новый Запросу "ВЫБРАТЬ | Контрагенты.Ссылка КАК Ссылка (ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | (Контрагенты.Наименование ПОДОБНО &ЧастьНаименовання1 I И | (НЕ Коитрагенты.ЭтоГруппа) (ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ '); Запрос. Уста новнтг.Парамстр<’Часп>Наименования", “%* + ПолсВволаПодстрока + “%"); 97
Прикладные объекты Источником запроса является таблица справочника. Делаем отбор по наименованиям, в составе которых присутствует значение параметра «ЧастьНаименования». Условие отбора обеспечивается посредством оператора проверки строки на подобие шаблону. В шаблоне служебными символами «%» обозначается, что перед и после части строки, считанной из «ПолеВводаПодстрока», может встречаться произвольное количество других символов. Как найти все элементы справочника, в которых не заполнен строковый реквизит? Получить желаемое можно таким запросом: ВЫБРАТЬ ФизичсскисЛнца. Ссылка ИЗ Спрэночник.Фиш'кхкисЛина КАК ФичичсскисЛипа ГДЕ (ФизическиеЛицжИНН = Проверка пустой строки выполняется за счет операции сравнения «=». В данном случае будут отобраны и элементы, в которых пользователь ничего не вводил и даже те, в которые он ввел только пробел (или пробелы). Но на некоторые реквизиты при работе с формой накладывают маску. В таких случаях случайный ввод хотя бы одного пробела уже не позволяет данному реквизиту быть пустым. Его значение будет содержать маску с пробелами. Для того, чтобы «защитить пользователя от самого себя» в подобных случаях запрос лучше немножко изменить. Например, для реквизита с маской «999-999-999 99» запрос будет выглядеть таким образом: ВЫБРАТЬ Фи ли чес к неЛ и на. Ссыл ка ГДЕ <Фнл»1ЧсскиеЛнца.СЛрадовойНомсрПФР а "") ИЛИ (ФиличлжиеЛниа.СЛраховийНомерПФР " - •") Количество пробелов перед и между символами «-» должно соответствовать маске.
Справочники Какперенести все элементы справочника «Контрагенты» из одной группы в другую? Для этого необходимо перезаполнить значением нового родителя реквизит «Родитель» у элементов, непосредственно являющихся «потомками» исходного родителя. Итак, пусть переменная «СтарыйРодитель» содержит старого, а «НовыйРодитель» - нового родителя. Получение элементов справочника, которым нужно поменять родителя, производим следующим образом: Запрос = Новый Запрос; Запрос Текст = "ВЫБРАТЬ | Контрагенты.Ссылка |ИЗ | Справочник. Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Родится». = &СтарыйРолитель”; Запрос.Установить! 1арамс1р( "СтарыйРодитель". СтарыйРодитель К Результат = Запрос. Выполнит^); Источником для запроса является таблица справочника «Контрагенты». Делаем отбор непосредственно по полю «Родитель» и получаем таблицу ссылок на нужные нам элементы справочника. Далее: Пока Выборка.Следук>и1мЙ() Цикл Контрагент = Выборка.Ссылка.ПолучитъОбъектО; Контрагент. Родитель = НовыйРодитель; Контрагент.Записать! i; Конец Цикла: В цикле обработки результата запроса производим получение объекта по ссылке. Для каждого полученного объекта производим запись нового родителя в реквизит «Родитель» и непосредственную запись объекта с измененными данными. 99
Прикладные объекты Как организовать программный выбор элемента справочника? Требуется из одной формы (например, формы документа) открыть для выбора элемента форму справочника. После того, как значение будет выбрано в форме справочника, его необходимо получить для дальнейшей обработки в форме документа. // Получить форму выбора справочника как подчиненную И форме документа Фирма Выбора = Справочники.Номенклатура.! 1о.1учитьФ>)рмуВыбора( . ЭтаФорма): // ()ткрыть полученную форму ФормаВыбора.Откры п4); Для получения выбранного значения используется обработчик события Обработка выбора формы владельца (в нашем случае формы документа). Процедура Обработка Выбора! Знамен не Выбора, Источник) ПолученносЗначсние = Значение Выбора: //Дальнейшая обработка шачения. КонепПроцедуры Вместо метода ОткрытьО объекта Форма Выбора в ряде случаев можно использовать метод ОткрытьМодально(). В этом случае окно откроется в модальном режиме и пока данная форма не будет закрыта, работать с другими формами, объектами в рамках данного клиентского приложения будет нельзя. Выполнение процедуры также будет остановлено на данном месте и продолжрггся после закрытия формы. Форма Выбора = Справочники.Номенклатура.! 1олучитьФормуВыбора( . 'ЭтаФорма), Выбрано » ФормаВыбора.ОгкрыгьМодальноО; 100
Справочники Аналогичным образом можно организовать выбор для поля ввода. Для этого, в обработчике события Начало выбора поля ввода следует отключить стандартную обработку и получить нужную форму выбора как подчиненную данному полю ввода. Например: Процедура ПолеВвода! 1ачалоВыбора( Элемент, СтандартнаяОбработка» И Запретить стандартную обработку. Стандартная! Наработка = Ложь; // Напучить форму выбора справочника как подчиненную полю ввода Форма Выбора я Справочники .Номенклатура .ПолучитьФормуВыбора! . Элемент»; // Открыть полученную форм} ФормаВыбора. Открыть!); KoHciillpoiic'iyphi Если есть необходимость в использовании собственного алгоритма обработки выбранного значения, его следует размещать в обработчике события Обработка выбора поля ввода: Процедура ПолеВводтЮбработкаВыбирж Элемент, ВыбранносЗначснис. С тандартнаяОбрэботка) И Отключить стандартную обработку (при необходимости). Стан.тар гнаяОбработка - Ложь: ПолученноеЗначение Выбранное Значение: U Дальнейшая обработка значения. Конец! 1роце дуры 101
Прикладные объекты Как сохранить фотографию сотрудника в справочнике «Сотрудники»? Необходимо создать реквизит справочника «Фотография» и определить у него тип ХранилИЩеЗначения. Далее в форме элемента определить кнопку (либо использовать кнопку командной панели), при нажатии на которую, будет выполняться следующий обработчик события: В данной процедуре первоначально создается объект ДиалогВыбораФаЙла. Метод Выбрать() открывает данный диалог и в случае выбора возвращает значение Истина. В приведенном примере в объект ХранилищеЗначения помещается объект Картинка. Эго удобно в том случае, если предполагается, что после извлечения, картинка будет отображаться в элементе управления НолеКартинки диалога какой-либо формы. .В противном случае в реквизит можно помещать не значение, имеющее тип Картинка, а значение с типом ДвоичныеДанные. ВыбФай । -= Новый ДноичныеДаниые(Диа.1О|ОткрыiияФайла.ПоллосИмяФ; злХранилища = Новый X psiiii! л ищсЗначениЖ ВыбФай-i); Фотография = элХранилиша; 102
Справочники Можно сказать, что в реквизит справочника записывается объект ХранилищеЗначения, в который помещен указанный файл. Замечание: при разработке структуры данных прикладного решения следует внимательно относиться к использованию полей, имеющих тип ХранилищеЗначения. В качестве общей рекомендации можно посоветовать создавать структуры данных, которые обеспечат отдельное от основной информации хранение таких полей. Например, фотографию сотрудника лучше хранить не в реквизите самого справочника «Сотрудники», а в отдельном справочнике или регистре сведений. Объекты системы (в данном случае элементы справочника «Сотрудники») считываются системой всегда целиком, поэтому хранение больших объемов информации непосредственно в полях объектов может существенно замедлить работу системы. 103
Документы © Как создать новый документ? Если создание нового документа должно пройти без участия пользователя, можно сделать так: □ Новый,'Документ = Документы I1р11ходныйКжх*овын()рлср.Со'1датъДокумснтХ); Новый Доку мент. Дата ТекушаяДаттИ); Переменная «НовыйДокумент» в таком случае имеет тип значения ДокументОбъект - мы сразу получаем объект нового документа. А значит, обращаясь к ней, впоследствии можно заполнить реквизиты документа и записать его. Если нам нужно не просто создать новый документ, но и дать возможность пользователю поучаствовать в процессе его заполнения и записи, то лучше сделать так: ФормаНовогоПКО = Документы ПриходныйКассоаыйОрлср .Получит ьФорму Honor оДоку мента! Форма! lowor оП КО.Ог кры ): В данном случае после создания документа мы открываем основную форму этого документа для редактирования его пользователем. Как найти документ? Например, нужно найти в 2005 году документ «РеализацияТоваровУслуг» по номеру «НомерДок» (периодичность нумерации - «в пределах года»). Тогда так: Иском ыйДоку мен I = Документы .гсализацня i оварову слуг 11ай । иПо11омеру(11омерДок. Да 1 а(2<Ю5, 1, 1)); Если НЕ ИскомыйДоклмсн г.Иустая() Тогда // Выполнить действия в случае обнаружения такого документа. КоиецЕсли; 104
Документы Второй параметр метода НаЙТИПоНомеруО используется в случаях периодических нумерациый документов и может содержать любую дату из того периода, в рамках которого нужно искать документ. Если же поиск нужно выполнять по реквизиту, то можно, конечно, использовать объектную модель работы с данными - метод НаЙТиПоРеквизиту() менеджера документа. Однако в результате будет получен только один из документов с искомым значением реквизита. Гораздо удобнее для выполнения операций поиска использовать запросы. Например, с таким текстом: ВЫБРАТЬ РеалтацияТоваровУслуг.Ссы.тка ИЗ Документ. РеализацияТоваровУслуг КАК РеаличацияТоваровУслуг ГДЕ РсалнчацняПоваровУслуг.Контрагент = ^Контрагент И (РсалнтацияТоваровУслут .Номер < 100 ИЛИ Реа.тмцияТовировУслуг.Дата< ДАТЛВРЕМЖ2ОО5,1, I)) И РеалнтацияТоваровУслуг.Товары.Номенклатура В ИЕРАРХИ111&Номенклатура) Такой запрос позволяет получить все документы «РеализацияТоваровУслуг» по указанному контрагенту, закупавшему товары из указанной номенклатурной группы ранее 1 января 2005 года или позже, но с номерами документа менее «100». Какоткрыть форму документа? В переменной «ИскомыйДокумент» содержится ссылка на документ. Если требуется открыть основную форму этого документа, это можно выполнить так: Форма = ИскамымДокумент.ПояучитьФорму)) | Форма.Опфыть(); 105
Прикладные объекты Ф Как изменить значение реквизита и записать документ? Например, переменная «СсылкаНаДокумент» содержит ссылку на тот документ, который необходимо изменить. Сначала по ссылке нужно получить объект ДокументОбъект. Потом можно установить значение нужного реквизита, и записать измененный документ. ДокОбьекг - Ссы1>каНаДокуме1гг.По.|учитьОбъекг(); ДокОбьек! СЪвстственнын глТекущнйПильюаа1е.1ь; ДокОбъскт.Записи гм); Обращайте внимание, требуется ли обеспечить проведение измененного документа. В нашем примере документ был записан без проведения. Если необходимо при этом провести документ, то: ДокОбьект.ЗэписагмРежимЗаписиДокумснта.Проислсннс). Первым параметром метода передается значение Проведение системного перечисления РежимЗаписиДокумента, а вторым параметром можно указать режим проведения (оперативный/неоперативный, так же выбирается из соответствующего системного перечисления). Если же наоборот, нужно отменить проведение документа, то: Д<жОбъею.Запнсагь(РсжимЗа1111сцДокумсша.Отмс1!а1 Ipoac.ictiHi); Во всех перечисленных случаях система передаст управление соответствующим ситуации обработчикам событий (Перед записью, При записи, Обработка проведения, Обработка удаления проведения). Замечание: В языке системы нет специальной команды для инициализации выполнения проведения или отмены проведения документа. Все выполняется при соответствующем способе записи документа. 106
Документы ® Как добавить строку в табличную часть документа, имея ссылку на документ? Допустим переменная «Док» содержит ссылку на документ. Имя табличной части этого документа - «Товары». Тогда: ОбъсктДак = Док.ПолучятъОбъегИ >; Новау Строка » ОбъектДок.Говары.Добавиты) // Заполнить значения реквизитов НоваяС'трока Количество = 10*. НоваяСтрока.Цсна = 55: Сначала получаем объект документа. Потом добавляем новую строку в табличную часть «Товары» документа. Результат метода Добавить() и есть новая строка. Теперь можно заполнить значения ее реквизитов. В конце нужно не забыть записать документ. ф Как удалить строки из табличной части документа? В переменной «Документ» содержится ссылка на документ. Если требуется модифицировать этот документ - удалить строки из табличной части «Товары» этого документа, - это можно выполнить так: ОбьсктДокумента = Документ.ПолучитьОбъектО; ОбъсктДокумснтаТовары.ОчистнтъО; По окончании всех модификаций, если это требуется, не забудьте записать документ. Объект Доку мен га Записать!) В данном случае документ записан без проведения. Подробнее о записи документа с проведением смотри вопрос «Как провести документ?» на странице 109. 107
Прикладные объекты Какперебратьстроки документа? У документа может быть несколько табличных частей. Перебор строк каждой табличной части проще производить в цикле перебора элементов коллекции или при помощи «цикла-счетчика». Например, чтобы перебрать строки табличной части «Товары» документа «Документ», можно сделать так: Для Каждого ГскущаяСтрока Из Документ.Товары Цикл // Действия со строкой табличной части. КоиецЦикла: А можно так: ф Как выгрузить табличную часть документа? Чтобы выгрузить табличную часть «Товары» документа «Документ» в таблицу значений, можно сделать так: Таб.шиаТоиароиДокч мети = Доку мен г То»ары.Вы1ру mi J): В результате система создаст таблицу значений с колонками, соответствующими колонкам табличной части и заполнит ее данными. ® Как посчитать итог в табличной части документа? Итог по колонке «Сумма» табличной части «Товары» документа «Документ» можно посчитать следующим образом: 108
Документы оПоКолонкеСумма = Документ.Товары.ПгоПиСумма Как провести документ? Первым параметром метода Записать () следует указание режима записи документа. Тип его значения задается системным перечислением РежимЗаписиДокумента, и может принимать следующие значения: • Запись; • ОтменаПроведения; • Проведение В нашем случае - это Проведение. Теперь при выполнении этой команды управление будет передано в обработчик события Обработка проведения записываемого документа. Обратите внимание - нет отдельной команды на проведение, есть только запись документа, с проведением или без. Как перебрать документы? Для перебора всех документов, например «РеализацияТоваровУслуг», можно использовать выборку. Выберем, например, документы за текущий год. ВыборкаДокументов — Доку менты.Расходная.Выбрать(НачалоГода(Тску щаяДага1)), Комен! ода! Теку щамДм ))); Пока ВыборкаДокумснтов.С.тедукмиийО Цикл // Действия с документом - элементом выборки. // ею значение содержи н я в переменном В ыборкаД оку ментов КонсцЦикля В теле цикла можно работать с каждым отдельным элементом выборки. 109
Прикладные объекты Однако, в случаях, когда требуется перебрать документы, соответствующие ряду условий - гораздо удобнее получать нужные документы при помощи запроса: Запрос Новый Запрос; Запрос.Текст =" (ВЫБРАТЬ | РеалтацияТовароаУслут.Ссылка |ИЗ | Документ РеализапияТоваровУслут КАК Реал изацияТоваровУ слуг |ГДЕ | Ре&яизацияТомфОвУсяуг.Коитршепт » AKoirrpai епт I И | (Реализация!ЬваровУ слуг. Номер < ПК) I ИЛИ | Рса-шзацияТоваровУслуг.Дата < ДАТА ВРЕМ Я(2(Х>5, I. 10 I И | РсализацняТоваровУслуг.Товары.Номенклатура В ИЕРАРХИИ(&11оменкла|ура) Запрос.УстановятьПарамстрСКонтрагент", ОгбКонтрагснт); Запрос.УстановитьПараметрТ'Номенклатуре'', ОгбНоменклатура); Результат - Запрос.Выполнить*!): Выборка = Результат.ВыбратьО; Пока Выборка.Следующий!) Цикл // действия с документом - элементом выборки. // его тначсние содержится в переменной Выборка КоиецЦикла: В данном пример организован перебор всех документов «РеализацияТоваровУслуг» по указанному контрагенту, закупавшему товары из указанной номенклатурной группы ранее 1 января 2005 года или позже, но с номерами документа менее «100». НО
Документы ф Как пометить на удаление все приходные накладные? ДокумешыВи.;а= Доку меты. Посту илепиеТоиароиУслуг.ВыирагьО; Пока ДокумснтыВида Следующий)) Цикл Док Объект = ДокуметыВнла.Получип.06ъект( I; ДсжОбмп Установи гьПиме!ку Удаления)Истина), КонецЦикла;_______________________________________________ Выполняем выборку приходных накладных. Обходим ее в цикле. Внутри цикла получаем объект документа по каждой из ссылок на накладную. Теперь помечаем документ на удаление при помощи метода УстановитьПометкуУдаления(). В результате документ будет помечен на удаление с вызовом обработчика Перед ЗЭПИСЫО. Замечание: как альтернативный вариант - можно было бы внутри цикла просто присваивать реквизиту «ПометкаУдаления» объекта документа значение Истина. Но в этом случае пришлось бы еще обеспечивать и запись документа. (D Как, имея ссылку на документ, создать в базе его копию? ДсжумснтКопия = ИсходныйДоку мент.Скопировать»); ДокументКопня.Дата - Рабочая Дата; До«у ментКопия Записать»); При применении метода Скопировать^ все реквизиты нового документа получают свои значения из переменной «ИсходныйД оку мент». Исключение составляют значения реквизитов «Дата» и «Проведен». Поэтому, если копирование документа не сопровождается открытием его формы, дату нового документа лучше установить самостоятельно. В нашем примере в качестве значения реквизита «Дата» устанавливаем дату, которую обычно используют для случаев создания новых документов (получаем из свойства глобального контекста РабочаяДата). ill
Прикладные объекты Но если Вам нужно и дату скопировать из документа - источника, то эта строка должна выглядеть следующим образом: Докумсн t Копия Дата = ИсходныйДокумсиг.Дата; Ну а потом уже записывать новый документ в базу. В данном случае мы записываем его без проведения. ® Как, имея ссылку на документ, прочитать его движения по регистру? Если необходимо просто прочитать движения, без последующей модификации - можно воспользоваться запросом к нужному регистру: 'ianpoc = Новый Запрос; Запрос Текст ="ВЫБРАТ1> * |ИЗ | РсгистрНакоплсния.ОстаткиНомснклатуры КАК Остат киНомснклатуры |ГДЕ | ОсгаткнНоменклатуры.Ри истратор ж ^Регистратор"; Запрос.Установитт.Парамегр< 'Регистратор", ПолсВводаР.-гистратор); В запросе выбираем все поля (кроме виртуальных) из таблицы регистра «РегистрНакопления.ОстаткиНоменклатуры» с отбором по регистратору. Значением параметра «Регистратор» нужно будет установить ссылку на документ. Если же нужно чтение с последующей модификацией движений - следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр «ОстаткиНоменклатуры») и прочитать набор записей регистра: Набор ЗаписейРе! негра ж Движения ОстаткиНоменклатуры; 11 аборЗа! । исейРс) истра.Проч игаi М); Для Каждого'Запись н> НаборЗаписсйРсгнстра Цикл Н Чтение и модификация очередного движения КонсцЦиюяа; 112
Документы Если требуется изменить движения документа по всем регистрам, нужно обойти фиксированную коллекцию, содержащуюся в свойстве Движения. Например: Для Каждою НаборЗаписейРе! истра из Движения Цикл НаборЗчН шеей Pci ncipa Прочит ат М); Для Каждого Запись из НяборЗаписейРегистра Цикл // Чтение и модификация очередного движения. КонецЦикла; Коне ц Ци к. та; Сначала открываем цикл перебора свойств свойства Движения - коллекций наборов записей регистров, для которых наш документ является регистратором. Далее читаем наборы записей каждой коллекции и открываем цикл перебора записей данного набора записей. Как определить, по каким регистрам документ выполнил движения? Например, требуется определить, по каким регистрам выполнил движения документ «ВнутреннийЗаказ». Наиболее производительным решением этой задачи будет выполнение следующего запроса к регистрам: ВЫБРАТЬ ПЕРВЫЕ I "Внут ренине заказы* КАК Регистр ИЗ РегнстрНако11.'1сння.ВнутренниеЗаказы КАК ВнугренниеЗакаиа ГДЕ ВиутренииеЗаказы. Регистратор = & Регистра юр ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ I "Заказы поставщикам" КАК Регистр ИЗ РсгистрНакоплсния.ЗаказыПоставщикам КАК ЗаказыПоставщикам ГДЕ Заказы Поставщикам. Регистратор = &Pei истратор 113
Прикладные объекты ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ 1 "Размещение заказов покупателей” КАК Регистр из РсгнстрНакоплсния.Размсгцсн11сЗаказов1 [окупите, геи КАК РалмегиепиеЗакаиувПгжупатегей ГДЕ Размещение ЗакалопПокупатслсй.Регистратор = ^Регистратор ОБЪЕДИНИТЬ ВЫБРАТЬ ПЕРВЫЕ I “Товары в резерве на складах" КАК Регистр ИЗ РегистрНакоп.тения.ТоварыВРелсрвсНаСклалах КАК ТошрыВРекрвеНаСкладах ГДЕ ТоварыВРетер1к,НаСк.|алах.Ре1нсгро1ор - &Регистритор Для каждого регистра, по которому документ «ВнутрениийЗаказ» может выполнять движения, выполняется получение одной первой записи этого регистра, для которой выбранный документ является регистратором (ссылка на выбранный документ должна быть передана в параметр «Регистратор» запроса). В качестве значения выбранного поля получается строка с названием регистра. Результаты всех запросов объединяются. В результате работы этого запроса может быть получена, например, такая таблица: Внутренние заказы Т оедры в резерве на склада» 114
Документы Как в табличной части документа удалить строки с нулевым значением реквизита «Количество»? Если у нас есть ссылка на некоторый уже записанный документ, тогда можно поступить следующим образом: ТабличнаяЧастъДок « ОбъсктДок.Товары; Массив! 1устъгхСтрок ® ТаблнчнаяЧаспъД<>кЛ1айтнСт|юкн(Стру*пураДля1I опека): Для каждою Строка Из МассивПустыхСгрок Цикл Табличная Част ьДок.Уда.титъ4Строка); КонсцЦикла; ОбъсктДок.Запис&тМ), Получаем по ссылке объект документа. Создаем структуру для поиска. В качестве ключа указываем название реквизита, в качестве значения - искомое значение. Обращаемся к табличной части «Товары» данного документа. Посредством метода НаЙТиСтрокм() получаем массив строк соответствующих нашей структуре для поиска. В цикле перебираем эти строки и удаляем их из табличной части документа. После выхода из цикла записываем документ-объект с обработанной табличной частью. Если же речь идет о еще не записанном документе, и работа выполняется в форме документа, реализация задачи незначительно изменяется: Изменения связаны с тем, что в этом случае мы сразу находимся в контексте объекта документа. Кроме того, вопрос о записи измененного документа оставляем на усмотрение пользователя штатными средствами. 115
Прикладные объекты Как очистить колонку «СтавкаНДС» в табличном поле «Товары» уже заполненного документа? Для этого нужно «обнулить» значения реквизита «СтавкаНДС» в строках табличной части «Товары» документа. Именно она «отвечает» за данные, представляемые в табличном поле. При этом не забудьте про обработчик события При изменении, кото может присутствовать в поле ввода этого реквизита. Например, текст процедуры обработчика: I 1роцедура ТоеарыС гавкаН ДСП риИзмене!iии(Элемент) // Рассчитать реквизиты табличной части РассчизатъСуммуНДСТабЧастнГЭлемснзыФор.мы Товары.ТекущисДанные, ' >т0тОбъскт ); КонеаПроцелуры И Тов41рыС1авкаНДСПрнИзмене1<11И() Тогда решение нашей задачи будет выглядеть следующим образом: Для Каждого Строка из Товары Цикл Строка.СтавкаНДС = Неопределено; И Передать управление на процедуру, вызываемую // из обработчика события "ПриИзмснении* для поля ввода "СтавкаНДС" ЭлсминтыФормы.Товары. ГекушаяСтрока Строка: РассчитатьСуммугНДСТабЧастн(ЭлементыФормы.Товары.ТекущнеДанные» ЭтотОбъскт); КонецЦикла; Открываем цикл перебора строк табличной части «Товары». В цикле устанавливаем значение «Неопределено» для реквизита «СтавкаНДС». Теперь необходимо выполнить те же действия, что выполнял обработчик интерактивного изменения ставки НДС. И поскольку одним из параметров процедуры РассчитатьСуммуНДСТабЧасти() передается свойство Текущие Да иные табличного поля - сначала позиционируемся на нужной строке табличного поля. Теперь передаем управление нужной процедуре. 116
Документы Какзаполнитьзначениясвойствнового документа на основании существующего? Для этого можно воспользоваться методом глобального контекста ЗаполнитьЗначенияСвоЙСТВ(), который позволяет копировать значения свойств одного объекта в свойства другого объекта: НовыйСчет я Доку менты. С чет НаОплат у! 1оку патсл ю.СоздагьДокумент! к ЗаполннтьЗначенияСтюйспкНо|1ыйСчет. Доку мент Заказа,. “Дата*); // Заполнить табличную часть Товары. Для Каждого СтрокаТоваровЗаказа Из Документ Заказа. Товары Цикл Заполнит ьЗначенияСвойств! 11овыйС чет. Товары .Добавить!). СтрокаТоиаривЗиказа); КоиецЦикла; // Заполнить гиблпиную часть Возвратная Гара Для Каждою С трокаТары Заказа Из Документ Заказа. Возврат пая Тара Цикл ЗаполнитьЗнэ,1снияСвойств! НовыйСчет ВозвратнаяТара Добавить!), С т рока! ары Заказа I, КоиецЦикла; // Заполнить табличную часть Услуги Для Каждого СтрокаУ слутЗаказа Из Доку мснтЗаказа-Услуги I (икл Заполнит ьЗиаченияС 'воисгв(НовыйСчет.Услуги.Добавить!). Строка Уел у гЗаказа); КоиецЦикла; НовыйСчет.ЗшапПокупателя ж Документ Зака та; Форма = НовыйСчет .Получит ьФормуо Форма. Открыть!); 117
Прикладные объекты Как получить перечень приходных накладных, в которых не заполнены номенклатурные позиции? Запрос = Новый Запрос; Запрос. Текст = 'ВЫБРАТЬ РАЗЛИЧНЫЕ | ПричодиаяТовары.Ссылка как Накладные |ИЗ | Документ.ПоступленнсТоваровУслуг Товары КАК ПриходнаяТовары |ГДЕ | ПриходнаяТовары.Номснюшура » &Пус1аяНоменк.1а1ура**; Запрос. Уст зноен г ьПарамсгр< "ПусгаяНомснклэтура", Справочники. Номенклатура.I 1устаяСсылка()); Таблица Накладных = За прос. Выполи нт ьО;______________________ Выполняем запрос по табличной части «Товары» приходных накладных. Делаем отбор по равенству поля «Номенклатура» параметру « ПустаяНоменклатура». В качестве значение параметра устанавливаем пустую ссылку справочника «Номенклатура». Результат запроса будет состоять из единственной колонки «Накладные». Обратите внимание - выбираем не повторяющиеся записи (ВЫБРАТЬ РАЗЛИЧНЫЕ). Эго сделано для случая наличия нескольких строк с незаполненной номенклатурой в одном документе. 118
Документы Как на дату расходной накладной определить курс валюты управленческого учета? Валюта управленческогоучетахраниться в периодическом регистре сведений. Информацию о валюте управленческого учета хранит регистр сведений «УчетнаяПолитика» - периодический, с периодичностью год: I УчтжИолли В f*M Ресчрсы Регистр сведений «КурсыВалют» - так же периодический, но с периодом «день»: * I SPctiB а<хл В,*— Иамвржмй • ВмОП Hi ; - I Мншостъ 3 Рыишг» Данную информацию можно получить посредством запроса: ВЫБРАТЬ КурсыВалюК’рсзИослсдних.Валюта как ВалютаУпр, Курсы Вал ютСрсз!1ос.тсдних.Курс как КурсУпр ИЗ РсгистрСводсний КурсыВалкгг.СрезПослодннх(&Д«иаД<>кумента. Валюта В ( ВЫБРАТЬ Учетная! (олнтикаС'рстПос ледник. Вал юта У правленческая ИЗ Pci истрСведений, Учетная! киитмкаЛ |хгИЪА‘ле.и<нх(&Да(иДокумснта, ) КАК Учетная! 1олитикаСрсз!1осле днях ) ) КАК КурсыВалюгСреэПоследних Во вложенном запросе осуществляем определение управленческой валюты на дату документа. Результатом будет таблица с единственной валютой. Данную таблицу используем при построении отбора на параметрах виртуальной таблицы 119
Прикладные объекты «РегистрСведений. Курсы Валют. СрезПоследних». Поскольку управленческих валют - только одна, на выходе запроса получим таблицу из единственной записи с двумя полями «ВалютаУпр» и «КурсУпр». Как из формы документа вызвать его неоперативное проведение? В форме документа кнопке «ОК» обычно назначается действие «записать и закрыть», обеспечивающее выполнение стандартных операций по записи, проведению документа и закрытию формы. Одной из таких операций, при определенном перечне условий, является уточнение у пользователя режима проведения документа (оперативно или неоперативно). В случае если для проведения документа это никакой роли не играет, и пользователя раздражает подобная «любознательность» системы, можно сделать следующее: - удалить стандартную кнопку; - создать свою кнопку; - в качестве действия назначить нижеприведенную процедуру. Процедура Ос1ювиыеДействцяФормыОК(Кнопка) ЭтаФормз.Испо.1Ь’эо1штьРсжимПр<1вслення = ИспольэованиеРсжммаПро|1елення .Неоперативный: ЗапксатъВФормс! РсжимЗаписнДокумснта.! [ровслсннс): Закрыть! ); Коней! 1роцсдуры В процедуре свойству ИспользоватьРежимПроведения расширения формы документа назначаем значение Неоперативный из соответствующего системного перечисления. Далее используем метод ЗаписатьВ Форме () расширения формы документа. В результате управление последовательно будет передано на нужные обработчики событий, начиная с Перед записью формы документа. Последней командой процедуры форма документа закрывается. 120
Документы Как в обработке проведения получить остатки, актуальные на позицию документа? Корректно вопрос решается за счет использования параметра «Период» виртуальной таблицы: Для запроса вида: Запрос. Текст =" ВЫБРАТЬ | ВзаиморасчсгыСКон'ГратснтамиОстаткп.С'уммаВзаиморасчстовОстяток, | ВэйнморасчетыСКонтраг снтамиОстатки.С'уммаУпрС)статок |ИЗ | Per нстрНаконлсння Взаиморасчет! ыС Киш par еыгами.Осипки(&Г1арамстрГкриод. Дог uBOpKoHipaietrra &Д<м овор И Сделка ^ЛСделка» | КАК ВзаиморасчетыСКоптрагентамиОстатки**; он должен устанавливаться следующим образом: Запрос Усгановип>Параме1р< ПарачетрПериод", МоментВречениО); Необходимо обеспечить расчет данных по всем активным записям документов, введенных ДО текущего. Именно поэтому в качестве параметра передается момент времени документа, а не дата документа. Точность реквизита «Дата» - дата (минимальная дробность - секунда). А у момента времени - дата и ссылка. То есть, если есть несколько документов с одной и той же датой система за счет метода МоментВремени() точно определит - кто из них первый, кто второй, кто - следующий. Замечание: обратите внимание на применение условий отбора данных по значениям измерений именно за счет параметров виртуальной таблицы уже при ее построении. Это обеспечивает большую скорость построения запроса, нежели применение ГДЕ. 121
Прикладные объекты Как определить количество документов и количество разныхзначений реквизита в таблицезаписейдокумента? По данным документа «РегистрацияПростоевВОрганизации» ВЫБРАТЬ КОЛИЧЕСТВО Pct ксграцняНроскхгвВОрганнзации.Ссылка) КАК Случаев. КОЛИЧЕСТВО РАЗЛИЧНЫЕ РегмсграпмяПростосвВОрганигаиии.ФизЛицо) КАК Работников ИЗ Документ PuiHcipaunallpocrueBBOpi энизодми КА К Регистрация Простое» ГК >рганизапии ГДЕ < Pei неграцияПроскх’вВОр! анмзации.Проведен) Источником является таблица документа «РегистрацияПростоевВОргнаизации». В качестве выходных полей получим значения агрегатной функции КОЛИЧЕСТВОО по отношению к полям «Ссылка» и «ФизЛицо». Причем подсчитываются только различные значения поля «ФизЛицо». Поскольку группировочные поля не указаны, результатом запроса будет таблица, состоящая из одной строки. 122
Документы Значения этой строки по каждой из колонок и дадут требуемые данные. В последовательность «ПартионныйУчет» добавлено измерение «Организация». Как теперь получить данные по границам последовательности для каждого значения этого измерения? Для получения таблицы значений, в первой колонке которой будут указаны границы последовательности, а в последующих - значения измерений - можно применить метод последовательности ПолучитьГраницы(): Таблиц*!"ранни = Последовательности . ПартноннынУчст .Получить! раницы('Организация Для Каждою СтрокаТаблицыГраннц из ТаблнцаГраниц Цикл Ор1анизаиня - СгрокаТаблниыГраииц.Ор1аниадция‘. ДятаГП = СтрокаТаблицыГраннц.! раница-Дага: Ссылка! !! “ СтрокаТаблицы! ранни Граница.Ссылка: КонецЦикла; В качестве параметра методу достаточно передать название измерения (если нужно несколько - можно через запятую). Далее в цикле перебираем полученную таблицу значений, считывая данные из колонки «Граница» и колонки «Организация». Замечание: если границы нужны не все (по организациям), а только наименьшая из них - лучше применять метод ПолучитьГраницу(). Он возвращает уже не таблицу, а именно - момент времени. 123
Хранение сведений Ф Как добавить запись в непериодический независимый регистр сведений? Для непериодического регистра сведений: Создаем набор записей нашего регистра сведений. Далее применяем отборы по нужным полям. Как правило - по измерениям, входящим в основной отбор. Создаем новую запись, заполняем ее поля. Записываем новый набор записей с замещением всех записей, соответствующих отбору. Параметр «Замещение» метода Записать() по умолчанию имеет значение Истина. Для чего нужно замещение? Дело в том, что в любом регистре запись с конкретным ключом записи всегда уникальна. Для непериодического независимого регистра сведений ключом записи является конкретная комбинация значений измерений. То есть запись с определенной комбинацией значений измерений может присутствовать только в единственном экземпляре. Попытка 124
Хранение сведений записать новую запись с тем же набором значений измерений привела бы к ошибке. Кроме того, в подобной работе можно удариться в другую крайность. Если не применить отбор, то при записи система попытается заместить все существующие записи регистра. В результате, добавляя новый набор записей с замещением, - мы бы удалили все ранее введенные записи регистра! ф Как считать содержимое непериодического независимого регистра сведений? «СобственныеКонтрагенты»? НабнрЗа писем я Pei нс грыСведеним Собствен н ыеКонтрш ен гы .С<лдатьНэборЗаписсй(»; НаборЗаписем. Прочитать!); И Перебрать записи в цикле .. Для Каждого Запись из НаборЗаписей Цикл РсгистрКонтрагснт = Запись. Контрагент; РегистрВмдСвязн - Запись.ВидСвязи; РегистрОбъскт - Запись.Объект: КонецЦикла //... или выгрузить записи в таблицу значений. ТэблицаЗаписей = НаборЗаписем. Выгру ипЫ г. Сначала создаем переменную «НаборЗаписей», в которую считываем все записи регистра. Считанные записи можно выгрузить в таблицу значений или перебрать в цикле перебора коллекции. Внутри цикла переменная «Запись» предоставит доступ к самой записи. Например, для считывания содержимого полей записи. Кроме того, эти же данные можно получить посредством запроса со следующим текстом: ВЫБРАТЬ ИЗ РегнстрьК ведений.СобспичтысКонгрягекты В дальнейшем результат выполнения запроса можно также выбрать или выгрузить на таблицу значений. 125
Прикладные объекты (D Как удалить все записи из независимого регистра сведений? 11<1борЗаг1нссн = РегнстрьК ведений. I орговосОбиру лованиеСoua i ь! {вбор Записей!): НаборЗаписей.Записать! I. Создаем переменную «НаборЗаписей» как набор записей регистра сведений. Поскольку мы не прочитали данные из регистра - в этот момент это пустой набор записей. Записываем новый набор записей (пустой) с замещением всех предыдущих записей (по умолчанию параметр «Замещать» метода Записать() имеет значение Истина). Замечание: данную технологию можно применять только для регистров сведений с независимым режимом записи. О Как удалить записи независимого регистра сведений с отбором по конкретной организации? Структура независимого регистра сведений «ОбъектыСтроительстваОрганизаций» следующая: --------— --------- ' I 1 ' Набор Запис ей Pet ист рыСвсдений .ОбъсктыСтроитс.тьстяаОргани ганий .Со1латьН1ЮорЗаписен(); 11 аборЗал ис ей. Отбор. Ор! анн шцня.Уст ановиi МУ даляемаяОргани заиия К Набор Записей. ЗанисагМ); 126
Хранение сведений Создаем переменную «НаборЗаписей», устанавливаем для нее отбор по значению организации равный «УдаляемаяОрганизация». Кстати, отбор набора записей регистра всегда может устанавливаться только на равенство. Далее записываем полученный пустой набор записей с замещением. В результате все записи, соответствовавшие отбору, будут замещены пустым набором записей. Замечание: данная задача не может решаться без комплексного рассмотрения вопроса устойчивости и целостности базы данных, поскольку на данные регистра могут быть «завязаны» учетные механизмы конфигурации. © Как добавить запись в периодический независимый регистр сведений? Для периодического независимого регистра сведений так же актуально все сказанное про непериодический регистр сведений (см. вопрос «Как добавить запись в непериодический независимый регистр сведений?» на странице 124). Только по другому строится ключ записи - добавляем еще один отбор по полю «Период». f К-чрс Ч Реквизиты НаборЗалнсеЙ = РегнстрыС лепений. Курсы Вал ют.Сотлатт.Набор-ЗаписейО; НаборЗш1МССЙ.Огбор.Вд.1>ота. Установить! Текущая Валюта); Набор Записей. Отбор. Периол.Установнты Текущая Дата); НовЗапнсь = НаборЗапнсей-Добавитц); НпвЗапнсь.Валюга = ТскушаяВалютэ; НовЗапнсь.Период ТекущаяДата; Нов Запись. Курс ® Теку щиЙКу рс: НояЗапись.Кратность = Текущая Кратность; Набор Зшшсей.ЗшшсатМ Истина); 127
Прикладные объекты ф Как прочитать (изменить) записи в периодическом независимом регистре сведений? Отличие технологии чтения (изменения) записей периодического регистра сведений от непериодического только в работе с полем «Период». В примере ниже представлен вариант чтения данных периодического регистра сведений «Валюты» на дату «ДатаЗаписи», сообщение данных полей каждой записи и обнуление значения курса попавших в отбор записей: НэСюрЗяоисен = Pci нстрыСвсденин.Валюты.( онагьНаСч^рЗаписсйО; II аборЗаписсй X >т€чф. 11сриод. У стэновить( ДатаЗап нс । О; НзбстрЗаписей.Прочитать! i; Для Каждого Запись Из ПаборЗаписей Цикл U 41 симе и сообщение данных нолей записи. Сооб|цмть((’трока(Запис1..Псрнол> + " " ♦ Строка! Запись. Валюта) + " * + Строка! Запись. Курс I); // Изменение данных полей записи. Запись. Курс » 0*. КонспЦнкла; НаборЗапнсей.ЗаписапХ). ф Как удалить записи в периодическом независимом регистре сведений? Удаление всех записей периодического независимого регистра сведений выполняется так же, как и для непериодического независимого регистра сведений: I (аборЗаписен РегмстрыСведенкй.КурсыВалю!. Солдат ь! 1аборЗаниссй(); I (аборЗапнсей.Записать! К 128
Хранение сведений Создаем переменную «НаборЗаписей» как набор записей регистра сведений. Поскольку мы не прочитали данные из регистра - в этот момент это пустой набор записей. Записываем новый набор записей (пустой) с замещением всех предыдущих записей (по умолчанию параметр «Замещать» метода Записать() имеет значение Истина). Замечание: данную технологию можно применять только для регистров сведений с независимым режимом записи. Как в периодическом независимом регистре сведений «КурсыВалют» удалить все записи по валютам с наименованиями «EUR» и «USD», период которых меньше 01 января 2005 года? Один великий скульптор на вопрос «Как вам удалось создать такой шедевр?» ответил: «Отсек все лишнее!». Примем на вооружение метод, но... перевернем его. В данной задаче у нас просят отсечь все лишнее, а решить ее можно - оставив все нужное. Поэтому сначала получим таблицу записей, которые необходимо оставить. Поскольку условий несколько, да еще и не все они на равенство - оптимальнее это сделать при помощи запроса. Следующий запрос даст нам желаемое: Запрос = Новый Запрос: Запрос. Текст » "ВЫБРАТЬ |ИЗ | РегистрСведеннй.КурсыВалют КАК КурсыВалют |1 ДЕ | (КурсыВалют.Период >= ДАТЛВРЕМЖ2ОО5. 1.1) | ИЛИ | НЕ< КурсыВалютВалюта Наименование ПОДОБНО '"USD"") I И | НЕЖурсыВалют Валюта Наименование ПОДОБНО ""EUR""))"; Источником данных для запроса послужила таблица записей регистра. Были применены отборы, чтобы в результат попали записи, для которых период более или равен 01 января 2005 года или наименования не «USD» и не «EUR». Обратите внимание, при составлении условия по периоду, чтобы не пользоваться параметром запроса, прямо в тексте 129
Прикладные объекты запроса применили литерал даты ДАТАВРЕМЯО, в котором части даты указываются в «обратном» порядке: год, месяц, порядковый номер дня в месяце. Результатом запроса будет таблица, в которой по каждой записи заполнены все поля регистра сведений «КурсыВалют». TaG.iHiuOcraiuifteMbixJiiniK'efi» Зшрос.ВыполнитъО.Выгруз1пъО; НзйорЗаписсй = Регистры!ведений КурсыВадкн СаштьНжкфЗапнсей1); Набор3апнсей.3агру-ипъ< Т аотнца! )сгав.твсмы ^Записей); НаборЗаписеП.Зап11сять(); Далее запрос выполняем, выгружаем результат в таблицу значений «ТаблицаОставляемыхЗаписей». Создаем переменную «НаборЗаписей», тип значения РегистрСведенийНаборЗаписей. КурсыВалют, выгружаем в нее таблицу значений «ТаблицаОставляемыхЗаписей». Поскольку сама таблица была получена из регистра - то названия ее колонок совпадут с названиями полей регистра - а значит, загрузка пройдет успешно. Далее записываем заполненный только нужными записями набор записей в регистр с замещением его исходных данных (как Вы уже помните, параметр «Замещать» метода Записать() по умолчанию имеет значение Истина). Замечание: данная задача не может решаться без комплексного рассмотрения вопроса устойчивости и целостности базы данных, поскольку на данные регистра могут быть «завязаны» учетные механизмы конфигурации. 130
Хранение сведений Как прочитать данные, актуальные на определенную дату, из регистрасведений «Курсы валют» с отбором по нескольким валютам (отборпоизмерениям)? Для решения данной задачи удобнее всего использовать запрос. Например: Запрос » Новый Запрос; МвССИвВалюг = Новый Массив; Масси нВхтю г. Добивн гы Ba. ixxia 1); Масс ивВалюг. Добавить! Валюта?): Запрос.Установить! 1арамстр(~М&ссивВалю|”, МассннВанот); Запрос.Установить! 1аромст|М "Дата! 1олучення", Дата! 1олучсния»: Запрос.Текст = " |ВЫБР/\ТЬ | ВммушСрезПоследних.Валюта. | ВалютыСрстНослслних.Курс |ИЗ | Pet ис грСвсденнй.КурСыВалют.СрсзПослбдпнхС&ДатаПалучеиия. В Xi юга В (&МассивВ«ыкл 1) КАК ВалютыС рез Последи их"; ТаблппаКурсов = Запрос. ВытюлнитьО.Выгрузить(); Создаем запрос. В качестве параметров запроса передаем массив валют, по которым мы хотим получить данные и значение даты, на конец которой нужно получить срез последних. Запрос строим по виртуальной таблице «РегистрСведений.КурсыВалют.СрезПоследних» регистра «КурсыВалют». В качестве параметров виртуальной таблицы указываем дату построения и условие по измерению валюта (значения измерения должны входить в переданный массив). 131
Прикладные объекты Как поменять период у записей периодического независимого регистра, соответствующих ряду условий? В периодическом независимом регистре сведений «ОтветственныеЛицаОрганизации» все записи, касающиеся организации с наименованием «Грули-трейдинг», период которых меньше 01 января 2005 года необходимо перенести на 01 января 2004 года. Но записи с указанием должностей «Продавец» и «Кладовщик» должны остаться на своих местах. Структура регистра следующая: Измерение «СтруктурнаяЕдиница» имеет тип значения СправочникСсылка. Организации. Для периодического независимого регистра сведений модифицировать (и удалять) записи можно только посредством объекта РегистрСведенийНаборЗаписей. <имя> или РегистрСведенийМенеджерЗаписи. <имя>. И в том и в другом случае понадобится работать с отборами по периоду (обязательно) и по измерениям (желательно, в зависимости от контекста задачи). Поэтому сначала получим таблицу записей, которые подлежат модификации. Поскольку условий несколько, да еще и не на равенство - оптимальнее это сделать при помощи запроса. А потом, перебирая результат запроса, добьемся требуемого результата: Процедура Замена! 1ериода( > Запрос = Пиний Запрос; Запрос.Текст = ’ВЫБРАТЬ | О1встстве11ныеЛнцаОр1а11ияиши Период. | ОтястствсннысЛицаОрган1вации.Структ)рнаяЕдини1и. | (Ji ве1СтиенныеЛицаОр| анизанни ОгветсгвенноеЛицо |ИЗ | Регистре 'яс дениЙ.(Угветстяен н ы cJ 1 и 11а(Эрг ан и ин ши 132
Хранение сведений КАК От встствеп > i ыеЛ и i кЮрганшаиии 1ГДЕ | ОтвсгсюенпысЛицаОргипишимм. Период <= ДАТАВРЬМЯ(2005, I. I) I и | От'впственныеиПии.аОргаии 1ацнн.Структ)'рнаяЕл111нн11а.Нанмсш>вание ПОДОБНО Трупп-Трсйлинг’* I И | (01ъстсгвеннысЛннаОрга1!1па11нн.До.1жность.Наименование ЕСТЬ NULL ИЛИ | НГ(ОтветствекныеЛ||||аОр|диптанк и. Должность Наименование ПОДОБНО "Придавсц” ИЛИ ОтветственныеЛииа()рганитапни Должность.11аимсноаанис ПОДОБНО **Кладовшнк**Н*; Результат = Запрос.Выполнить^); Выборка = Результат. Выбрал ь(); Запись = РегнстрыСвсдсний Otbctci всннысЛ ица( )рганнза1 uni .СотдатьМснеджсрЗаписиО; Пока Выборка.СлслукмцийО Цикл Запись.!! ер иод = Выборка.Пернод: ЗалисьСтруктурнаяЕдипица = Выборка.СтруктурнаяЕдннниа: Залмсь.ОгвстствспнсмхПицо — Выборка. От астственноеЛицо; Запись.Причн га i ь( ); Бел и Запись. Выбран I) Тогда Запись. Период = Дата (2004.1.1); Запись. Записать^); KohcuEc.ih; КонецЦикла; КонсцП роцедуры; Результат запроса - таблица, в которой по каждой записи заполнены все поля измерений из регистра и поле «Период». Именно эту информацию мы используем для получения каждой нужной записи. Источником данных для запроса послужила таблица «РегистрСведений.ОтветственныеЛицаОрганизации». Были применены отборы так, чтобы в результат попали записи с периодом менее 1 января 2005 года, наименование структурных единиц, в которых - «Групп-трейдинг», а наименования должностей не относятся к «Продавец» и «Кладовщик». Кроме того, необходимо позаботиться о 133
Прикладные объекты случае, когда должность вообще не указана - то есть ее наименование имеет значение NULL Такие записи тоже нужно будет переносить. Запрос выполнен, далее перебирая его результат и посредством менеджера записи регистра «ОтветственныеЛицаОрганизации» добиваемся желаемого. При каждом проходе цикла считываем очередную запись, предварительно указав значение ее поля «Период» и полей измерений. Далее меняем значение поля «Период» у считанной записи и записываем ее в регистр. Как «сделать периодическим» реквизит уже заполненного справочника? У справочника «Проекты» есть реквизит «Ответственный» (тип значения - СправочникСсылка. Пользователи). Необходимо обеспечить в системе возможность «перезакрепления» проектов за ответственными с сохранением истории значений с точностью до дня. Для хранения истории значений периодических данных в системе «ЮПредприятие 8.0» используют регистры сведений. Поэтому для красивого решения нашей задачи понадобится выполнить следующие шаги: Создать в системе периодический регистр сведений «ЗакреплениеПроектов». Создать и выполнить обработку, которая заполнит новый регистр информацией из уже заполненных элементов справочника. Проконтролировать и обеспечить корректность работы всех механизмов системы, использовавших реквизит «Ответственный» справочника «Проекты». Для поиска таких механизмов можно, например, воспользоваться командой «Правка | Глобальный поиск ...». Корректность необходимо проверять по поводу последующего хранения информации об ответственных в периодическом регистре сведений и по поводу последующего удаления реквизита «Ответственный» из справочника «Контрагенты». Удалить реквизит «Ответственный» из структуры справочника «Проекты». Обеспечить удобство для пользователей визуализации, ввода и редактирования информации об ответственных за проекты. В самом простом для разработчика случае - можно просто убедиться в доступности кнопки «Перейти» в командных панелях формы списка и формы элемента справочника «Проекты». Рассмотрим первые два шага более подробно: 134
Хранение сведений 1) Создание периодического регистра сведений. Если не требуется регистрировать факты закрепления/перезакрепления посредством специального документа - режим записи регистра будет «Независимый». Периодичность регистра определяется спецификой бизнес-процессов автоматизируемого предприятия, в нашем случае - «День». Поскольку по каждому проекту в конкретный момент времени будет один ответственный — то структура регистра будет следующей: □ В 1а»репле*меЛроектов р . Измеряем Тип значения измерения «Проект» - СправочникСсылка.ПрОбКТЫ. Не забудьте указать для данного измерения свойство «Ведущее», тогда при удалении проектов будут автоматически удалены и соответствующие им записи регистра сведений. Тип значения ресурса «Ответственный» - СправочникСсылка. Пользователи. 2) Обработка заполнения регистра по существующим данным справочника. Код этой обработки может выглядеть следующим образом: Запрос = Новый Запрос*. Запрос Текст = "ВЫБРАТЬ | &ДзтаУстановки КАК Период, । Проекты.Ссылка КАК Проект, | Проекты.Ответственный |ИЗ | Справочник. Проекты КАК Проекты |ГДЕ | (НЕ(Проекты.'>го1 руина)) И (НЕсПроскты.Отвегственный = &Опмлпвенный)Г; ЗйПрос.УстановитьПараыетрС <31 ее клеенный’’. Справочники.! !ольюватс.г1И.11устаяСсылкэ()); Запрос. Уста1н>в1ггьПараметр(’'ДатаУс1ановкии. Дат Ж 2(ММ), 1.1))*, Гаи. i и цд Резу.плат » Запрос. Вы(юлнить(). Выгрузиi М); НаборЗаписсй Pei истрыСвсденнй-ЗакрепленнеПроектов.СоздатьНаборЗапмсейС); НаборЗаписей Загрузи i мТаблицаРезу н.тат); П эборЗалисей. Записал Ы )*. 135
Прикладные объекты Имеет смысл выполнять обработку только по элементам справочника «Проекты» (по группам не нужно) и только по тем элементам, у которых заполнен реквизит «Ответственный». Получение необходимой информации организуем посредством запроса. Источником данных для него будет таблица «Справочник.Проекты». Применяем вышеописанные условия. Состав и псевдонимы выходных полей запроса делаем соответствующим составу и именам полей записей регистра. Поскольку невозможно в периодический регистр сведений внести записи с пустым значением поля «Период», и в справочнике не хранилась информация, с какого момента были закреплены ответственные за проектами - через параметр запроса назначаем значение периода заведомо предшествующее началу работы с нашей базой. Результат выполнения запроса выгружаем в таблицу значений «Т аблицаРезул ьтат». Далее создаем переменную «НаборЗаписей» соответствующего типа значения. Поскольку имена полей записей регистра совпадают с названием колонок таблицы - таблицу значений «ТаблицаРезультат» загружаем в набор записей регистра «ЗакреплениеПроектов». Далее записываем заполненный набор записей. Обратите внимание, что в нашем случае набор записей регистра создавался без отборов и у метода Записать() значение параметра «Замещать» было опущено (значит, по умолчанию равно Истина). В результате, даже если какие-то записи существовали в регистре до начала выполнения обработки, - они будут полностью замещены новыми, сформированными обработкой. Подобное действие (замещение всех записей регистра) возможно только для регистров сведений с режимом записи «Независимый» (то есть, не подчинены регистратору). 136
Хранение сведений ф Как добавить записи в регистр сведений, подчиненный регистратору? Если регистр сведений подчинен регистратору, то для добавления записей в такой регистр необходимо создать набор записей этого регистра с установленным отбором по нужному регистратору, заполнить этот набор записей и записать его: По-умолчанию запись выполняется с замещением, т.е. существующие записи этого регистратора в регистре сведений будут удалены. Для того чтобы добавить записи к существующим записям регистратора, необходимо указывать значение ЛОЖЬ параметра метода Записать() набора записей. При этом необходимо позаботиться о том, чтобы значения измерений добавляемых записей были уникальны для записей данного регистратора в регистре сведений, иначе запись выполнена не будет: 137
Прикладные объекты © Как прочитать (изменить) записи в регистре сведений, подчиненном регистратору? Для того чтобы прочитать данные регистра сведений, подчиненного регистратору, необходимо создать набор записей, установить отбор по регистратору и затем выполнить метод Прочитать() набора записей регистра сведений. После этого можно перебрать записи набора в цикле и выполнить необходимые изменения. В примере ниже представлен вариант чтения данных регистра сведений «ЦеныНоменклатуры» для документа «ВыбранныйРегистратор», сообщение данных полей каждой записи и обнуление процента скидки для записей этого документа в регистре сведений: НаборЗапнсей - РегнстрыСаедсний ЦеныНоменклатуры.) издать! 1аборЗаписей)); I 1аборЗапнсей.Огбор.Регисгрй тор.Установи ЩВыбраиный Регистратор); 11аоорЗаписсн.|1рочитзть)); Для Каждого Запись Из НаборЗапнсей Цикл И Чтение и сообщение данных полей записи. СообщитМСтрокаСЗапись Период) ♦ " ’ + Строка(ЗаП1<сь ТипЦен! ♦“ "♦ Строка43апнсь.Номепкла тура) + * " + С грека)Запись Цена) + " " + Строка) Запись. Проценте кндкиНанснки)); // Изменение данных полей записи Запись.ПроцентСкндкиНаценки = О; КонецЦик.за, 11а6ор3аписей.3апнсать) >; 138
Хранение сведений ф Как удалить записи из регистра сведений, подчиненного регистратору? Прежде всего, следует оценить необходимость решения такой задачи. Если записи в регистр попадают при проведении регистраторов, и у документов- регистраторов свойство «Удаление движений» имеет значение «Автоматическое удаление движений» - то достаточно просто отменить проведение всех регистраторов - и движения будут удалены из регистра. Именно такая картина наблюдается в большинстве случаев. Если же задача заключается в очистке таблицы записей регистра в некоторых регламентных целях, можно поступить следующим образом: Запрос « Новый Запрос; Запрос.Тсксл = н |ВЫГ>РАТЬ | ЦеныНоыеиклатурыКонтршсигов.Pei исгр<а юр |ИЗ | РегистрСвсдсний.ЦсныНоменюшурыК'онтраггнтов КАК ЦсныНомснклатурыКоптрагснюв ; Результат = Запрос Выполни iM); Выборка » Результат Выбриты); НабсрЗаписсй = РсгистрыСвсдснин .ЦепыНоменклатурыКонтрагситов .СозлатьНаборЗаписей(): Пока Выборка. Следую щи Й<) Цикл Набор Зап и сей .Отбор. Регистратор. У становитц Выборка. Регистратор): НаборЗаписсй.ЗаписатЦ); КонецЦикла. Сначала запросом получаем выборку всех документов, являющихся регистраторами для нужного регистра. Далее создаем набор записей по данному регистру. В цикле перебора выборки из результата запроса - устанавливаем отборы для набора записей по нужным регистраторам и записываем пустые наборы записей в регистр с замещением старых наборов. 139
Бухгалтерский учет © Как в регистре бухгалтерии сформировать проводки? Допустим, требуется сформировать следующую проводку для операции оплаты поставщику: Счет дебета 60.01 Контрагент LIGHT Договор Основной договор Документ Документ расчета с контрагентами №2 Счет кредита 51 Банковский счет р/с завода Инвестспецбанк Статья движения денежных средств Оплата за оборудование Сумма 300000 Содержание Оплата поставщику Номер журнала БК Согласно этим данным, проводка должна быть сформирована по регистру бухгалтерии «Хозрасчетный»: В-Щ Хозрасчет»»* : О Измерения I— L, Организация •— L* Валюта Э~ Ресурсы I— I Сумма |— | В алютнаяС1мма | Колтчестоо Eg Реквизиты — Содержа»** 1—— НомерЖусмала Данную задачу можно решить следующим образом: // Задать выбираемые значения. Выбран11ЫЙС>г»сгсг1и:1111ый = Справочники .Пользователи НайтиПоНанмснованикХ "Иванцова"): Выбранный Контрагент = Справочники. Контрагенты. Най гнПоКоду( "00027"); 140
Бухгалтерский учет ВыбранныйДоговор = Спра1ючиики.ДшоворыКонтра|е11!ов НайтиПоКоду!"OOOI3"); ВыбранныйДоку мент = Документы .ДокумснтРасчетовСКонтр агентом .11айтиПоНомеру(2, '20050ЮГ); ВыбранныйСчсг = Справочннкл.БаиковскиеСчета.НайтиПоКодуСООООГ); ВыбраннаяСтатья - Справочники .СтатьиДвижепияДеиежныхСредств Найги11оКодуГ0(МХ)2"); Выбранная()р>ани гания Справочники.Органнгании Найти! |<>Коду("0()001*); ВыбраннаяВалюта = Справочинк1|Валюты.Найти11оКоду(8Ю); И Создать будущий регистратор. ДатаЗаписи = ТскушаяДата)); Доку мент = Докумснты.О||еранияБух.СоздатьДокумент(); Документ Даш - ДатаЗаписи; Докумсят.Ортанизания = ВыбраннаяОрганиздния: Документ Ответственный = ВыбранныйОтветсгвениын; Документ.Содержание = "Оплата поставщику": Доку мент. Записать!); И Создать набор записей НаборЗапнсей = Регист рыБу хгалтерии.Хо зрасчетный.СотдлтьНаборЗаписей!); НаборЗаписей.Отбор.Рсгистратор.Установить(Докумснт.Ссылка>; Движение = НаборЗапнсей .ДобавитьО; Движение. Perистратор = Документ.Ссылка; Движение.Период - ДатаЗаписи; // Заполнить счет дебета. Движение.СчетДт = П.1аиыСче1ов.Хаграсчетный.НаЙ1мПоКоду(”60.01*): // Заполнить аналитику счета дебета. Двггжение.СубконтоДт.Когттрагенты = ВыбранныйКоитрагент; Движение.СубконтоДтДог опоры = ВыбранныйДоговор; Движе11ие.СубконтоДт.ДокумситыРасчетовСКонтрагентамн= ВыбранныйДокумен i; // Заполнить счет кредита. Двнженне.СчетКт = ПланыСчегов.Хозрасчетный.НайтиПоКоду("5Г); // Заполнить аналитику счета кредита Движение.Субко1поКт.Банковскне( чета = Выбраним йСчет; Движенне.СубкоитоКт.Стат ьиДвижснняДенежныхСрелств = ВыбраииаяСтатья: И Балансовое измерение. Двнженне.Организания = Выбран наяОрганн гацня; // Балансовый ресурс. Движеине.Сумма = 300000; . 141
Прикладные объекты // Реквизиты. Дннженис.НомсрЖурнала = "БК"; Двнженне.Солержание "Оплята поставщику И Записать набор записей. НаборЗаписсй.'ЗаписатЫ); Внести информацию в регистр бухгалтерии без привязки к документу-регистратору невозможно. Поэтому, например, в составе типового решения «Бухгалтерия предприятия» для работы с так называемыми «ручными операциями» существует документ «ОперацияБух». Его задача - выступать в качестве регистратора в подобных случаях. Итак, сначала создаем новый документ «ОперацияБух», в качестве его даты прописываем, например, текущую дату, записываем данный документ в базу данных. Далее создаем объект набор записей по нужному нам регистру. Устанавливаем отбор по созданному регистратору. После этого добавляем новую запись к набору записей и заполняем ее поля данными. По окончании цикла выполняем запись сформированного набора записей. Как получить остаток по счету? Получим остатки по счету «Товары на складах» в разрезе организаций и товаров (Субконто 1). Для этой цели можно использовать следующий запрос к виртуальной таблице остатков регистра бухгалтерии «Хозрасчетный» : Запрос = Новый Запрос. Запрос. Текст = ” (ВЫБРАТЬ | ХозрасчетныйОсгаткиСубконто!. | ХозрасчстныйОстатки.Организация, | ХозрасчетыйОстатки.СуммаОстаток, | ХозрасчетныйОстятки КоличествоОстаток |ИЗ | РегисгрБухгалтерии Хозрасчет ыЙ.Огга1ки<&Период. Счет ЛСчст..) КАК Хозрасчетный Остатки Запрос.Ус1аноангьПара.метр("Период", КонецДня(ДатаОт,1с,П|)); Запрос.УстановитьПарамстр( Счет’, План ыСчетов. Хозрасчетный I оварыНаСкладах); РезультатЗапроса = Запрос ВыполнитьО; 142
Бухгалтерский учет В качестве параметров запроса устанавливаются необходимый счет («ТоварыНаСкладах») и дата, на которую надо получить остатки. Как получить обороты по счету? Получим обороты по счету «Товары на складах» за указанный интервал дат (переменные «НачПериода» и «КонПериода»). Для этой цели можно использовать следующий запрос к виртуальной таблице оборотов регистра бухгалтерии «Хозрасчетный» : Запрос ж Новый Запрос; Запрос. Такт » "ВЫБРАТЬ | Х|УзрасчстныЙОбороты,СуммаОборотДт. | ХозрясчстныйОоороты.Су ммаОборотКт |НЗ | РсгистрБухгалтсрии.Хоэрасчстный.Оборотьц&НачПериода. & Кон Периода, Период, Счет = ЛСчст,,,,) | КАК Хозрас четны ИОбороты"; Запрос Установить Параметр!"1!ачПериода<*. 11ач1 криодак За 11 рос. У crai юв и i ь 11 ара м с i р( ” Koi 1 11 ери од а". Коп П ери о д а ): Запрос. Установить! 1эрамстр(иСчст’’, ПланыСчегов.Хофасчетный. Товары! 1аС кладах г. Резу лыат'Запроса = Запрос.Выполнить!); В качестве параметров запроса устанавливаются необходимый счет («ТоварыНаСкладах») и даты начала и конца периода, за который нужно получить обороты. Как получить остатки по счетам? Необходимо получить данные о валютных активах компании в разрезе счетов и валют. Для решения задачи можно использовать следующий текст запроса: ВЫБРАТЬ | ХозрасчегныйОстагкм.Счет. | ПРЕДСТАВЛЕНИЕ!Хозрасчет и ыйОстаткм.Счет), | ХозрасчетныйОстагки.ВалютнаяСуммаОстагтокДт КАК ВалютнаяСуммаОстагокДт. | ХозрасчстныйОстатки.Счст.Порядок КАК СчетПорядок, | Хсирас четны йОстатки. Валюта КАК Вал юта. I П РЕ ДСТА ВЛ Е НИ Е (Хочросче г и ыЙОс татки. Вал ю i а) lira | РегнстрБухгалтсрин.Хозрасчетный.Остатки(&Дата. 143
Прикладные объекты Счет.Валютный И Счет. Вил = ЛАктивный.,) КАК ХсирасчетныиОствтки (У ПОРЯДОЧИТЬ ПО | СчетПорядок (ИТОГИ | СУММАМВалютнаяСуммаОстатокДг ) |ПО | Валюта**; Необходимо определить следующие параметры: Запр1К.Усга>ювигьПараметрГАкт11П11ый*. ВидСчета Активный): Запрос.УсгановшьПарампрС'Дага'. Дата)*. Фактически идет обращения к дебетовым остаткам счетов являющихся активными и по которым ведется валютный учет. Как перенести остаток со счета на счет? Необходимо реализовать механизм, позволяющий списать дебиторскую задолженность по указанному контрагенту и договору взаиморасчетов с ним. Запрос = Новый Запрос; Запрос Текст = "ВЫБРАТЬ | Хозрасчет ныйОстатки .Сум маОс гат окДт (ИЗ | Рет истрБухгал1срии.Хо<рэсче1ный.()статки(&11 ср иод. Счет » &Счст.. Субконто I = /^Контрагент И Организация = ^Организация И Субко»гю2 ж опор) | КАК ХозрасчипныйОстатктГ //Считаем что на счете ведется аналитика только в разрезе контрагентов // И ДО! опоров Запрос.Установить! 1арамстр( ”11срнодм, 11сриод 1); Запрос.Уст ановитьПараметрС'Кон грат епт*. Кон трагент), Запрос.Установит ьПараме1р< "Договор”, Договор); Запрос Установить! lapaMei р( "Орг ан и шния, Организация I. Запрос. Установить! 1арамстр< ’’Счет". П.за и ыСчетов. Хозрасчет нын Расчет ыСПокупателнми Выборка = %трос.Вы1юлнитьГ).ВыбрвтьО; 144
Бухгалтерский учет Если Выборка.Следующий^ t Тогда Документ = Докумен 1ы.ОпсрапияГ)у\ СозлагьДокчмептО; Докумснг.Дата я РабочаяДата; Доку MCHi.Opi анн шция = Организация; Документ.Содержание = "Погашение дебиторской задолженности"; 11рошэдка = Документ,Движения Хозрасчетный .Добавить!); 11 роводкаС чет Дт = 11. ia ныС четок. Хозрасчетный. Расчет ыСПокупателями. 11рооддка.СчстКт = ПланыС чстов.Хозрасчстный.11рочисРасхолы; Проводка СубконтоДт.Контрагенты Контрагент, Проао л ка.СубконтоДт. Договоры = Договор; 11роаодка.Сумма = Выборка.СуммаОстагикДт: Докумснт.СуммэОпсрацни = Выборка.СуммаОстэтокДт; Форма Доку мент.ПолучитьФормуО; Форма. Открытье). КомспЕсли; В обработке используется документ «ОперацияБух» являющийся по смыслу ручной операцией. С его помощью можно сформировать любую проводку. Как найти первый документ, приведший к появлению кредитового остатка на счете? Применение виртуальной таблицы «ОстаткиИ Обороты» с соответствующим заполнением параметра «Периодичность» позволяет решить задачу: НЫЬРАТЬПЬРВЫЕ I ХозрасчетнынОстаткиИОбороты,Регистратор КАК Регистратор ИЗ РсгнстрБухпьпсрии. Хозрасчетный.Ост аткнИО6оро1ы(&ДатаН. ЛДатаК. Регистратор,. С чет = &Счег,, » КА К Хозрасчет! i ы йОс i и гк и И Обороты ГДЕ ХозрасчетныйОстажиИОборспы.СуммаКонечиыйОстатокКт > О УПОРЯДОЧИТЬ ПО X оз рас ч г г н ы й Ост а i км И Оборо i ы. П ер и од. Регистратор Используем виртуальную «РегистрБухгалтерии.Хозрасчетный.ОстаткиИ Обороты» таблицу за 145
Прикладные объекты определяемый пользователем период (ДатаН и ДатаК), с периодичностью по регистратору и отбором по указанному счету. Накладываем условие - кредитовый остаток счета больше нуля. Упорядочиваем результат по периоду, затем по регистратору. Это важно потому, что по умолчанию таблица упорядочена не будет. Кроме того, обратите внимание - первичен в упорядочивании период, и только при совпадении периодов дальнейшее упорядочивание идет по регистратору. Посредством ключевых слов ВЫБРАТЬ ПЕРВЫЕ 1 обеспечиваем, чтобы в результат запроса попала только первая запись. Как выбрать все счета, в аналитике которых присутствуютл ибо вид субконто «Контрагент», либо вид субконто «Договор»? Данную задачу можно решить посредством запроса: ВЫБРАТЬ Хозрасчет ныйВнлыСубконто.Ссылка как Счет ИЗ ПланС^стод. Хозрасчетный. В ид ыСубкоыто КАК ХозрасчегныйВндыСубконто ГДЕ Хо фас че гн ый ВидыСубконто. И ндСу бконто. 11 анм снова и и с В ("Договоры”. “Контрагенты”) Источник - таблица «ВидыСубконто» требуемого плана счетов (в нашем случае «Хозрасчетный»). Выходным полем делаем поле «Ссылка», присутствующее в записях этой таблицы. Накладываем условие отбора на вхождение в список, состоящий из наименований нужных нам видов субконто. В результате получаем счета. 146
Бухгалтерский учет Как выбрать все счета, в аналитике которых присутствуют как вид субконто «Контрагент», так и вид субконто «Номенклатура»? Данную задачу можно решить посредством запроса: ВЫБРАТЬ ХозрасчетыйВидыСубконюСсилка КАК Счет ИЗ ПланСчетов Хозрасчетный.ВидзиСубконто КАК ХозрасчетныйВидыСубконто ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланСчетов Хозрасчетный.ВидыСубконто КАК Хозрасчет» ыйВидыСубкозтто! НО ХозрасчетныйВилыСубконто.Ссылка = ХозрасчстныйВилыСубкоззто!.Ссылка ГДЕ (ХозрасчезныЙВндыСубкон го.ВидСубконзо.Наименошзние = "Контрагенты*) И | (ХозрэсчетныйВидыСубконто! .ВидСубконто.Наименование = "Номенклатура") Выполняем внутреннее соединение двух таблиц «ВидыСубконто» плана счетов «Хозрасчетный» по равенству полей «Ссылка». Посредством отбора в запросе останутся только те записи, у которых поле «Наименование» вида субконто первой таблицы равно «Контрагенты», а второй - «Номенклатура». Выходное поле - «Ссылка». Это ссылки на нужные счета. Как добавить новый вид субконто к счету? Необходимо к счету с кодом «90.01.1» плана счетов «Хозрасчетный» добавить новый оборотный вид субконто «Менеджеры»: тип значения - «СправочникСсылка.Пользователи», признак - «Суммовой». Обычно такая задача решается интерактивными средствами в режиме «1С:Предприяте» или, если счет предопределенный, можно так же в режиме «Конфигуратор». В любом случае сначала надо убедиться, что в состав свойства Тип значения характеристик плана видов характеристик, предназначенного для хранения видов субконто, входит справочник « Пользователи»: 147
Прикладные объекты Если же это необходимо все же выполнить именно в обработке, можно сделать и так: ВидМене/икеры « ПланыВндовХлрактсрнсгик . ВидыСубконт оХшрасче жые .НайтиПоНаименовапиюСМенеджеры", Ист ина); //Добавить новый вид характеристик Если ВмдМенеджеры.Пуст&я() Тогда ВилМенелжеры = ПллныВндовХарактеристмк . ВидыСубконт оХ оз рас чет ныс .СсшатьЭлемси п): ВидМенеджеры.Наименование » "Менеджеры"; В и д Менеджеры,ТипЗначекия = Новый 0|1Исан11еТи1Юв("Справочн11кСсы.7ка-1кх1ьмнш1ели"); ВидМенеджерыЗаиисатЫ); КонейЕсли; // Получить нужный счет. Счет = Пла11ыСчеюв.Хо1расчетный.Най1иГ1оКодуС90.01. Iй); Если (Нс Счст.НустаяО) И (Счет ВндыСубконто.Найти( Вид Менеджеры) = Неопределено) Тогда И Добавить новый вид субконто к счету * ОбъсктСчета = Счет. Получи гьОбъектО; Новы йВндСу бконто = Объект!.'чста.В||дыСубконто.Добавить(); НовыйВидСубконто ВндСубконто = ВидМеиелжеры; НовыйВидСубконто.ТолькоОСюроты = Истина; НовыйВидСубко1ПО.Суммо1юй - Истина; 148
Бухгалтерский учет Сначала пытаемся найти в плане видов характеристик «ВидыСубконто» данной конфигурации найти вид «Менеджеры». Причем поиск осуществляем по полному совпадению наименования. Если такового вида не найдено - создаем новый элемент в плане видов характеристик «ВидыСубконто». Устанавливаем его наименование и тип значения. Записываем. Далее убеждаемся, есть ли в плане счетов «Хозрасчетный» счет с указанным кодом. Если счет есть, и среди его видов субконто нет вида, соответствующего менеджерам, - будем его модифицировать. А значит, нужно сначала получить объект данного счета. Далее добавляем новую строку в таблицу «ВидыСубконто» данного счета, прописываем в ней вид нужный вид субконто, ставим признаки «Суммовой» и «ТолькоОбороты». Замечание: желательно заранее проконтролировать, какое максимальное количество уровней субконто разрешено для данного плана счетов, чтобы не получилось, что добавление нового вида субконто приведет к превышению этого порога. Как из регистра бухгалтерии «Хозрасчетный» получить обороты только по валютным счетам? Структура регистра следующая: т Хозрасчетной L- Орг pfftHpirt I- &мота f Кол*ество - Comp.««ме — НоМфЖфгъШМ 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 Можно воспользоваться запросом со следующим текстом: ВЫБРАТЬ ХозрасчегныйОбороты.Оргаиимиия КАК Opi шишция. Хозрасчстн1.1ЙОбороты.Счст КАК Счет. ХозрасчстныйОборогы. Валюта, ХозрасчетныйОборогы.СуммаОборотДт. ХотрасчетныйОбороты.ВалютнаяСуммаОборсиДт, Хотрасчеп1ыйОбороты.Су.ммаОпор<пКт, Хо арасчетныйОбороты. ВалкггнаяСуммаОборотКт ИЗ РсгистрБухгалтерни.Хотрасчстиый.ОборотьЦ&ДатаНач. ЛДатаКон.. Счет.Валютый,,,, ) КАК ХозрасчетнмЙОбороты УПОРЯДОЧИТЬ ПО Организация, Хоюас четный! Хю роты .Счет. Код Источником является виртуальная таблица «РегистрБухгалтерии.Хозрасчетный.Обороты» с установленными отборами по интервалу дат и признаку счета. В качестве выходных полей указываем счета, значения измерений, дебетовый и кредитовый обороты ресурсов «Сумма» и « ВалютнаяСумма». 150
Бухгалтерский учет Полученную таблицу упорядочиваем по значению поля «Организация» и возрастанию кодов счетов. Как выбрать в регистре бухгалтерии «Хозрасчетный» обороты по «60-ым» счетам, исключив внутренние обороты между ними? Взаимными оборотами в данном случае могут являться случаи зачета авансов, уплаченных поставщику. Решение данной задачи можно построить посредством запроса: ВЫБРАТЬ Хозрасчетом йОборот ы .Счет. X отрасч ет н ы йОбороты С у м ма< ХюротДт. ХотрасчетоыйОборотыСу м маОборотКз ИЗ РегнстрБухталгерии Хозрасчетом Й.Обс1роты{&ДатаНач. &ДатаКон., Счет В ИЕРАРХИИ (&Счет>... НЕ(КорСчет В ИЕРАРХИИ (ЛСчет)). 1 КАК ХозрасчстныйОборспы УПОРЯДОЧИТЬ ПО ХогзрасчстныйОбороты Счет Код Источником будет виртуальная таблица «РегистрБухгалтерии.Хозрасчетный.Обороты», с установленными отборами по интервалу формирования, по счету и по корсчету. Условием по счету ставим вхождение в иерархию параметра запроса «Счет» (в него потом передадим ссылку на 60-ый счет). Условием по корсчету ставим НЕ вхождение в иерархию параметра запроса «Счет». 151
Прикладные объекты Как реализовать метод «красного сторно» для регистра бухгалтерии? Иногда требуется отменить в текущем отчетном периоде операцию, сделанную в прошлом отчетном периоде. Как этого добиться в отношении регистра бухгалтерии «Хозрасчетный»? Для этого можно создать документ «Сторно». В его составе будет реквизит «СторнируемыйДокумент» (тип значения «ДокументСсылка»). Далее, например, при проведении документа «Сторно», делаем выборку записей, связанных со сторнируемым документом и формируем на их основе сторнирующие записи: Процедуре Обработка! 1ровсдсния( Отказ. Нежим) СторнирусмысДвижсния = Регистры Бухгалтерии .Хозрасчетный . В ыбрать! I «Регистратору^ Ст< »рн иру смы й / [оку мент); Пока Ст орнируемыеДвмжеяия.Следующий!) Цикл Проводка = Движения. Хозрасчетный. Добавиты): Проводка. Период = Дата; Проводка.СчегДт СторнируемыеДвижения.СчетДг: Проводка.СчетКт = Сторнируем1.1сДвижения.СчетКг; Для каждого Субкснгго Из СториируемыеДвижения-СубконтоДт Цикл Проводка.СубконтоДт|Субконто.Ключ] = Субконго Значение; КонецЦикла; Для каждого Субкоиго Из СторнируемыеДвиження.СубконтоКт Цикл 11роволка.СубконтоКт| Субконто. Ключ] = Субконто.Значенне. Конец! [икла; ПроводкаВалмнаДт = СторнируемыеДвмжения ВалютцДт; 11роводка.ВалютаКт ( горнирусмыеДвижения Валют:«Кт; Проводка. ВалютнаяСуммаДг = - СторннрусмысДвнжсння.ВалютнаяСуммаДт Проводка. ВолютнаяСуымаКт • СторнируемысДвнжсния.ВалютнаяСуммаКт 11роводка.КоличсствоДт = - СторннрусмысДвижсния.КолнчсствоДт; Проводка.КолнчествоКт « * СторннруемыеДвижения.КолюкхпюКт; 11рож1дка.НомсрЖурна.1а = СторнируемысДвижсния.НомерЖурнала, 11роводка.Организация - СторнирусмысДвнження.Организация; Прово л ка. Содержание = СторнируемыеДвижения Содержание; Проводка.Су мм л = - СторнируемыеДвижсния.Сумма; КонецЦикла; Движения. Хозрасчетный. Зал нсать(); 152
Бухгалтерский учет Посредством метода «ВыбратьПоРегистратору» выбираем движения документа «СторнируемыйДокумент» по регистру бухгалтерии «Хозрасчетный». В цикле перебор этой выборки - формируем новые записи в регистре посредством свойства «Движения» данного документа. Поле «Период» в них заполняем значением даты нашего документа. Остальные поля записей заполняем содержимым полей сторнируемых движений. Обратите внимание на два цикла перебора субконто дебета и кредита. Для числовых значений ресурсов при заполнении проставляем знак «-». После того, как в цикле будет создан весь набор записей документа - записываем набор записей непосредственно в регистр. 153
Сложные периодические расчеты ф Как получить сумму начисления по конкретномувидурасчетауказанному сотруднику вуказанном периоде? Получим из регистра расчета «БУОсновныеНачисления» результат начисления (ресурс регистра расчета «Результат») некоторому сотруднику («ФизЛицо») по некоторому виду расчета («ВидРасчета») в указанном периоде («Период!»): Запрос = Ноиый Запрос; Запрос.Тскст - ’ВЫБРАТЬ | БУОсновные! 1ачис ления. Результат |ИЗ | РсгистрРасчста.БУ(Х'нонныеНачнслсния КАК БУОсноанысНачислсния |ГДЕ | БУОсновныеНачисления. ПернодРегистрации & Периид I и | БУОсновныеНачнсления. ФизЛицо 3 АФизЛицо I и | БУОсновшлсНачислсння ВидРасчета = &ВидРасчета". Значение параметров запроса берется из соответствующих переменных, существующих в контексте модуля. Залрос.Установи1ъ11араметр("1!срнод", НачапоМесяцЖПериод!)); Запрос.УстановитъПараметрС*ВидРасчета’. ВидРасчета); Запрос.Ус геном i ^Параметре "ФизЛицо", ФнзЛнцо); 154
Сложные периодические расчеты (D Как получить сумму всех начислений указанному сотруднику вуказанном периоде? Будем считать, что в конфигурации при решения задач расчета заработной платы для начислений определено два регистра расчета и два плана видов расчета (по основным начислениям и по дополнительным), учет ведется только для одной организации. Необходимо получить данные по всем начислениям сотрудника. Для решения данной задачи можно использовать текст запроса: ВЫБРАТЬ | БУОсновнысНачнсления ()р1аннкация КАК Организация. | ПРЕДСТАВЛЕНМЕ<БУОсновныеНачисления.Организа1шя). I БУ Основные! (ачис тения ВилРасчета, | ПРЕДСТАВЛЕНИЕ(БУОсновныеНач11слсния.ВилРасчега). | БУОсновныеИачнсления.Результат КАК Результат, | "“Основные"* КАК ВариантНачнстений [ИЗ | РегисгрРасчета БУОснавныеНачнсления КАК БУОсновныеНачнстсння |ГДЕ | БУОсновные! 1ачнсления11срнод Регистрации & Нужный! 1 ери од | И БУОсновныеН<1чнсления.ФнъПи1ю = &Фн <Лнцо (ОБЪЕДИНИТЬ ПСЕ (ВЫБРАТЬ | БУ Допаян ительныеНачислен ня. Орган и децня, | ПРЕДСТАВЛЕНИЕ(БУДо<км111И1ельныеНачж.’ления.Организация). | БУ Допа л нитсл ьн ыеНачнслс! hi я . ВнлРаечста, | ПРЕДО*! АВЛЕНИЕ(БУД<мюлннтеяьныеНачнсяения.ВидРасчета), | БУДополнитсльнысНачисления.Результат. | •"Дополни 1ельные’"* |ИЗ | Регистр Рас чета. Б У Долог н нтсл ь н ыс И ачислсн ия | КАК ЬУДополнитг1Ы1ыеНачнсления |ГДЕ | БУДополнитсльнысНачисления.НсриодРсгистраини = & НужныйПсрнол I и | БУДополнитсльнысНачисления.ФиъТицо= & ФизЛицо (ИТОГИ СУММА(Резудыа1) |ГЮ ОБЩИЕ. Организация, ВариантНачцслсний"; Нужно не забыть передать значения определенным в тексте запроса параметрам. 155
Прикладные объекты Как получить таблицу перерасчетов по перерасчетам нескольких регистров? По данным перерасчета «ПерерасчетОсновныхНачислений» регистра «ОсновныеНачисленияРаботниковОрганизации» и перерасчета «ПерерасчетДополнительныхНачислений» регистра «ДополнительныеНачисленияРаботниковОрганизации» необходимо получить таблицу вида: Работник ВидРасчета Документ В обоих перерасчетах присутствует измерение «ФизЛицо». Задачу можно решить посредством объединения запросов по таблицам перерасчетов регистров: ВЫБРАТЬ ПсрерасчетОсновных.ФитЛиио КАК Работник. ПерерасчетОсновных. ВидРасчета. ПерерасчегОсновных.Объект Перерасчета КАК Документ ИЗ РегистрРасчета .ОсновнысНачислснияРаботниковОрганиктции .Перс расчетОсновныхНачислений КАК ПерервсчетОсновных ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 11срсрасчстДополнитсльных.Фит.1ицо. Перерасчет Дополнительных. ВидРасчета, ПерерасчегДополнитсльных-ОбъектПерерасчета ИЗ Рет нсгррасчета .ДоптхтннтсльнысНэчислснняРаботннковОрганизапнн .Перерасчет Дополни тельных Начислений 156
Сложные периодические расчеты Как для документа «НачислениеЗарплатыРаботникам» определить номера строк записей полностью вытесненных видов расчета? При работе с множественным вытеснением видов расчета может оказаться ситуация что запись документа по регистру расчета содержит полностью вытесненный вид расчета. Например, человек весь месяц проболел -вид расчета «оклад» полностью вытесняется видом расчета «Больничный». Поиск таких записей можно выполнить посредством следующего запроса: ВЫБРАТЬ РАЗРЕШЕННЫЕ У правленчесжнеНачислення. НомерСтроки КАК НомерСтроки ИЗ Pei мстрРасчеттиУправлеическме!1аЧ1Н‘лсния КАК УправлснческисНачислення ЛЕВОЕ СОЕДИНЕНИЕ Pei ис грРасчстэ .У гтравлснчсскисНачнсления Фактический! 1сриодДсйсгви Я1Регистратор = &парамСсылка) КАК УправлвнчесВкИеНачмслотяФагтичсскийПернодДейсгвня ПО У праменческиеНачисления. НомерСтроки = У 11рзнлсн,1СскисНач1«с1ен11яФактичсск1пП1сриодДснсгвия.НомерС троки И УправленчсскисНачис ления. Регистратор = У прал1снчсскисНач„слснняФактмчсскийГ1срнодДсй<:твия.Регистратор ГДЕ У праялснчсскисНачислсння. Регистратор = &парам€'сы.тка И ((У'иравленческнеНачис линия ФактческиЙПернодДсЙствия. Ре гисгрятор) ЕСТЬ NULL) В запросе выполняется левое внешнее соединение таблицы регистра «УправленческиеНачисления» и виртуальной таблицы «Управленческие Начисления.ФактическийПериодДействия». В параметрах виртуальной таблицы и в условиях запроса указан отбор по данному документу. Соединение строится по равенству полей «НомерСтроки» и «Регистратор». В результате соединения могут появиться записи, у которых значение поля «Регистратор» виртуальной таблицы равно NULL. То есть для 157
Прикладные объекты данной записи фактический период действия отсутствует. Такие записи и есть предмет нашего поиска. Каксформироватьрасчетныйлисток сотрудника? Будем считать, что в конфигурации для решения задач расчета заработной платы определены два регистра расчета и два плана видов расчета (соответственно по ачислениям и удержаниям), учет ведется только для одной организации. Необходимо получить данные для расчетного листка сотрудника. Для решения данной задачи можно использовать следующий текст запроса (его можно определить в конструкторе выходной формы): •ВЫБРАТЬ | В.юженныйЗапрос.ФнъПиио. | ПРЕДСТАВЛЕНИЕВложсниынЗапрос Фи «Лицо). | В.к>женныйЗапрос.ФизЛ|що1 !рс;кта&1ение КАК ФнзЛицоПрсжтавлениеГ. | Вложенный За < । рос. Ви дРас чета. | ПРЕДСТАВЛЕНИЕ(ВложепныйЗапрос ВидРасчета». . Вложен ныйЗап рос. ВндРасчетаПрслставлсннс КАК ВитРасчстаПрсдстатиснне). | ВложенныйЭапрос. Результат КАК Результат, | ВложенныйЗапрос.Тии Расчета КАК Тип Расчета |ИЗ | (ВЫБРАТЬ БУ ОсновныеНачнсления.ФизЛицо КАК ФизЛицо, ПРЕДСТАВЛЕНИЕ! БУ О£новнысНэ'1ислсння.ФизЛицо! К.АК ФизЛнноПредсгввлснпс, БУОсновныеНачисления ВидРасчета КАК ВидРасчеж 11РЕДСТ А ВЛ ЕН И Е(БУОсновн ысНачнслснмя .ВидРасчета) КАК ВмдРасчетаПредс БУ (кновныеНачнс леи и я. F "Начисления"* КАК ГипР РетистрРасчета БУОснониысНичис. тения КАК БУОеновныеНачнс.1Сния ГДЕ БУОс11овныеНач1Клення.ФитЛицо ж ДФизЛиио И БУОсновн доначисления. ПернолРегистр31 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ У держания Работ никовОрсанимций-Фми I нио, П РЕ ДСТ А ВЛ ЕН И Е( У держания Раби т 11 и ковОрт шиты цнй.ФнзЛ ицо), Удержания Работ никовОрганизацин. Вн дРасче i а. II РЕ ДСТ А ВЛ ЕН И Е< У держания РаботниковС )рганиза ниЙ. ВидРасчета I, 158
Сложные периодические расчеты -Удержан ия Рибстн и ковОр« <н поици й. Результат. "Удержания"’ ИЗ РстистрРасчста, У дсржаяи я Работн иковОрт аиитаин й КАК Удержания Работников! )рташ<таиий ГДЕ УдержшнаРабшнико»Оргаи>паш«й.Фи1Лиио = ЛФизЛицо И УдержанияРабоП1нковОр<а1<И1а1111Й.Пер|«>дРе111Страиии - ДНужныиПсриод) КАК ВдктжснныйЗалрос ИТОГИ СУММА! Реаультаг) ПО ОБЩИЕ, ТнпРасчета"; Нужно не забыть передать значения определенным в тексте запроса параметрам и используя возможности работы с табличным документом настроить внешний вид расчетного листка сотрудника. Как организовать сторнирование уже произведенных расчетов прошлых периодов? Классическим примером является ввод январского больничного в феврале или т.п. Допустим, работаем с регистром расчетов «ОсновныеНачисления»: 159
Прикладные объекты Получить данные тех записей регистра, с которыми конкурируют текущие записи набора записей регистра, выполненные данным регистратором, можно при помощи метода ПолучитьДополнение() менеджера регистра: Таб.пшаСторноЗаписей = Движения ()сновнысНачнслснняРаботннков()рганмзации .Получит ьДополнсниег )*, Для каждого СтрокаСторно Из ТаблицаСторноЗаписсй Цикл //Добавить сторно-записи в набор записей регистра. // Новая запись движений. Движение = Движения.ОсновнысНачислснияРаботннкоаОрг анизации. Добавить!J Заполнить свойс! на Яви жен не. Период Per ист рации = Строка. Пери од Pei истрацииСзорно; Движение. ПернодДснствия Начало = СтрокаЛсрнодДснствияНачалоСторно; Движение. ПериодДействия Конец Движение.Базовый! 1ериодНача. ю ЦвижсннсБазовыйПериодКонсц Движение. ВидРасчета Движение.Сторно е Строка. ПерисыДеясгвняКонгцСгорно: • Строка Ба ювыйПериодНачало; = ( трока. Базовый! !срн од Конец, С 1рока.ВндРэсчс1а; = Истина, // Заполнить измерения. Движение ФизЛицо = Сгрокз.ФнзЛицтт; Движение.Прикат = Строка. Приказ: Движение Орган и <аиия = Строка.Организация; / Ресурсы нс заполнять, потому что здесь нс происходит 7 только подготовка новой записи // Заполнить реквизиты. Движение. График Рабо i и = Строка.! рафик Работы; Движение.Размер • Строка. Размер; Движение.ВидУчстаВрсмсни = Строка.ВндУчстаВремсни; Движение.ПолразлеленнеОргани займи = Строка.Подра ыелениеОргаии займи: Движение.! !ериодРасчстэ(^рсднсг<|ЗаработкаНачало = Строка. ПернодРасчстаСреднсгоЗаработкяПачало; Движение.ПерИ0.|РасчетаСрелнеюЗарабо1каОкомчанис = Строка.ПсриодРэсчстаСрсднсгоЗаработкаОкончяннс; Конец Цикл а; Движения .Основ11ыеНачнсленияРа6огниковОр1анныции.Записагы г. Посредством свойства «Движения» документа обращаемся к набору записей этого документа по регистру расчета «ОсновныеНачисления». Применяем к этому набору записей метод ПолучитьДополнение(). 160
Сложные периодические расчеты Результатом будет таблица значений, содержащая данные конкурирующих расчетов. Для того, чтобы записи нашего документа могли записаться несмотря на то, что период действия уже "занят" ранее зарегистрированными записями, выполняем цикл перебора строк полученной таблицы значений, вводя соответствующие им сторно-записи. В каждой новой записи в поле «ПериодРегистрации» пропишем значение из поля «ПериодРегистрацииСторно» таблицы дополнения. В поле «ПериодДействияНачало» - «ПериодДействияНачалоСторно», в поле «ПериодДействияКонец» - «ПериодДействияКонецСторно». Далее устанавливаем значение Истина для поля «Сторно». Значения для остальных полей новой записи, кроме ресурсов, один в один переносим из полей таблицы «ТаблицаСторноЗаписей». Ресурсы не заполняем потому, что таблица дополнения содержит не готовые данные для сторно-записи, а лишь данные для расчета сторно-записи (на основании того, что расчет ресурсов еще будет выполняться). После того, как цикл завершается, выполняем запись новых записей в регистр. Потом можно приступать к их расчету. 161
Бизнес-процессы Как определить бизнес процесс, в котором количествопоследовательныхэтапов определяется индивидуал ьно на момент старта экземпляра процесса? Требуется реализовать следующий процесс: Каждый день необходимо «объезжать» склады компании. С утра становится известным состав вьттттедтттих на работу водителей. Далее менеджеры компании определяет маршрут движения каждого водителя (точек маршрута может быть произвольное количество). Диспетчерская служба отслеживает, на какой точке маршрута находится каждый водитель. После отработки маршрута водитель должен сдать путевой лист с отметками о показаниях спидометра и расходе горючего заранее определенному сотруднику компании. Только после этого процесс считается завершенным. Для реализации задачи создаем задачу «ЭтапыПути». Реквизиты адресации: • Пользователь (Ссылка на справочник «Пользователи»); • Подразделение. Считается что в регистре сведений, отвечающем за адресацию соответствующие сведения измерения существуют. Реквизиты задачи: • ДатаВыполнения (Время выполнения задачи); • Исполнитель (Ссылка на справочник пользователей системы); • Склад (ссылка на справочник складов). 162
Бизнес-процессы В модуле объекта необходимо разместить процедуру - обработчик события Перед выполнением: Процедура ПередВылолиеянемсОтказ) Если Исполнитель. ПустшвО Тогда Исполнитель «= II драме! рыСеанса ТскущиПИсиолнигель; Конец Если ; Да га Выпол нейия=Теку щаяДа га(); КопецПроцедуры Перед выполнением задачи в нее будут записываться информация о пользователе системы выполняющем задачу и дате со временем ее выполнения. Далее необходимо определить бизнес процесс «НаМаршруте». В свойство «Задачи» выбрать «ЭтапПути». Реквизиты бизнес процесса: • Водитель (ссылка на соответствующий справочник) • ПоказанияСпидометраНачальные (Число) • ПоказанияСпидометраКонечные (Число) • РасходТоплива (Число) 163
Прикладные объекты Карга маршрута бизнес процесса; Старт JP Диспетчерская Т очка маршрута ж 1 . лих Определение маршрута X? Коигроперое Путевой лист сдан У точки «Определение маршрута» в группе свойств «Адресация» выбрано подразделение «Менеджеры». Для этого соответствующий элемент должен быть заведен как предопределенный. Определен обработчик события Обработка интерактивной активации: Получ1ггьФорму(''Маршрут").Огкрыть(); Стандарт наяОбработ ка = Ложь; При попытке открыть задачу, соответствующую данной точке будет открываться форма бизнес процесса «Маршрут». В этой форме можно отображать данные по водителю и по маршруту (с возможностью корректировки табличной части, содержащей маршрут). 164
Бизнес-процессы Определен обработчик события При выполнении: Если ТочкиМаршрута.КоличествпО = О Тогда СообщитМ’Не определен маршрут?!!'*); Отказ - Истина; КопепГсли: В данном обработчике проверяется, что хотя бы одна точка маршрута указана, в противном случае выполнить задачу не получится. У точки условия определен обработчик события Проверка УСЛОВИЯ: Результат = ПолучитьТочкуМаршру1а<). Пустая! >; Используется функция: Функция По.зучитьТочку Маршрута!) Запрос^Повын Запрос; Запрос.Текст= "ВЫБРАТЬ ПЕРВЫЕ 1 | НаМаршругеТочкиМаршрута.НомерСтрокн КАК Номеретроки | Н аМаршрутсТочкиМаршрутах клал |ИЗ | ЫпнесПроцесс НаМаршрутс.ТочкиМаршрута КАК НаМаршрч 1еТочкмМаршруга [ГДЕ I (НаМаршрутеТочкнМаршрутэХ'клал НЕ В (ВЫБРАТЬ РАЗЛИЧНЫЕ ЭтолПутн.Склод ИЗ Задача. ЭтапПутм КАК ЭтапПуги ГДЕ ЭталПути. Бизнес! Ipouecc = &ЬизнесПроиесс И (Ссылка &Ыпнес11р< УПОРЯДОЧИТЬ по | ИомсрСтрокм”; Запрос.У стшювнзь11ираысгрС Бизнес Процесс , Ссылка) Выборка = Запрос. Выполнить! (.Выбрать!); Если Выборка.Следующий!) Тогда Возврат (Выборка.( клал); Иначе ВозвратССправочникн.Склады.! !устаяСсылка( 165
Прикладные объекты Данная функция возвращает следующую точку маршрута или пустую ссылку, в случае если весь маршрут пройден. У точки «Точка маршрута» в свойстве «Подразделение» группы свойств «Адресация» выбрано «Диспетчерская» (предопределенный элемент справочника «Подразделения»). Определен обработчик события При ООЗДЭНИИ задач: ФормируемыеЗала<1и[0|.Ск.'ш = ПолучнтьТочкуМаршруты): В этом обработчике для задачи устанавливается текущий склад (в соответствии с ранее определенным маршрутом). «Формируемые задачи» это параметр, принимаемый данным обработчиком события. У точки «Путевой лист сдан» в свойстве «Пользователь» группы свойств «Адресация» выбрано «Контролеров» (предопределенный элемент справочника «Пользователи»). Можно отказаться от подобного способа назначения ответственного за выполнение задачи. Используя обработчик события При ООЗДЭНИИ задач и данные в системе (регистре сведений, ответственном за адресацию) ответственного можно назначать программно (таким же образом как в точке «Точка маршрута» назначается очередной склад). Определен обработчик события Обработка интерактивной активации: Получи п.ФормуГПрсвойЛисгЧОпфыть(); СгандартнаяОбрабо 1ка = Ложь; При попытке открыть задачу будет открыта форма «Путевой Л ист» бизнес процесса, в которой можно будет ввести данные о показаниях спидометра и расходе топлива. Также определен обработчик события При выполнении: 166
Бизнес-процессы Задача не будет выполняться, если не введены конечные показания спидометра и расход топлива. Как при работе с бизнес процессами отказаться от стандартного способа формирования задачи и сформироватьее программно? Для получения разрешения на какое-либо действие требуется получить согласование у нескольких сотрудников. Заранее не известно их количество. Согласование должно производиться параллельно, а не по схеме: сначала первый, после первого второй и т.п. Считаем, что сотрудники, с которыми необходимо произвести согласование определяются в табличной части бизнес процесса « НаСогласование». Карта маршрута бизнес процесса следующая: 167
Прикладные объекты Для того чтобы после выполнения задачи «Определение рецензентов» сформировалось столько задач, сколько рецензентов выполнено определим обработчик события Перед созданием Задач точки действия «Согласование». Текст процедуры следующий: Для Каждою Рецензент Из Несогласование Цикл НомяЗоддча = Залами. ЭтапПутн.Созлап.ЗадэчуО; Новая Задача. Бизнес Процесс = Ссылка; НоваяЗадача. Пользователь = Рсцснзснт.Рсцснзснг. Новая Задача. Наименование = "Согласование со специалистом"; Н оваяЗадача ! очкаМ аршруза я Бизнес Процессы . Hall аранлел ьноеСогласо ванне Точки Марш рута.Сог изсовамие ; Новая Задач а. Дата = ТекушаяДатаО; НоваяЗадача.ЗанисатМ); Формируем ыеЗхтачи.Добав1Ггь( Новая Задача), КонецЦикла, Стандарт наяОбработка = Ложь; «Формируемые задачи» это массив, является параметром обработчика события. В нем содержаться значения имеющие тип ЗадачаОбъект.ЭтапПути. Если в параметр обработчика события Стандартная обработка не записать значение Ложь, то формируемый список задач будет очищен и будет создан заново исходя стандартной модели поведения. 168
Прочиеприкладныеобъекты ф Как, не открывая форму внешней обработки, вы п ол н ить ее п роцедурудл я оп редел ен ного объекта? Имеем ссылку на документ в переменной «Ссылка». Переменная «ИмяФайла» содержит имя файла внешней обработки предназначенной для печати документа по специальной форме. Процедура «Печать» находится в модуле объекта обработки. Необходимо вызвать ее выполнение для нашего документа. Перед выполнением данной операции необходимо проконтролировать наличие указания ключевого слова Экспорт в заголовке процедуры «Печать» модуля объекта обработки и принятие ссылки на печатаемый документ. Поскольку формы обработки задействованы не будут - ссылка будет передаваться посредством параметра процедуры. Теперь можно сделать следующее: Обработка = Внешни<Юбработки.Создагъ( ИмяФайла): Обработка. ПечагЦСсылка); Обратите внимание на то, что имя файла внешней обработки должно быть полным. ф Как быстро получить информацию, по всем объектам, находящимся в компетенции конкретного менеджера (элемент справочника «Пользователи») по продажам? Если вопрос скорости в данном случае критичен - лучше использовать критерии отбора. Создаем новый критерий отбора «КомпетенцияМенеджераПродаж». В данных нового критерия отбора указываем тип « СправочникСсылка. Пользователи». 169
Прикладные объекты Далее заполняем «Состав», указывая все объекты, которые должны попасть в отбор: Эго могут быть реквизиты элементов справочников, документов и т.д. Чтобы впоследствии получить все объекты, указанные в составе и заполненные конкретным значением менеджера можно будет использовать метод НайтиО критерия отбора: МассивСсылок = КритерииОгбора .КомиетенцияМеисджераПродаж . Найт «(Менеджерк Для Каждого Ссылка м < МассивСсылок Цикл Сообщи нЛСсылка)'. KohcuI 1икла; Переменная «Менеджер», переданная в качестве параметра методу НаЙТИО должна содержать ссылку на конкретного менеджера (т.е. на элемент справочника «Пользователи»). Результат метода - массив. Элементы массива можно перебрать стандартным способом. 170
Прочие прикладные объекты Или можно использовать запрос со следующим текстом: ВЫБРАТЬ КомпетедиияМенеджсраПродаж. Ссылка ИЗ Кр1нсрнйОт<юра.Компетсш1няМснсджсраПро.'|аж(&Мо«:.,1жср> КАК КомпсгенцияМснслжсра! 1ро лаж Параметру запроса «Менеджер» нужно будет установить значение конкретного менеджера. Результат запроса впоследствии можно перебрать стандартной выборкой. 171
Формы иэлементы управления Работа с формами ® Как открыть форму документа? ФормаДокумеита = СсылкаНаДокумснт.) 1а'1учи1ьФорму(); ФормаДокумента Открыты >: Методом ПолучитьФорму() обращаемся к основной форме документа. Если нужно обратиться не к основной, необходимо первым параметром метода указать название получаемой формы. Далее открываем полученную форму. Как открыть форму внешней обработки? Имя файла внешней обработки содержится в переменной «ИмяФайла». Тогда открытие основной формы обработки выполняется так: Обработка = В||ешии<Юбра6огки.11и.|учи1ъФорму(ИмяФай ла); (lopaoii ft;.тОпсры ; Если бы требовалось открыть определенную форму этой обработки или форму с определенным ключом уникальности «Ключ» - для этого можно было бы использовать второй и третий параметры метода ПолучитьФорму(). Например, так: Обработка = Внстш1ИсОбрабсгк11.Па.тучитт>Фор.му(нС:\Внешннеи?пецОтчег.ерС’. ИмяФормы.. Ключ); Обработка Открыты):______________________________________________________ Обратите внимание на то, что в любом случае имя файла должно быть полным. 172
Работа с формами (D Как отрыть форму отчета так, чтобы она не перекрывала собой ту форму, из которой она открыта? Для этого форму отчета нужно открывать как подчиненную данной форме и устанавливать свойство Положен иеОкна в значение НеПерекрыватьВладельца: Форма = Огчсты.Отчг1Д>1а1рамма.Па’|у’ни1ьФорму(иФормаОсновная \ ЭгаФорма); Форма.11о.1ОЖСНмеОкна- Вариант!кгитжснияОкна.НсПсрскрыватьВлалсльца; Форма. ОткрытьО; Следует учитывать, что открываемое окно будет менять свое положение, только если может полностью поместиться в пределах родительского окна, не перекрывая заданную область. Как открыть форму отчета на весь экран? Для этого следует воспользоваться свойством формы СпособОтображенияОкна: СпособОгображснняОкна = Варианте пособаОтображенияОкна _______________________Макси нитрованное; Можно также запретить пользователю минимизировать и максимизировать открытое окно: МмснснятьСпосгоОтображснняОкна = ИзчсненисСпособаОтсюражснияОкна Запретить; Следует учитывать, что использование свойства СпособОтображенияОкна возможно лишь до того, как форма начала открываться (т.е. в модуле самой формы или до выполнения метода формы ОткрытьО, если форма открывается «извне»). 173
Формы и элементы управления Как из формы документа открыть форму списка данного документа, спозиционировавшись на нем же? ФормаС писка = Доку менты [ Методам ные(). Имя |.ПолучитьФ< ФормаСписка.ПараметрТекушаяСгрока = Ссылка. Фор>1ЦС^111С1П1 OnrpUTLf)* Получаем форму списка через объект ДокументМенеджер.<ИМЯ> по имени нашего документа. Далее свойству ПараметрТбкущаяСтрока расширения формы списка документов присваиваем ссылку на наш документ. Потом открываем форму. В данном примере форма списка будет открываться даже в том случае, если у объекта (в составе метаданных) она и не создавалась. Тогда она будет создана «налету». Кроме того, хотелось бы обратить внимание, что по умолчанию сначала будет производиться поиск уже открытого экземпляра формы списка, и если только такового не окажется - будет открываться новый. Если же мы хотим каждый раз открывать обязательно новую форму списка (не обращая внимания на уже открытые), то лучше всего при получении формы списка генерировать для нее новый ключ уникальности. Например, так образом ключ уникальности будет гарантировано новым: ФормаСпнска = Документ ы(Метяданные(). Имя] ПолучигьФормуСписка(.. Новый УмикалЫ1ЫЙИде1гтификатор()); 174
Работа с формами ® В документе есть реквизит «Контрагент». Какоткрыть форму подчиненного ему справочника «ДоговорыКонтрагентов»? Если lie KoHipaiein ЛуспшО Тогда ФормаПодчиисииыхДоговоров = Справочники . Ден иворыКон граг ептов .Полу читьФормуСииска( )*, ФормаПолчинсниыхДоговоров.1 1арамсгр(>гборПоВлалельцу = Контрагент*. Ф<1рмаГ1о;|чинен>1ыхДоговор<»в.С>ткрыть(); КоиецЕсли: Сначала проверяем заполнен ли реквизит «Контрагент». Если он не равен пустой ссылке получаем в переменную «ФормаПодчиненньгхДоговоров» форму списка справочника «ДоговорыКонтрагентов». По умолчанию получим основную форму, но если бы нам потребовалось получить какую-то конкретную - достаточно было бы указать имя открываемой формы первым параметром метода ПолучитьФормуСписка(). Далее устанавливаем значение «ПараметрОтборПоВладельцу» расширения формы списка равным ссылке на нашего контрагента и открываем форму. 175
Формы и элементы управления © Как в форме отобразить картинку, сохраненную в реквизите справочника? В диалоге формы (например, формы элемента справочника «Сотрудники») необходимо разместить элемент управления ПолеКартинки (его имя «Фото»). В самом справочнике существует реквизит «Фотография» имеющий тип ХранилищеЗначения (в него и записывалось значение, перед преобразованием к типу ХранилищеЗначения имевшее тип Картинка). В обработчике события При открытии формы разместим следующие строки: Н Значение, сохраненное в реквизите справочника. имеющем лип // ХранилищеЗначения, можно только получить (охрансннаяКартннка = Фотография! 1олучить(); Если СохраненнаяКартинка о Неопрелелено Тогда И Если в хранилище было что-нибудь заранее записано... ЭлемептыФормы Фото.Картипка = СохраненнаяКартинка: КонепЕсли; Следует отметить, что если в записываться не только картинка, необходимо производить проверку хранилища значения. реквизит «Фотография» может то в этом случае обязательно типа значения, полученного из <Х> Каквжурналедокументов «УчетКадров» отобрать только документы «ПриемНаРаботу»? Ж урналДокуыентовСпнсок. Отбор. ВидДокумсита. Установит М Мет сданные .Документы ПриемНаРаботу! Данную работу необходимо проделать посредством основного реквизита формы журнала «ЖурналДокументовСписок». Свойство Отбор данного объекта включает в себя свойство ВидДокумента. Необходимо только установить его значение. Поскольку нам нужны именно документы «ПриемНаРаботу» - через метаданные получаем значение для отбора. 176
Работа с формами ф Как узнать интервал дат в открытом текущем журнале? Интервал дат является одним из вариантов отбора для объектов типа ЖурналДокументовСписок. <имя>. Работу необходимо вести с основным реквизитом формы журнала « ЖурналДокументовСписок»: Если ЖурнллДежумешовСписок.Отбор.ДйгаЛспользованис Тогда Сообщи ть! ЖурналДокуыен i оеСписок.Отбор .Дата); Иначе Сообщить! ’Без ограничен ня по датам”); КонецЕсли; Сначала проверяем, используется ли на данный момент для этого объекта отбор по свойству «Дата». Далее можно просто получить представление элемента отбора с именем «Дата». Как при открытии справочника сделать отбор по контрагентам, входящим в список? Для случая, когда необходимо делать отбор по контрагентам, входящим в список значений «СписокКонтрагентов»: Процедура ПрнОткрытни() СпрсвочникСписок. Отбор. Ссылка. В идС равнения ® ВидСравмення ВС писке*. СправочникСписок.Отбор.Ссылка.Значение = СписокКонтрагентов; СпралочникСписок.Отбор.Ссылка.Использоваинс = Истина; Коней! 1роисдуры Сначала устанавливаем вид сравнения для отбора по полю «Ссылка». Далее назначаем в качестве значения список контрагентов, по которым нужно осуществить отбор. Устанавливаем для свойства Использование данного элемента отбора значение Истина. Обратите внимание, Отбор - это свойство объекта СправОЧНИкСпиСОК.<ИМЯ>, то есть источника данных, а не элемента управления (табличного поля). 177
Формы и элементы управления Как обеспечить, чтобы для выбора значения покупателя в расходной накладной справочник контрагенты открывался сразу с открытой группой «Покупатели»? Поскольку нам необходимо особым образом открыть форму выбора именно из формы документа - сначала пропишем обработчик события Начало выбора поля ввода «Контрагент» формы документа: I Ipoueaypu Koirrpai е»н Нича,юВм6ор;Ц Э.1емен1. СтандартнамОбрабигкл) Если Элсмен! Значение.Пус1<1я() Тогда СтаюкргнаяОбрабогка » Ложь; ФормаВыбора s Справочники Контрагенты Получи гьФормуВыбора( .Элемент); ФормаВыбора.ВыборПокупатсл! = Истина; ФормаВыбора. Открытье); КонсиЕсли; КонецП роцедуры Сначала проверяем, заполнено ли значение поля ввода. Если да - то лучше ничего не делать. Стандартным поведением системы является открытие формы выбора с позиционированием на элементе, указанном в поле ввода. Если оно не заполнено - отключаем стандартную обработку события, поскольку этим процессом будем управлять сами. В переменную «ФормаВыбора» получаем основную форму выбора соответствующего справочника. При этом назначаем параметры: • владелец создаваемой формы - текущий элемент управления (поле ввода «Контрагент). Впоследствии, когда выбор произойдет, система вернет выбранное значение в этот элемент (еще говорят - оповестит о выборе); 178
Работа с формами Дальше работа идет уже со справочником: находим, какая форма указана в качестве основной для выбора: В найденной форме создаем реквизит «ВыборПокупателя», имеющий тип Булево. Затем в обработчике события При открытии необходимо добавить код, обеспечивающий установку значения свойства Текущий Родитель табличного поля «СправочникСписок». Но сначала желательно обеспечить однозначное толкование понятия «группа Покупатели». Есть несколько вариантов: а) Если справочник уже заполнен и группа «Покупатели» существует, можно подсмотреть код или наименование и в дальнейшем считать, что «группа Покупатели» - это элемент с таким то кодом или наименованием. Но существует опасность, что через какое-то время пользователь изменит код (наименование) этого элемента. Тогда наша процедура «потеряет» из виду «группу Покупатели». Поэтому лучше создать константу (например, «ГруппаПокупатели»), которая будет хранить ссылку на нужную группу справочника «Контрагенты». б) Более надежным вариантом видится создание предопределенного элемента справочника с именем «Покупатели». Такому элементу «повредить» пользователю сложнее. Но тут возникнет вопрос: справочник был уже заполнен и в группе «Покупатели» 20000 элементов, как перенести их в другую группу?. Для ответа на этот вопрос в настоящем издании есть пример «Как перенести все элементы справочника «Контрагенты» из одной группы в другую?» на странице 99. 179
Формы и элементы управления а) если идентификацию группы «Покупатели» делаем по ссылке, которая хранится в константе «ГруппаПокупатели»:: Если ВыборПокупатсля Тогда ЭлсмснтыФормы.СправочникСпнсок.Исрархнчсский! Ipoc ЭлсмснлыФпрыы.СпрзвочникСписок.ТскущийРолитель = КонецЕсли; мотр = Истина; Константы .ГруппаПокупатели .ПолучитъО; б) если идентификацию группы «Покупатели» делаем по предопределенному элементу: Если Выбор! Iокупатсля Тогда Э]к:ментыФормы.Справочннк<_писок.Иерархический Просмотр = Истина: ЭлементыФормы.СправочникСпнсок.ТекушнйРолитель - Справочники .Контрагенты .Покупатели; КонецЕсли; Сначала проверяем значение реквизита «ВыборПокупателя» текущей формы. Если оно равно Истина - устанавливаем для соответствующего табличного поля формы свойство расширения табличного поля списка справочника ИерархическиЙПрОСМОТр, а свойство Текущий Родитель табличного поля заполняем нужным значением. В качестве замечания: описанное выше решение не является единственно возможным. Например, если значение текущего родителя было бы не жестко устанавливаемым («Покупатели»), а определялось в форме документа, тогда лучше для передачи информации между двумя формами воспользоваться созданием соответствующего реквизита формы выбора справочника. Главное, чтобы Ваше решение обеспечивало возможности использования формы другими объектами независимо от ее внутреннего устройства (например, от названия элементов управления). 180
Табличное поле ф Как запретить пользователю изменять порядокследованияколоноквтабличном поле? Для этого можно воспользоваться свойством табличного поля ИзменятьПозициюКолонок: Элеме1ГгыФормы.Таб.1нчноеПоле.Измен1тьПо1иш<юКолонок » Ложь: Если необходимо запретить перемещение только некоторых колонок, тогда следует использовать свойства ИзменятьПозицию соответствующих колонок: ЭлемснтыФормы.Табличное!1о ле. Колонки. Каргинка.И зменя i ьПолщию = Ложь: ЭлсмснтыФ0риы.Таблич1<ос11олс.Ка.тонк11.Код.ИгчснятъГ1о1И11111о = Ложь, ' Элементы Формы .ТабличноеПоле .Колонки Наименование .Изменять Позицию Ложь; ® Как запретить пользователю изменять любые настройки колоноктабличного поля? Для этого можно воспользоваться свойством табличного поля ИзменятьНастройкуКолонок: Элсмен । ыФормы Таб.1нчноеПолс.Изменя i i.Hao ройку Колонок^ Ложь; Если необходимо запретить перемещение только некоторых колонок, тогда следует использовать свойства ИзменятьНастроЙку нужных колонок: ЭлсмензыФормы ТабличноеПоле.Колонки.Картинка И 1мен»гьНасгройку — Ложь: ЭлсментыФормы.ТабличноеПоле.Колонки Код ИзменятьНастроЙку — Ложь; ЭлсмснтыФормы 181
Формы и элементы управления Таблич нос! 1оле Колонки Наименование ИтмснятьНастроЙку = Ложь; ф Как вывести информацию о том, какой отбор установлен вжурнале документов? Для этого рядом с табличным полем, отображающим журнал документов, можно расположить надпись (например, с именем «НадписьОтбор»), и присвоить ей значение отбора. Система автоматически выполнит получение представления указанного отбора: Э.1ементы<[к>рмы11цписьО11Х>р.Заг<>ловик - СписокДокумситжОгбор: Если требуется более подробная информация обо всех элементах отбора, она может быть получена, например, следующим образом: УсзаиоаленныйОзбор = СиисокДокумензов.О(бор; СообпштьС'Элсмснты отбора:"); Для Каждого ЭлеменгтОтбора ич УсзановленныйОчбор Цикл Сообщи п4 Стрижа* ЭнеменчОзбора) + " использование = ” + ЭлсмснтОтбора. Использование); КонсцЦикла; ф Как в форме справочника установить курсор на элементе известным наименованием? ЭлсментыФормы.СправочникСлисок. Геку 1цаяС трока = Справочники .Kotnpai енты НайтмПоНаименошшнкч "ПОСТАВЩИКИ". Истина); Свойству табличного поля «СправочникСписок» Текущая Строка присваиваем значение ссылки на найденный по наименованию элемент справочника. 182
Табличное поле Причем вторым параметром метода мы установили требование искать по полному соответствию наименования. В результате и получим требуемое. ф Как в форме списка сделать отбор по значению реквизита? У объекта СправочникСписок.<ИМЯ> есть свойство Отбор. В его состав входят элементы отбора. Именно работая с ними - можно решить поставленную задачу. Если необходимо организовать отбор по единственному значению реквизита, это можно сделать так: Справочнике писок.Отбор.СтавкаНДС.Устаноаиш Перечисления .СгавкиНДС НДС18); Методу УСГЗНОВИТЬО элемента отбора первым параметром передается значение отбора, вторым - использование. По умолчанию второй параметр имеет значение Истина. Можно еще так: Справ£>чникС.*писок.(И<х)р.(л^вкаПДС.Значснис - Перечисления СлавкиНДС .НДС 18: СправочникСпиеок.Опюр. Ставка! ЩС.ВидСравнения = ВилС равнения. Равно; Справочнике (шссж.Опюр.СтавкаНДС.Использование Истина; Устанавливаем по одному из полей отбора нужное значение. Заполняем свойство ВидСравнения этого поля отбора значением из системного перечисления ВидСравнения (в нашем случае Равно). Указываем системе на необходимость применить фильтрацию по данному элементу отбора. Второй способ вроде бы массивнее, но зато дает возможность применять различные виды сравнения. 183
Формы и элементы управления ф Как запретить выдачу сообщения: «Введенные данные не отображены в списке, так как не соответствуют отбору» при добавлении новых элементов в справочник? Для этого следует использовать свойство расширения табличного поля списка справочника ПроверкаОтображенияНовойСтроки. По умолчанию, для табличного поля, отображающего список справочника, включена проверка соответствия новой строки установленному отбору. Отключить эту проверку можно интерактивно, на закладке «Прочее» диалога настройки списка: Или программно: ЭлементыФормы.ПолеСписка.ПрокркаОгображвнияНовоЮтр(ЖИ = Вариант! 1роверкиО г ображенияНовийС i роки ЛеПроверяты 184
Табличное поле ф Как заполнить ячейку табличного поля данными? У табличного поля «ТабличноеПолеЗаказов» есть колонки «Заказ» (тип значения - ДокументСсылка.ЗаказПокупателя), «Контрагент» (тип значения - Строка) и «ДатаОтгрузки» (тип значения - Дата): Необходимо при вводе или изменении заказа обеспечить заполнение ячеек «Контрагент» и «ДатаОтгрузки» данными из этого заказа. Для реализации данной задачи используем обработчик события При изменении поля ввода «Заказ»: Процедура ТабличноеПолеЗакаижЗаказПриИзмсненин(Эде.мент) И Получить текущую строку табличного поля. СтрокаТаблицы ЭлементыФормы.ТабличноеПолеЗакаюв.Те1сущаяСтрока: // Ввести чиа чей ия в ячейки строки. С грокаТгёлицы. Контрагент = СтрокаТаблиш>1.3аказ.Конгра1ент; СтрокаТаблицы. ДатаОтгрузки - СтрокаТаблицы Заказ.ДатаОтгрузки; KohciiI 1роцслуры В процедуре в переменную «СтрокаТаблицы» получаем строку табличного поля. Далее работаем с ячейками данной строки. В ячейки «ДатаОтгрузки» и «Контрагент» вносим значения, прочитанные из реквизитов документа, введенного в ячейку «ЗаказПокупателя» данной строки. 185
Формы и элементы управления Как изменить цвет фона ячейки табличного поля в зависимости от значения, выводимого в нее? Для того чтобы оформить строки, выведенные в табличное поле, следует использовать обработчик события При получении данных табличного поля. Допустим, нам необходимо в табличном поле «Товары» выделять красным цветом ячейки колонки «Остаток», если остаток меньше 10, и желтым - если больше 100. Процедура Товары! 1ри1 1алучснмиДанных( Элемент. Оформления Строк) Для Каждш о ОформленнеС (роки Иг ОфорыленняСтрок Цикл ЗиачениеЯчсйкиОстаток = ОформлсииеСтроки. Ячейки.Остаток,Значение. Если ЗначениеЯчейкиОстаток о Нсопределено Тогда Если ЗначснисЯчсйкиОстаток < 10 Тогда ОформленнеСтроки.Ячейки Остаток.ЦвстФона = 'Л'еЬЦвета.Красный; ИначсЕсли ЗначснисЯчсйкиОстаток > 100 Тогда ОформленнеСтроки Ячейки.Остаток.ЦветФона = )^еЬЦвета.Желтый; КонецЕслн; КоисиЕс.ти; КоиецЦикла; Копп |Проие.1)ры Для решения данной задачи используются параметры процедуры - обработчика события При получении данных. Вторым параметром получаем коллекцию оформлений выводимых строк. Считывая данные о численном значении остатка, принимаем решение об установке цвета фона ячейки «Остаток» в оформлении строки. Цвет назначаем, подбирая его из системного набора значений \Л/еЬЦвета. 186
Табличное поле Как в табличное поле «ВыбранныеКонтрагенты»добавитьновую колонку«ОсновнойДоговор»,заполнитьее значения и дать возможность открытия этих значений? Табличное поле «ВыбранныеКонграгенгы» связано с таблицей значений «ТаблицаКонтрагенгов» и имеет одну колонку «Контрагент». Когда пользователь заполнит ее, он может захотеть увидеть в том же табличном поле еще основные договора контрагентов с возможностью их открытия. Для решения данной задачи необходимо будет передать управление процедуре со следующим текстом: Если ТаблиоаКонтрдгснтов.Колонки.НаЙти( ’ОсновноЙДоговор") = Неопрсделено Тогда Мисси в Тиной ® Новый Массиве); МассинТипон.Добавип.(ТипГСправочннкСсылка Договоры Конrpai енпш ')); ОптанисНужныхТнпов Новый ОписшшеТипоЫ Массив! иное); ТаблицаКонтрш ентов.Колонки ЛобашньС'С )снов110$Договор“. ОписанисНужныхТнпов); КоиецЕсли; Для Каждою СтрокаТаблицы и»ТаблнняКои ipaiенгов Цикл ( 'трокаТаблицы)"Основной Договор’) ® Строка) абл ины) ’Контрагент * Н'ОсновнойДоговорКон грагента '); КонсцЦмкла; Элемен гыФормы.ВыбранныеКон i paiсипа Со j.ia iъКо.юнкиС); Эл смснтыФормы. Выбранные Контрагенты . Колонки. ОсновнонДоговор . ЭлеменгУ правлен ня.КнонкаО|кры i им » Истина:, 187
Формы и элементы управления Поскольку в качестве данных табличного поля выступает таблица «ТаблицаКонтрагентов» - проще задача с добавлением колонок решается именно через эту таблицу значений. Сначала проверим, нет ли уже у объекта «ТаблицаКонтрагентов» колонки «ОсновнойДоговор». Если нет - добавляем. Если требуется добавить новую колонку именно определенного типа - сначала создаем объект ОписаниеТипов. К нужным типам в нашем случае пусть относится только СправочникСсылка.ДоговорыКонтрагентов. Далее создаем колонку с этим типом значения. Как Вы понимаете, если потребуется создать колонку с составным типом значения - достаточно будет к массиву «МассивТипов» добавить еще несколько элементов с указанием других нужных типов. Теперь открываем цикл перебора коллекции строк таблицы значений, в котором для каждой строки в поле с именем «ОсновнойДоговор» присваиваем значение, считанное с реквизита «ОсновнойДоговорКонтрагента» соответствующего значения поля «Контрагент». Далее табличному полю «ВыбранныеКонтрагенты» даем команду СоздатьКолонки(). При ее выполнении система удаляет старые колонки и загружает новые из источника данных (таблицы значений «ТаблицаКонтрагентов»). Теперь остается установить свойство КноПКаОткрытия элемента управления колонки «ОсновнойДоговор» в положение Истина. В результате пользователь при желании сможет ей воспользоваться. к<ифме«т ОпоммОгаар Наасгсеыв срга Оооемойадгоеср Д Дог(»ф паДОГы Сит ».*iivtnpa До* пвсЖАГаи м К Дог ооф». '»• лрл1« CU TbttSbfe 188
Табличное поле Как задать список выбора для колонки «ВидДокумента»табличногополя? В составе табличного поля «ПодборД энных» есть колонка «ВидДокумента», тип значения Строка. Необходимо обеспечить возможность заполнения ее данных выбором значений из видов документов конфигурации. Если значение вводимых данных может только выбираться из перечня существующих в конфигурации документов - лучше всего войти в свойства колонки «ВидДокумента» и элементом управления указать «Поле выбора». Далее при открытии формы можно через метаданные прочитать все виды документов конфигурации и передать их в виде списка значений свойству СпиеокВыбора элемента управления колонки «ВидДокумента»: Процедура ПриОткрьпмиО СписокВнловДокумснтов = Новый СпнсокЗначений; Для Каждо! о Доку ментКонфигу рации нз Метаданные. Доку менты Цикл СписокВидовДоку мент он. Добавили Доку мент Конфигурации. Имя); КоиецЦикла; Элемен гы Формы. ПолборДан н ых . Колонки. Ви дД о ку ме» i та .Элсмеш У правления.СписокВыбора « Список ВидовДоку мен юн: |КонеиПроцедуры Если же по какой-то причине необходимо все же дать возможность пользователю вводить в колонку произвольные виды документов (сверх списка документов текущей конфигурации) - тогда элементом управления колонки «ВидДокумента» необходимо указать «Поле ввода», и интерактивно или программно установить для него свойство КнопкаСпискаВыбора. Например - так: ЭлемеигыФпрмы ПодборДанных . Кол он к и. В ид/ (оку ме нта . Элементу 1гр0НленияКнопкпСшкк11Выбора ж Истина: 189
Формы и элементы управления Как обеспечить возможность отбора и сортировки данных по реквизитам, не отображаемым втабличном поле формы списка справочника? Э. 1сме1ПыФормы.Спр4<1ючннкСпнсок Настройка01бора.ОсновнойПосгави111К Доступность = Истина; Элемент ыФормм СпраиочннкСпнсок .Нас1ройка11оря.1ка.(Хт1ов11ой11ос1аа111ик.Достут<ос1ь - Истина; Как видите, для того, чтобы добавить возможность интерактивного управления отбором и сортировкой по реквизиту «ОсновнойПоставщик» необходимо поработать со свойствами Настрой каОтбора и Настройка Порядка расширения табличного поля списка справочника. Какреализоватьперетаскивание между элементами управления? Необходимо реализовать возможность заполнения табличной части документа номенклатурными позициями, используя механизм перетаскивания («drag and drop»). Для иллюстрации данной возможности в основной форме документа (в этом случае «Поступление товаров») определим реквизит формы «СправочникСписок» (тип СправочникСписок. Номенклатура). Далее вставим элемент управления ТабличноеПоле и через свойство Данные свяжем его с созданным реквизитом. У табличного поля, связанного с табличной частью документа отметим свойство Разрешить перетаскивание. У табличного поля, связанного со списком номенклатуры необходимо отметить свойство Разрешить начало перетаскивания. Определим обработчик события Начало перетаскивания у табличного поля, связанного со списком номенклатуры: Процедура Hoven к; гагу pal 1лч4ЫоПеретаскинання( Элемент. Пара vei рыПереыскннання. Стандар гнаяОбрабитка > И Получить значение, переданное системой. 190
Табличное поле Значение = 11арамстры11срстаскивания.3изчснис; // В любом сл> чае значением будет массив. МасснвЗначсний = Новый Массив; // Если перетаскивается группа, то в массив записываем входящие в нее элементы Если Значение.ЭтоГр> ина Тогда Выборка = Справочники.Номенклатур* Выбрати Значение); Пока Выборка.СлелуюшинО Цикл Если Нс Выборка.ЭтоГруппа Тогда МасснвЗначсний. Добавите Выборка-Ссылка). Конец Если. КоиецЦикла. Иначе МасснвЗначсний Добав1т>( Значение): КонецЕсли; // Заполненный массив записываем в параметры. Параметры Перетаскивания .Значение ® МасснвЗначсний; КонеиПроиедуры Обработчик события Проверка перетаскивания у табличного поля, связанного с табличной частью документа. I 1ротк.чура Товары! 1ровсрка!1срстаскнвания(Элсмеит, ПараметрыПеретаскивания. С тан дартн ая( ХЗрабог ка. Строка. Колонка) С танлэртнаяОбработка = Ложь; 191
Формы и элементы управления Обработчик события Перетаскивание у табличного поля, связанного с табличной частью документа. Параметры П сретас к и ва 11 ия. С тандартнаяОбработка. Строка. Колонка) ПолучснныйМассив = ПараметрыПеретаскивання.Значение; Если 1ипЗнч( Полученный Массив)« Тип( "Массив’) Тогда Для Каждого Значение Из Полу ценный Масси в Цикл НаваяС (рока Доку ментОбьект. Товары. Добавить! i; НоваяСтрока. Номенклатура = Значение; НоваяСтрока. Количество = I; Конец! (икла; КонеиЕсли; КонецПронедуры В результате получим возможность «набрасывать с помощью мыши» в табличную часть документа номенклатурные позиции справочника либо поодиночке, либо все входящие в «захваченную» группу. 192
Табличное поле Как вывести остатки на складах в списке номенклатуры? Для этого в табличное поле, отображающее список справочника «Номенклатура» следует добавить колонку (например, с именем «Остаток») и использовать событие При получении данных табличного поля, отображающего список номенклатуры: Процедура С|1ИсокНоменк*1»гураПриНолученииДа11ных( Элемент. Оформ л сн и яСтрпк) Запрос Новый Запрос}"ВЫБРАТЬ | Товары! 1а(?клалах()статкн.КоличсствоОстаток КАК Остаток. | Товары НаСю1адахОсгатки.Номенкл атуре .Ссылка КАК Товар |ИЗ | РсгнстрНакоплсння.1овары НаС кладах.Остатки(. Номенклатура В (&МассивТоваров)) | КАК Товары I i«iC к. laaaxOci атки"); Масси в Номенклатуры = Новый Массив, //для передачи а параметр запроса Соответствие = Новый Соответствие; //для заполнения остатков в строках // табличного поля /Ст я Каждого ('трока из Оформлен мяСтрок Цикл Масс ивН оменклату ры. Добавитъ/Строка.ДлннысСтроки .Ссылка >; Соответ ст вне. Встави пД Строка. ДанныеСтроки Ссылка. Строка); КонепЦикла; Запрос. Уста нови тъПарамегрС'МасспвТоваров", МассивНоменклатуры), Выборка = Запрос. Выполни гы ). ВыбретЫ); // Вывести остаток в строку. найденную в соответствии по номенклатуре // из запроса. Пока Выборка.Следующий} > Цикл Соответствие.! 1олучить( Выборка. Товар.СсылкакЯчсйки.Остаток.Значсняс = Выборка Остаток; Конец! 1икла; КдтцПрооелуры В параметре «ОформленияСтрок» обработчика этого события передается коллекция оформлений строк, которые были выведены в табличное поле. Это позволяет получать остатки одним запросом для всех выведенных строк, что значительно сокращает время обработки данных. 193
Другие элементы управления © В форме есть панель со страницами. Как разместить картинку назакладке? Допустим, имя панели «ОсновнаяПанель», имя страницы «СчетаУчета», картинка уже есть в библиотеке картинок с именем «ДебетКредит». Тогда так: )лсмснтыФормы.(кновная11ансль.Страницы.СчстаУчста.КдртинкаЗаголояка Библиотек aKapi инок.ДсбсгК'редн! Если же картинка «свеженарисованная» - необходимо предварительно добавить ее в состав метаданных (раздел «Общие картинки»). С точки зрения эргономики просьба сильно не увлекаться и применять подобное только в случае необходимости. Картинка приковывает внимание пользователя к закладке, но за счет этого снижается восприятие остальной информации. 194
Другие элементы управления ® Как обеспечить, чтобы при открытии формы уже записанного элемента справочника «Контрагенты» активной была закладка «СчетаИДоговоры» панели «Панель»? В модуле формы элемента используем обработчик события При открытии: Процедура ПриОткрытииО Если 'ЭтоНояый( I = Ложь Тогда ЭлементыФормы. Панель.ТекущаиС граница = ЭлеменгыФюрмы .Панель Страницы Счета ИДси оворы; КонсцП роцедуры Убеждаемся, что открываем форму не нового элемента. Далее устанавливаем свойству ТекущаяСтраница панели «Панель» значение требуемой страницы. Какорганизовать выбор из нескол ькихсписков документовдл я открытия? Необходимо реализовать возможность выбора нескольких списков документов для открытия: 195
Формы и элементы управления Это можно выполнить следующим способом: Док = Merxiaimwc. Документы; СписокДоку ментов Новый СписокЗначеннй! К СписокДокуменгов Добавить! Док.Пла 1сжноеПорученнсИсхоля1цее.. Ложь); СписокДокументов^'(обавить! Док. I 1латсжносПоручсннсВходяшсс., Ложь к СписокДоку мемтов.ДобавнгМ Док.АккредизнвПерг ланный. . Ложь); СинсокДокумай or Добани i ы Док АккредитивПолучсн н ый.. Ложь»; СписокДокументов. Добавить!Док.!I латежносТрсбованнсВьiставленное,, Ложь); СписокДокументов.Добавить!ДокПлатежноеТребован не Получен нос.. Ложь); СписокДоку ментов.Добавиг ь(Док. Инкассовое! [оручсние!1с редан ное.. Ложь); СлисокДоку ме1повДобани1Ь(Док.Инк<кховоеПоруче1шеПолучешюе., ЛожьН СписокДокуменюв.ДобавитНДок.ПлагежныйОрдерСписаниеДенежныхСредств., Ложь); СписокДокументов. Добавите Док. Плзтсжный()рдерПоступ1ен11сДснсжныхСрсдств, Ложь); Если СписокДокументов .ОтметтъЭдеменгы! "Укажи ie. какие списки документ он онсрычь") Toi да Для Каждого Название; Документ л из СписокДоку ментон Цикл Если Название Документа. Пометка Тогда ФормаСпнска к Документ ы[НазваниеДокумен i а.Значение. Имя | ФормаСпнска.От крыты); КонецЕсли; КонецЦикла; КонецЕслн; Создаем список значений «СписокДокументов». Добавляем в список значений элементы, содержащие объекты метаданных документов конфигурации в качестве значения, и ЛОЖЬ в качестве значения свойства Пометка (флажок снят). Порядок заполнения параметров метода Добавить(): Значение, Представление, Пометка, Картинка. Далее открываем пользователю модальное окно для установки пометок в списке «СписокДокументов». Если, установив требуемые пометки, пользователь нажмет «ОК» - открываем цикл перебора элементов «СписокДокуменов». В цикле для тех элементов, на которых пометки установлены, выполняем получение и открытие основной формы списка документа по имени объекта метаданных. 196
Другие элементы управления Как можно организовать подстановку обращения кперсоне? В поле ввода «Персона» пользователь вводит строковые данные с указанием имени абонента. Необходимо по окончании ввода предоставить возможность подстановки начала фразы: «Уважаемый», «Уважаемая»... или никакого. Николай Федорович Уважаемый Николай Федоров*» Уважаемая Николай Федорее*» Уважаемое Николай Федоров»» Уважаемые Николай Федоров*» Николай Федорович Для решения данной задачи можно поработать с обработчиком события Окончание ввода текста поля ввода: Процедура ИсрсонаОкончанпсВволаТскста) Элемент. Текст. Значение, СтандаргиаяОбрабо! ка i Значение - Новый СпнсокЗначенийО; Знамен нс. Добавит М "Уважаемый " 4- Текст); ЗначемнеДобаишьСУважаемая ~ + Текст); Значение.Добави1ь( "Уважаемое " 4- Текст); Значенме.Доб«1ВИ1ъ<"Уважаемые " -4 Текст); Значение ДобэдитъГГскст); СтандартнаяОбработка = Ложь; Коне и П роистуры Создаем список значений со всеми возможными значениями обращений и отключаем стандартную обработку события. Теперь, при формировании значеня по имеющемуся в поле ввода тексту (например, при переходе к другому элементу управления по клавише Tab), пользователю будет предоставлена возможность выбрать из нескольких возможных обращений к указанной персоне. 197
Формы и элементы управления Как в командной панели создать подменю с кнопками? Допустим, разрабатываемый отчет может формироваться в различных вариантах периодичности, которые содержатся в перечислении «Периодичность». Возможность выбора варианта построения отчета нужно оформить в виде подменю в командной панели « КоманднаяПанельФормы». Добавление подменю можно организовать следующим образом: КпопкиКоманлнойПанели = Элемент ыФормыКомандная! laneлъФормы Кнопки // Проверить, нет ли уже на командной панели кнопки "Сформировать // Если есть - удалить Индекс = Кнопки Командной!! имели .ИндексСКнопкиКоманднойПанели.НаЙтн! "Сформировать")); Ест Индекс = -1 Тогда Индекс = 0: Иначе КнопкиКоманднойПанели .Удал и гы И нлекс); КонецЕсли; И Создать подменю "Сформировать" 1!одмсню( формировать = Кнопки Командной Панели . Вставить/11 н леке. "Сформнрова lb". Тип КнопкиКоманднинПаиелн. Подменю. "С формировать"); // Добавить картинку. ПодмснюСформирова и». Карт инка = Ьиблио1екаКартинок.Сформирова1ь: 11олмснюСформировать.(>гображснис = ОтображснисКно/ ikh Командной! 1ансли Надпись Карт инка; // Опроси 1Ь перечисление’ о возможных вариантах периодичности. Запрос = Новый Запросе" ВЫ БРАТЬ Ссылка ИЗ Перечисление. Периодичность"): Выборка - Запрос.Выло, ши гъ().Выбрать!); 11ока ВыборкаЛСледующий! 11 (икл Период* Выборка.Ссылки; НодменюСформировать Кнопки.Добавить!"кн* л- Период. ТнпКнопкиКоманднойПэнсти.Действие. "Сформировать за " + Период. Ниный Действие! КнопкаСформироватьНажатие<’)); КонсцЦикла; 198
Другие элементы управления Поскольку к редактируемой командной панели придется обращаться неоднократно - «положим» ее в переменную «КнопкиКоманднойПанели». Далее убедимся, что в командной панели нет кнопки «Сформировать». Для этого сначала пытаемся найти кнопку по имени, а потом определить индекс кнопки в командной панели. Если такой кнопки нет - индекс имеет значение «-1», для дальнейшего создания нужной кнопки переменной «индекс» присвоим «О». Таким образом, наша кнопка будет первой слева, хотя могли бы установить ее любой другой по порядку. Если же индекс кнопки «Сформировать» не равен «-1» - он пригодится для удаления кнопки. Удаляем кнопку по индексу. Теперь можно приступить к созданию подменю «Сформировать». Указываем в качестве параметров индекс, имя, тип и название создаваемой кнопки. Обратите внимание, все элементы объекта КнопкиКоманднойПанели это объекты КнопкаКоманднойПанели. А вот свойство Тип объекта КнопкаКомандноЙПанели уже назначается из системного перечисления ТипКнопкиКомандноЙПанели. В нашем случае - это Подменю. По умолчанию на созданной кнопке отображен только текст. Если хотим разместить еще картинку - необходимо указать значение свойства Картинка (передаем картинку из коллекции, хранящейся в библиотеке картинок данной конфигурации). Если будете назначать свою - не забудьте, что размер картинки для кнопки должен быть небольшим (оптимально - 16x16 пикселей). Чтобы картинка не вытеснила текст — устанавливаем свойству Отображение соответствующее значение. Теперь соберем запросом все возможные значения из перечисления «Периодичность», поскольку запрос позволяет обратиться к нужной таблице. В цикле перебора выборки из результата запроса добавляем к нашему подменю кнопки аналогично тому, как добавляли само подменю к командной панели. Единственное отличие - для кнопок указываем последним параметром действие, которое создаем конструктором, с указанием вызываемой процедуры - обработчика события Нажатие на кнопку. 199
Формы и элементы управления Тело вызываемой процедуры может выглядеть так: 11роцслура КиопкаСформироватьНажатхсОлсмсят) Наткаиие! 1ериоличносгн Стр Заменить^ Элемент. Имя. "кнн. **"). KoHeitflpoiic.iypi.i Получаем название периода из самого названия кнопки, заменив приставку «кн» на пустую строку. Теперь, опираясь на это название, можно выполнить в том или ином виде отчет. Как созданной кнопке назначить «горячие клавиши»? Допустим кнопке «СозданнаяКнопка» нужно назначить комбинацию клавиш «Ctrl+Alt+L». Сеидаи наяКнопка. Сочетаю icKji.i ви ш » Новый Сочетай не Клавиш,Клавиша.L. Истина, Истина.); Устанавливаем значение свойству Сочетание Клавиш значение, полученное конструктором НОВЫЙ. Первым параметром конструктору нужно передать основную клавишу сочетания. Ее значение берем из системного перечисления Клавиши. Остальными параметрами передаем признак участия других клавиш: вторым - «Alt»; третьим - «Ctrl», четвертым - «Shift». Замечания: горячие клавиши можно назначать только кнопкам с типом «Действие» (не подменю, и не разделитель). И обратите внимание на значения системного перечисления Клавиша - русских букв там нет. 200
Другие элементы управления Как реализовать заполнение возможных значений поля выбора «ОбрабатываемаяТабличнаяЧасть» при заполнении поля ввода «ОбрабатываемыйДокумент»? Есть поле ввода «ОбрабатываемыйДокумент». В качестве данных - реквизит формы «ОбрабатываемыйДокумент» (тип значения ДокументСсылка). Есть поле выбора «ОбрабатываемаяТабличнаяЧасть». В качестве данных - реквизит формы «ОбрабатываемаяТабличнаяЧасть» (тип значения - Строка, имеется в виду представление обрабатываемой табличной части). Необходимо обеспечить, чтобы при выборе пользователем значения «ОбрабатываемыйДокумент» заполнялся список выбора поля ввода «ОбрабатываемаяТабличнаяЧасть». Для решения этой задачи используем обработчик события При изменении поля ввода «ОбрабатываемыйДокумент»: I 1ропсдура (ХбрабатывасмынДокумснтПрнИтмснснниОлемснт) СпнсокВыбора и Элемен гыФормы .Обрабд । ываемаяТ ;кбличнаиЧаС1Ь .СппсокВыборв. СпнсокВыбора Очиститы ); Если Элемент Значение о Heoi (редел ено И Не< Элемент.Знамение. Пуст&яО) Тогда ТаблкчнысЧастн = Элемент..1начснис.Мстаданныс().ТаблнчнысЧасти; Для Каждого ТабличнаяЧэсп» нз ТабличнысЧастн Цикл С|пгсокВыбора.Добивить(ТабличнняЧж:ть); КоиецЦикла; КонецБсли; КоненП роме дуры Сначала создаем переменную «СпнсокВыбора», содержащую список выбора поля «ОбрабатываемаяТабличнаяЧасть». Очищаем его, чтобы при последующих выборах других документов в качестве обрабатываемых - список выбора не разрастался. 201
Формы и элементы управления Далее определяем, что в качестве значения «ОбрабатываемыйДокумент» указана ссылка на конкретный документ. Через метод Метаданные() определяем коллекцию табличных частей документа. В цикле их перебора добавляем значения к списку выбора поля «ОбрабатываемаяТабличнаяЧасть». Кроме того, желательно побеспокоится о возможности очистки значения поля ввода «ОбрабатываемыйДокумент». Скорее всего - есть смысл при этом очистить и поле выбора «ОбрабатываемаяТабличнаяЧасть». Этого можно добиться посредством обработчика события Очистка поля ввода «ОбрабатываемыйДокумент»: Процедура Обрабатываем1.1ЙЛокумсигОчнетка( Элемент, СтанларнаяОбработка) Обрабатываемая ГаблнчнаяЧасть = КонецПроцелурЫ Ф Если пользователь указал несколько дат в поле календаря - как их перебрать? Если элемент управления ПолеКалендаря имеет режим выделения даты Множественный, пользователь может выделить несколько дат на календаре: 202
Другие элементы управления Выделенные пользователем даты легко перебрать следующим образом: КоллекиияДа! Э.1еме1ПыФирмы.Пак.'Ка.:1сндаря.Выдс.к'нныеДа'гы; Д|я каждого ДртаКалеыларя на Коллекция Ди, I [ик.и Сообщил ыДагаКалендаря >; КоиецЦикла; Как видите, свойство поля календаря Выделен!(ЫвДаты содержит коллекцию указанных пользователем дат. Сам же режим множественного выбора может включаться интерактивно в конфигураторе посредством соответствующего свойства элемента управления. Или таким образом: Элемент ыФормы.11о.1еКалендаря.РежимВыделепия = РежимВыделенняДаггы .Множественный; В данном случае значение свойству было назначено из системного перечисления РежимВыделенияДаты. ф Как организовать работу с индикатором? Допустим, у нас есть «РезультатЗапроса». Работа с перебором его выборки занимает много времени. Тогда, чтобы показать пользователю прогресс процесса, можно добавить в форму элемент управления Индикатор. Пусть его имя будет «ИндикаторПеребора». В свойствах данного элемента управления можно указать сразу начальное и максимальное значения; ориентацию продвижения процессора (слева-направо или сверху-вниз); стиль отображения - или гладкий, или прерывистый, или прерывисто-наклонный (выбирается из системного перечисления РежимСглаживанияИндикатора); отображать или не отображать проценты. В теле же выполняемой процедуры необходимо лишь в нужные моменты присваивать значение свойству Значение индикатора. 203
Формы и элементы управления Например, так: Индикатор = Элсмсн г ыФормы. Индика гор! lepevupa; Индикатор.МаксимальноеЗначсннс Выборка. Количсс! вс Индикатор.Значение = О, Пока Выборка.Слсдающий!) Цнк КонецЦикла: Выполняем выборку по результату запроса. В цикле на каждом шаге присваиваем значение индикатору на единицу большее предыдущего. Обратите внимание - свойствами индикатора можно управлять и средствами языка: Выборка = РезультатЗапроса.Вмбратц); Индикатор * Элемен1Ы<1ч>рмы. Индика тор Перебора; Индикатор.МакснмальносЗначсннс = Выборка. Количество!'); Индикатор. Знамен нс в 0; Индикатор. Отображать Про центы = Истина; Индикатор.СтильОтображения = РежимС глаживанияИндн катера. Прерывистый; Индикатор.Орнснгация ж Ориентация.Вертикально; Индикатор. ИI аг = 0.1; Пока Выборка.Следующийи Цикл Индикатор.Значение = Индикатор.Значение + I: КонецЦикла; 204
Другие элементы управления Каку элемента управления сменить источник данных? Необходимо у элемента управления менять значение установленное в свойстве Данные. Предположим, что существует форма, у которой есть два реквизита: • СписокКонтрагентов (тип СправочникСписок.Контрагенты); • СписокНоменклатуры (тип СправочникСписок.Номенклатура). В диалоге размещен элемент управления ТабличноеПоле (имя «ТП»), Необходимо, чтобы в зависимости от действий пользователя через данный элемент управления можно было работать как со списком справочника «Номенклатура», так и со списком справочника « Контрагенты». Следующая процедура «переключит» табличное поле в «режим» работы со справочником «Контрагенты». Процедура КнолкаВыполни i ьНажатие( Э.кмент) ЭлементыФормы.ТП .Данные = "СпнсокКонграгентшГ*, ЭлементыФормы.ТП.СоадатьКолоикнО; КоцеиПроцедуры Следующая процедура «переключит» табличное поле в «режим» работы со справочником «Номенклатура». 11роцсдура Номенклатура! Кнопка) ЭлсмснтыФормы.Т!I.Данные - ’’Список Номенклатуры"; Элементы Формы. ТII.Создать Колонки!); К онецП роцедуры 205
Формы и элементы управления ф Как задать представление даты, отображаемое в поле ввода по-умолчанию? Для этого нужно воспользоваться свойством Формат поля ввода и в форматной строке задать требуемое значение параметра ДП, отвечающего за представление «пустой» даты. Если поле ввода отображает только дату, может использоваться, например, следующее значение: 206
Другие элементы управления Если поле ввода отображает только время, может использоваться, например, следующее значение: 207
Формы и элементы управления Если поле ввода отображает и дату, и время, может использоваться, например, следующее значение: Аналогичного результата можно добиться программным способом: 208
Другие элементы управления ф Как вывести текст в поле картинки в том случае, если картинка не выбрана? Для этого следует использовать свойство ТекстНевыбраннойКартинки элемента управления ПолеКартинки. Его можно задать при конфигурировании: или программно: Элемснт1лФормы.(кн<жиосИюбражснис.ГскстНсвыбраннойКарт11нкн = ’’фогогрвфн» номенклпуры отсутствует"; 209
Формы и элементы управления В результате, в случае, если картинка не выбрана, в поле картинки будет выведен указанный текст: 210
Другие элементы управления ф Как открыть пользователю стандартный диалог выбора цвета? Для работы со стандартным диалогом выбора цвета предназначен объект ДиалогВыбора Цвета. Организовать выбор цвета пользователем можно с помощью следующего кода: Диалог = Новый Диалог Выбора! [вега: Если Диалог'.ВыбратьО Тогда Выбранный Цвел = Диалог .Цвет*. КонеиЕсли; Аналогичным образом организуется и выбор шрифта при помощи стандартного диалога (используется объект ДиалогВыбораШрифта): Диалог Новый Диалш Выбора Шрифт а. Если Диалог.Выбрагм) Тогда Выбранный! Прифт = Диалог. Шрифт: КоненЕсли, Следует заметить, что в тех случаях, когда выбор цвета или шрифта пользователь должен выполнять в форме (например, в форме отчета), достаточно просто разместить в этой форме поля ввода с соответствующими типами значений (Цвет или Шрифт). Тогда при нажатии на кнопку выбора в режиме ЮПредприятие будет открыт стандартный диалог выбора цвета (шрифта), а выбранное пользователем значение сохранено в реквизите формы, связанном с данным полем ввода. 211
Формы и элементы управления Какзаполнить список в форме данными запроса? Для наиболее быстрого вывода результата запроса в список, расположенный в форме, можно воспользоваться методом глобального контекста ЗаполншьЗначбНИяСвОЙСТВО. При этом следует полям запроса установить псевдонимы, соответствующие свойствам элемента списка значений: Запрос = Новый Запрос!" [ВЫБРАТЬ | Номенклатура. Ссылка КАК Значение. | Н омсн к л ату pal 1рслставлснис КА К I 1рсдставлснис. | ИСТИНА КАК Пометка |ИЗ | Справочник. Номенклатуре КАК Номенклатура |ГДЕ | Номенклатура.ОсновнонПоставшнк = &Осн<жнонПоста1нцикм); Запрос.УстановитьПарачетр! "ОсновнойПоставщик”. ПолеПостаышпс); Выборка = Запрос. Выполнить!)- Выбрать!); Пока Выборка.С ледуюший!) Цикл ЗагюлннтьЗначснняСеойстти ПолсСписка .Добавить! >, Выборка); КонецЦикла: © Как отобразить в форме файл графической схемы? Для этого необходимо разместить в форме поле графической схемы (например, «СтруктурнаяСхема»), а затем выполнить чтение файла графической схемы и вывод его в поле, расположенное в форме: Схема « Новый Г рафическвяСхсма!); <’хсма. Прочитаты*D:^MySchcmc grs"); ЭлемгнтыФормы.СтруктурнаяС'хема.УстановитъСхему(Схема); 212
Интерфейсы, стили ф Какзадать различные стили 1С:Предприятиядляразличныхкатегорий пользователей? Для этого следует воспользоваться свойством глобального контекста ГлавныйСтиль: ОсновнойИнтерфсйс = 11ользоватсл и Информ анионной Базы .Текущий! 1пльзоватслМ) .Основной Интерфейс .Имя; Если ОсновнойИнгсрфенс = ИнтсрфснсКасснра’ Тогда ГлавныйСтнль » БнблиигскаСтмлей.СтнльКассира; ИначсЕсли Основной Интерфейс — "Планирование" Тогда I лавныйСтнль Би6.1И0Тск1Стилей.СтильПлаиирования: Иначе I лавнынС тиль - БиблиотскаСтнлсй.Основной; КонецЕсли; Следует учитывать, что изменение данного свойства возможно только до того, как открыто главное окно приложения (например, в обработчике события приложения Перед началом работы системы). 213
Формы и элементы управления Есть список имен интерфейсов с пометками. Как сделать помеченные интерфейсы видимыми? СгрокаИмеиИ|ггерфейсои =" Для Каждого ИмяИнтсрфсйсв из СписокИнтсрфссов Цикл Если ИмяНигерфейса Помсгка Тогда СтрокаМменИкгерфсйсов = СтрокаИменИнтерфейсов + ИмяИнтерфейеа + КонецЕсли: КоиецЦикла; Главный Интерфейс.ПсреключигьИнтерфейсЧСтрокаИменИи терфсйсов); Создаем строковую переменную «СтрокаИменИнтерфейсов» для указания через запятую имен помеченных интерфейсов. В цикле перебора списка заполняем ее. Посредством свойства глобального контекста Главный Интерфейс требуем снять видимость всех интерфейсов и включить видимость только тех, чьи имена перечислены в строковой переменной « СтрокаИменИнтерфейсов». Замечание: для интерфейсов, у которых свойство Переключаемый будет иметь значение Ложь - отключение не произойдет. Обычно такое привилегированное положение занимает некий «базовый» интерфейс, содержащий хотя бы меню «Файл» и «Справка». 214
Интерфейсы, стили Как из формы обработки отключить глобальный обработчик ожиданий? Обработчик ожидания есть и у формы, и у глобального контекста. Поэтому если обработчик ожидания включен в модуле приложения, то отключать его следует тоже из модуля приложения. Например, подключение: I Iponciypa При! 1ачдоеРаботыСистемы() 11сиис1К>Ч1ПъОбр0богчикОжидан11Я(м11роверкаОпроса*. 60); Конец Процедуры Отключение - в процедуре модуля приложения: Процедура (УткачОтОпросаО Экспорт □гключитьОпрабшчикОжиданияС’ПронсркаОпроса' К Конец! |роцедуры А в форме обработки - вызов процедуры: ОтказОтОпроса) К Поскольку процедура «ОтказОтОпроса» в модуле приложения написана с указанием ключевого слова Экспорт - управление будет передано на нее, и в результате - добьемся желаемого. 215
Запросы, отчеты Запросы Как получить данные из табличной части документов? Например, требуется получить все номенклатурные позиции, указанные в табличной части «Товары» документов «РеализацияТоваровУслуг». Для этого можно воспользоваться запросом со следующим текстом: ВЫБРАТЬ РАЗЛИЧНЫЕ Реализация Г оваровУслутТовары. Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг Товары КАК РеалнзащшТоваровУслуг Говары В качестве источника указываем табличную часть документов - таблицу «Документ. РеализацияТоваровУслуг.Товары». Выходным полем объявляем поле «Номенклатура», входящее в состав таблицы источника. Кроме того, поскольку одна и та же товарная позиция, естественно, могла присутствовать и не один раз в документах - применяем РАЗЛИЧНЫЕ для получения только различных строк в выходной таблице запроса. В результате получим таблицу вида: ______________Номенклатура________ Женские ботфорты коричневые______ Ботинки женские демисезонные_____ Ботинки женские натуральная кожа Женские босоножки________________ Комбайн кухонный B1NATONE Н1 67 Кофеварка BRAUN KF22R 216
Запросы Как получить данные из табличной части документов и представить их в иерархическом виде? Например, требуется получить все номенклатурные позиции, указанные в табличной части «Товары» документов «РеализацияТоваровУслуг» с указанием иерархии номенклатуры. Для этого можно воспользоваться запросом со следующим текстом: ВЫБРАТЬ РАЗЛИЧНЫЕ Реализация ГоваровУ слуг Товары.Номенклатура КАК Номенклатура ИЗ Доку мент.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ИТОГИ по Номенклатура ТОЛЬКО ИЕРАРХИЯ В качестве источника указываем табличную часть документов - таблицу «Документ.РеализацияТоваровУслуг.Товары». Выходным полем объявляем поле «Номенклатура», входящее в состав таблицы источника, применяем РАЗЛИЧНЫЕ для получения только различных значений в выходной таблице запроса. Далее вводим промежуточные итоги только по группам, в состав которых входят найденные в документах номенклатурные позиции. Если иерархию результата запроса отображать при помощи отступов, получится следующее: Номенклатура___________________________ Обувь__________________________________ Женская обувь_______________________ _______Женские ботфорты коричневые______ _______Ботинки женские демисезонные_____ _______Ботинки женские натуральная кожа _______Женские босоножки________________ Мужская обувь_______________________ _______Мужские мокасины_________________ _______Мужские ботинки демисезонные_____ Бытовая техника________________________ Кухонные >.1екг1х>н риборы__________ _______Комбайн кухонный BIN'ATONE FP 67 _______КгиКнарка BRAUN KF22R____________ 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, тогда текст запроса выглядел бы так: ВЫБРАТЬ Реализация 1 оваровУслу!Товары.Номенклатура КАК Номенклатура. СУММА(Рса.тнчацияТовзровУслугТовары Количество! КАК Количество ИТ Дркуменг. Реал изацияТоваровУ слуг .Товары КАК РеВлизацияТоваровУслугТовары СГРУППИРОВАТЬ по Реализация 1 оваровУ слуг Товары. Номенклатура ИМЕЮЩИЕ СУММЖРеализаиияТоааровУслугТовары Количество) > Ю 219
Запросы, отчеты Для реализации условия отбора на значения агрегатных функция применяется предложение ИМЕЮЩИЕ. В результате получим таблицу вида: Номенклатура Количество Женские ботфорты коричневые 49 Женские босоножки 19 Комбайн кухонный BINATONE FP 67 13 Замечание: не путайте с условием ГДЕ. Эго условие налагается на исходные записи. В результате, если бы не было ни одного из документов, где количество товара в строке больше 10 - результатом запроса была бы пустая таблица. Как ограничить выборку из виртуальной таблицы? Для этого лучше всего выполнить запрос по виртуальной таблице соответствующего оборотного регистра «Продажи». Дело в том, что данный регистр и предназначен для решения этой задачи. Именно в нем уже собрана из различных документов (регистраторов) необходимая информация. ВЫБР?\ТЬ 11родажиОбороты.Номенк.1агура КАК Номенклатура ИЗ Pei нс грН а копления 1|родажм.()бороп>а(&/1зтцНа,1. A/laiaKoH) КАК ПмдажиОбороты В качестве источника выбираем таблицу «РегистрНакопления.Продажи.Обороты». В качестве параметров задаем для нее дату начала и дату окончания периода, за который необходимо собрать обороты. Обратите внимание, виртуальная таблица - самогруппируема. Детальность ее записей определяется составом ее же выходных полей. 220
Запросы Какпросуммироватьданные неодинаковым значениям одного из полей выборки? Например, требуется получить информацию о продажах товаров с подведением итогов по объемам продаж подразделениями: Подразд. Номенклатура Кол-во Оборот Стоимость Оборот Отдел оптовой пр одажи 58 167,12 Отдел оптовой пр одажи Женские ботфорты кор ичневые 49,000 4 430,39 Отдел оптовой пр одажи Ботинки женские деми сезонные 6,000 246,69 Отдел оптовой пр одажи Ботинки женские натур альная кожа 6,000 320,44 Отдел оптовой пр одажи Женские босоножки 19,000 1 028,23 Отдел оптовой пр одажи Комбайн кухонный ВТ NATONE FP 67 13,000 5 493,73 Отдел оптовой пр одажи Кофеварка BRAUN KF 22R 6,000 4 427,36 Отдел розничной продажи 632,33 Отдел розничной продажи Причуда (вафли) 5,000 2,36 Отдел розничной продажи Принц (печенье) 4,000 4,01 Отдел розничной продажи Сердечко (печенье) 5,000 3,83 221
Запросы, отчеты Поскольку в оборотном регистре «Продажи» есть измерения «Номенклатура» и «Подразделение», решить задачу можно посредством следующего запроса: ВЫБРАТЬ ПродажиОборотыJ 1одраздслснис КАК 11олраждслсние. Прп.шжиОборогы.Иоменклагура КАК Номгнкллура, 11родажиО(юрагы.Количес11и)Об1»р01. П рилаж иОборо гы .С тоимостьОборот КАКС той мостьОбк >рот ИЗ Ре< ис1рНакоплснии.И|ю,'иж»1,(Мм>р0гы((&/'1атаНа,1, &Дд гаКон) КАК ПродажиОборагы ИТОГИ СУММА(С |оимостьОборот) ИО 11 одрздзслен ие В качестве источника используем виртуальную таблицу регистра с указанием временных параметров для ограничения интервала сбора оборотов продаж. В качестве выходных полей указываем «Подразделение» и «Номенклатура», плюс обороты по нужным ресурсам. Для того, чтобы добавить промежуточные итоги по полю «Подразделение» используем ИТОГИ ПО. Причем для итоговых записей применяем агрегатную функцию СУММА() для поля «СтоимостьОборот». 222
Запросы Как получить только те записи, в которых значение определенного поля превышает указанное значение? Например, требуется получить информацию о продажах товаров определенным подразделением в количестве, превышающем некоторое пороговое значение. При решении этой задачи для оборотного регистра «Продажи», в составе которого присутствуют измерения «Номенклатура» и «Подразделение», можно выполнить запрос со следующим текстом: ВЫБРАТЬ 11родажиОбороты Подраътслснис КАК Полрахделецие. ПродажиОбороты.Нименклатура КАК Номенклатура, П родажиОбороты. Kai ичес твоОборот, Прод,1ЖиОоо[к>ты<тоимосгьОГк»ро1 КАК СтоимостьОборот ИЗ Регис1рНакопления.Продажи.Обороты(&ДатаНач. &ДатаКон,. Подразделение = ^Подразделение! КАК ПродажиОюроты ГДЕ Продаж иОбороты КолмчесгвоОборот > & Порог В качестве источника используем виртуальную таблицу «РегистрНакопления.Продажи.Обороты» с отборами по началу и концу периода сбора оборотов, и с отбором по значению измерения «Подразделение». Обратите внимание, применение отбора уже в виртуальной таблице позволяет существенно повышать быстродействие запроса. Поскольку отбор сработает еще при построении виртуальной таблицы. Для оборота по ресурсу отбор можно применить уже только после построения виртуальной таблицы, поскольку именно она и вычисляет это значение. Значит, отбор записей с количеством продаж, превышающим пороговое значение, производим посредством предложения ГДЕ. 223
Запросы, отчеты Как обратиться к подчиненным полям в запросе? Например, требуется получить данные о продажах контрагентам, но в регистре «Продажи» нет измерения «Контрагент», а есть только измерение «ДоговорКонтрагента». Поскольку справочник «Договора» явл5*ется подчиненным справочнику «Контрагенты», то по сути дела идет речь о получении данных в разрезе владельцев договоров, попавших в данные регистра. В подобных случаях можно пользоваться так называемым «разыменованием» полей, когда к нужному полю можно «добраться через точку»: ВЫБРАТЬ Продажи! Мюраты-ДоговорКон г рагента. Владелец. 1I родами Обороты. КоличсствсОборол. НродажиОбороты.СтоимосгьОборег КАК СтоммистьОборот ИЗ Ре» истрНакопления. Продажи Обороты!ЛДатэНач. ЛДааКон) КАК ПродажиОборот ы Если у одного контрагента может существовать несколько договоров, следует использовать группировку по владельцу договора, чтобы для каждого контрагента выводилась только одна строка: ВЫБРАТЬ Про дажиОбороты .ДоговорКонтрагента. В ш.лслсц, СУММА(ПродажиОбороты.КолнчесгвоОборот) КАК К|ЫнчествоОб<>рот, С У М М А( ПродажиОбори гы.С т оимос г ьОборот I КА К С1 онмост ьОбирот ИЗ РстстрНакопления.Продажи.ОборотыВ&ДдтаНач. <&ДатаКон) КАК ПролажмОбороты СГРУППИРОВАТЬ ПО ПролэжнОбороты.ДогояорКоитраг сита. Владелец 224
Запросы Как объединить результаты нескольких запросов? Например, требуется получить данные обо всех номенклатурных позициях, использованных во всех табличных частях документов «Реализация товаров и услуг». В составе документов есть три табличных части «Товары», «ВозвратнаяТара» и «Услуги». В составе каждой из частей есть реквизит « Номенклатура». Поскольку данные необходимо собрать со всех таблиц табличных частей - данную задачу можно решить посредством объединения запросов: ВЫБРАТЬ РАЗЛИЧНЫЕ Реализация ГоваровУслутТовары. Номенклатура КАК Номенклатура ИЗ Доку мен 1.Реа.1НзацияТоваровУс.|уг.Тоаары КАК Рсалн шция I ЬваровУ слугТовары ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ РеалимнияТоваровУ слугВозв ршнаяГира. Номенклатура ИЗ Документ Реализация!оиаровУ слуг.Возвратная!ара КАК Рею изацня ТоваровУелу гВозвра i иаяТ ара ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ Реализация 1 о варовУ слугУ слуги. Номенклатура ИЗ Документ.Реа.1изацияГоваровУслуг.Услуi и КАК Реализация ГоваровУслутУ слуги Получаем по табличной части «Товары» документа записи с различными значениями поля «Номенклатура», далее объединяем их с аналогично полученными записями по остальным табличным частям. Из- за того, что применили ОБЪЕДИНИТЬ, а не ОБЪЕДИНИТЬ ВСЕ в результате запроса останутся только разные строки даже в случае, если какая-то номенклатурная позиция оказалась указанной и в качестве товара и в качестве, например, тары (в нескольких таблицах). То есть, одинаковые строки заменятся одной. Замечание: объединение приводит, если выразиться проще, к добавлению строк в результат запроса. При использовании объединения обязательно должно совпадать количество выходных полей объединяемых запросов. 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 Поскольку речь идет о получении данных по товарным позициям, находящихся в остатках и одной и другой таблицы - решить задачу можно за счет применения внутреннего соединения таблиц источников: ВЫБРАТЬ ЗаказыГ1окуп1пелейОс1атки.Номенклатура. ЗаказыПокупате. ^Остатки КоличеспюОсппок КАК ЗакашюПокунаилями. Закалы! 1остав1гшкамОстаткн.КоличсствоОстаток КАК ЗакатаноПоставтикам ИЗ Ре1мстрНакопле11ня 'ЗакатыПокупотелей Остатки!&Дата()тч| КАК ЗакашПокупателейОеппки ВНУТРЕННЕЕ СОЕДИНЕНИЕ Pei неф! 1акоилсн1и<.ЗаказыПоставш>1Ка.м.Остатк11(&Да taOiM > КАК ЗакатыПостшшикимОстаиси ПО ЗакатыПокупателейОста1ки. Номенклатура = ЗакаиаПоставщикамОстатки. Номенклатура Соединение проводим по выполнению условия равенства полей «Номенклатура» обоих источников. Замечание: Соединение обычно используется, если выразиться проще, для добавления колонок из других источников к результату запроса. 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 Вентилятор ОРВНТА,STERLING,Ни. 6,000 Данную задачу можно решить за счет применения левого внешнего соединения данных источников в запросе: ВЫБРАТЬ Заказы! 1ок\ патслсЖ )стэтки. Номенклатура, ЗаказыПоклпагелсйОстатки.к'оиНРгествоОсгаток КАК ЗатаноПокупателямн. Заказы! 1остав1цикам<.)статки.КоличсствоОстат(»к КАК Заказано Поставит кам ИЗ Pei iici р! I акежленни. Заказы Гкжуна гелей.Ос пи ки(&Да гаОтч > КАК Заказы Покути гслснОстаткм ЛЕВОЕ СОЕДИНЕНИЕ Per истрНвкоилення.ЗаказыПоставшнквм.Осгатки(&ДатаОгч) КАК Закаты! 1осгявщнкамОстаткн ПО Заказы Поку на пмейОсланей 1(оменклатурш = Заказы Пост авшнк.змОстаткм. Номенклатура 227
Запросы, отчеты Замечание: по номенклатуре, остатков которой нет в регистре «ЗаказыПоставщикам» в записях результата запроса поле «ЗаказаноПоставщикам» будет содержать значение NULL. Не путать с нулевым значением! 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 Вентилятор ОРВНТА,STERLING,Нп. 6,000 Кроссовки мужские, кожа 10,000 100,000 Кофеварка JACOBS (Австрия) 150,000 Полусапожки на шнурках 100,000 228
Запросы Данную задачу можно решить посредством полного соединения: ВЫБРАТЬ ВЫБОР КОГДА (ЗаказыПокупателейОстатки.Номенклатура» ЕСТЬ NULL ТОГДА Зака 1ыГ1оитавщикамСХ:тзгкн.Номснкла1ура ИНАЧЕ Заказы 11окупатслс н Остатки. Номенклатура КОНЕЦ КАК Номенклатура. Заказы! (окупа iv.к.'йОстагкн КоличеспюОстаток КАК Заказано! Idkviiui елями. Заказы!Iixtubi пика мОс татки. Кол ичествоОстаток КАК ЗаказаноПостав!инкам ИЗ РегистрНакоплсния. Заказы 11окуиятслей .ОстаткиС&ДатаОтч) КАК ЗаказыПокупателейОс тки ПОЛНОЕ СОЕДИНЕНИЕ РегистрНэкоплсния ЗаказыПоставшикам.Остаткж&ДатаОтч) КАК ЗаказыПосгавщнкамОсгатки ПО 'Заказы 11окупатслсй( Хстаткн. Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура Обратите внимание, пришлось поле «Номенклатура» формировать данными другой таблицы-источника для случаев, когда товар только заказывался поставщику, но не заказывался покупателями. 229
Запросы, отчеты Или подобный результат можно получить за счет группирования данных вложенного запроса, полученного объединением запросов: ВЫБРАТЬ В.1оженпый'3ап рос.Номенклатура. СУММА(ВложеЕПШЙЭапрос.ЗаказаноПокупател*ми) КАК ЗакалэноПокунагелями СУ ММ А(В,1ожснныйЗапрос. Заказано! 1осгапщикам) КАК ЗакаигноПосгавтикам ИЗ (ВЫБРАТЬ ЗагшыИокунатслейОстатки.Номенклатура КАК Номенклатура. Закалы! 1оку11атслейОс'га1кн.КолнчествоОс1яток КАК Ззкатано!Зокунателями. О КАК ЗакзтаноПосгявщикам ИЗ ОБЪЕДИНИТЬ ВЫБРАТЬ ИЗ СГРУППИРОВАТЬ ПО Во вложенном запросе объединяем результаты запросов по остаткам в регистрах. Причем обеспечено, чтобы колонку «ЗаказаноПокупателями» формировали данные из регистра «ЗаказыПокупателей», а второй запрос в нее добавлял только нулевые значения. С колонкой «ЗаказаноПоставщикам» все с точностью до наоборот. Соответственно на выходе вложенного запроса получится таблица из трех выходных полей, в каждой из записей которой будет информация по заказанному поставщикам или покупателям. Чтобы свернуть эту таблицу - делаем запрос по таблице вложенного запроса и выполняем СГРУППИРОВАТЬ ПО по полю «Номенклатура», суммируя данные числовых колонок. 230
Запросы Как вывести некоторое значение вместо NULL взапросе? Для этого можно использовать функцию языка запросов ECTbNULLQ, которая возвращает значение своего первого параметра в случае, если он не равен NULL, и значение второго параметра в противном случае: ВЫБРАТЬ ECTbNULlJ Справочник. Номенклатура. Артикул, КАК Артикул, ('11 рано*। ннк Номенклагура.! 1 роди гав. ichiic КАК Номелк. iaтура Артикул Номенклатура hH-150003 Ботинки мужские П-130002 Полусапожки на шнурках 18009 Петр! Арт-88888 Сахарный песок Арт-4444 Юбилейное (печенье) Арг-8ЭЭЭЭ Крупа манная Арт-89000 Крупа гречневая Инвентарь Вилы Услуги Расходы на рекламу Расходы на ремонт Молочные Как вместе сданными некоторой таблицы получить общие итоги из этой же таблицы? Например, требуется получить отчет о стоимости проданных товаров с демонстрацией процентной доли каждой номенклатурной позиции. Необходимо построить отчет следующего вида: Номенклатура Сумма продаж Процентная доля Яблоки 500 50 Груши 350 35 Бананы 100 10 Манго-манго 50 5 231
Запросы, отчеты Причем строки таблицы должны быть отсортированы по убыванию процентной доли. Решение данной задачи может быть таким: ВЫБРАТЬ Про. ц*ж «Обороты. Номенклатура КАК Номенклагура, 11родажиОбороты.СуммаОборот КАК СуммаПродаж. 11родажиО(х)ро1ы.СуммиОборот /СовокупнысОбороты.СуммаОборот * |(И) КАК НроиснтнаяДоля ИЗ Pei 11сгрНаконлс>1нм.11ролажи.Оп(>рогы4&ДгпаНач. &Дат<|Кон) КАК ПродажиОбори1Ъ1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Регис!рНакш1лення.Прад*жм.Обороты(&ДатаНач, &Да гаКон) КАК СоэокупныеОбороты ПО ИСТИНА УПОРЯДОЧИТЬ по Процентная Дол я УБЫВ Сами данные получаем из виртуальных таблиц «РегистрНакопления. Продажи. Обороты». При построении запроса сложностью является получение в каждой записи сразу и значения «СтоимостьОборот» конкретной номенклатурной позиции, и совокупного значения «СтоимостьОборот» по всем номенклатурным позициям. Эта проблема решается посредством внутреннего соединения двух виртуальных таблиц «РегистрНакопления.Продажи.Обороты». Поскольку от второй виртуальной таблицы берем только значение поля «СуммаОборот» (без разреза по номенклатуре), то совокупный оборот будет проставляться в соответствие каждой записи из первой виртуальной таблицы. Причем, поскольку соединение внутренне - то в случае, если продаж за период не было, не будет выводиться пустая запись. Поле «ПроцентнаяДоля» каждой записи заполняется по формуле: Процентная доля = СуммаПродаж/СовокупныйОборот * 100. Далее производится сортировка, чтобы записи расположились по убыванию процентной доли. 232
Запросы Какполучить иерархические итоги по группе справочника? Например, требуется выбрать номенклатуру вместе с остатками на складе из нужной группы справочника. Причем по группам остатки должны суммироваться. Требуется получить данные в виде таблицы следующего вида: Номенклатура Остатки на складе (шт) КОЛГОТКИ 1120 Sanpellegrmo 420 Артикул 123456 (черные) 120 Артикул 123457 (капучино) 300 Sonata+ 700 Артикул 773456 (черные) 700 Артикул 774321 (черные) Оптимально по скорости данное действие выполняется при помощи запроса. Например, со следующим текстом: ВЫБРАТЬ ТомрыГруппы.Ссылка КАК Номенклатура. Товары НаС кладах Остатки КолтлествоОстаток КАК КоличествоОстаток ИЗ (ВЫБРАТЬ Номенклатура. Ссылка КАК Ссылка ИЗ Справочник Номенклатура КАК Номенклатура где Номенклатура-Родитель В ИЕРАРХИИ(&1 руппа) И (Номенклатура.ЭтоГруппа ЛОЖЬ) ) КАК Товары! руины ЛЕВОЕ СОЕДИНЕНИЕ Pei негр! (акшыеикя.ТонарыНаСкладах.Ocrai кн(&Мименг Получения, Номенклатура В ИЕРАРХИИ (&Группа)) КАК ТоварыНаСкладахОстатки ПО ТоварыГруппы-Ссылка = ТовдрыНаСюалахОстатки. Номенклатура ИТОГИ СУММА! КоличествоОстаток) ПО Номенклатура ТОЛЬКО ИЕРАРХИЯ В данном запросе выполняется левое внешнее соединение двух таблиц. 233
Запросы, отчеты Первая таблица получена вложенным запросом по таблице справочника с отсечением всех элементов, не входящих в требуемую группу и отсечением ее подгрупп. Вторая таблица - виртуальная таблица остатков по регистру «ТоварыНаСкладах». Первым ее параметром будет впоследствии указан момент времени, на который нужно получить остатки. Второй обеспечивает отбор данных при построении виртуальной таблицы только по товарам, входящим в нужную группу. Поскольку применяем левое внешнее соединение - результат будет содержать записи со всеми товарами, входящими в нужную группу. Теперь добавляем промежуточные итоги только по группам, в которые входят попавшие в результат запроса элементы справочника. 234
Запросы Как по состоянию на заданную дату по регистру «ОстаткиНаСкладе» найти последний документ «ПоступлениеТоваровУслуг», по которому приходила номенклатура? Сложность решения состоит в том, что из-за возможностей работать неоперативно, пользователь может формировать «ПоступлениеТоваровУслуг» задним числом - это раз. Кроме того, в общем случае платформа позволяет формировать записи регистра с периодом, не совпадающим с датой документа.. Поэтому решать задачу следует ступенчато. Сначала нужно найти по каждой номенклатурной позиции записи, сделанные документами «ПоступлениеТоваровУслуг» с максимальным на дату формирования отчета периодом. Потом нужно будет найти регистраторы, породившие эти записи. ВЫБРАТЬ В пожени ынЗапрос. Номе HK.iaiypit, МА КСИ МУМ( Товары НаС кладах.Регистратор) КАК Регистратор ИЗ (ВЫБРАТЬ ТоварыНаС'кладах.Ноыенклаггура КАК Номенклатура. МАКСИМУ М(ТоварыНаС кладах. Период) КАК Период ИЗ PetнстрНако11ленмя.Товары11аС кладах КАК ТоварыНаСкладах где ТоварыНаС кладах. Период &Да1аОгчета И (ТоварыНаК'кладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг) СГРУППИРОВАТЬ ПО ТоварыНаСкладах .Номенклатура ) КАК Вложен ныиЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ Per истрНакоплсння.ТоварыНаСкладах КАК ТоварыНаС кладах ПО ВложениыйЗанрос.Номеиклату ра = Товары НаС кладах. Номенклатура И ВложснныйЗапрос. Период Товары НаС кладах. Период ГДЕ (Товары НаСкладах. Регистратор ССЫЛКА Документ.ПоступлеииеТоваровУслуг) 235
Запросы, отчеты СГРУППИРОВАТЬ ПО В.тожснныйЗапрос. Номенклатура Итак, вложенным запросом по таблице записей регистра «ТоварыНаСкладах» находим для каждой номенклатурной позиции значение периода записи, максимально близкой к «ДатаОтчета». Источник - таблица записей регистра, выходные поля — «Номенклатура» и «Период». Применяем отбор по виду регистратора (посредством операнда ССЫЛКА будем брать только те записи, где регистратор входит в таблицу «Документ.ПоступлениеТоваровУслуг») и по периоду, не превышающему «ДатаОтчета». Потом применяем группирование по полю «Номенклатура» с определением максимально из значений поля «Период». Результат вложенного запроса соединяем внутренним соединением по совпадению поля «Период» с таблицей записей регистра (для которой произведен отбор по виду регистратора) с тем, чтобы получить регистраторы из записей соответствующих периодов. Поскольку существует вероятность наличия двух или более документов «ПоступлениеТоваровУслуг» сделавших движения в одном и том же периоде - то выбираем более поздний из них для каждой номенклатурной позиции за счет СГРУППИРОВАТЬ ПО (в общем - «...в живых должен остаться только один»). Хочется сразу предупредить, что для случая значительного объема товародвижения время выполнения такого запроса может быть очень большим. Если данную задачу необходимо решать за минимальное время - под нее лучше создать периодический регистр сведений «ПоследнийПриход» с измерением «Номенклатура» и ресурсом «ДокументПоступления». При проведении соответствующих документов делать движения по этому регистру. А отчет получать срезом последних на нужную дату. Поскольку записей в таком регистре будет на порядки меньше, нежели в одном из самых загруженных регистров конфигурации - скорость выполнения запроса возрастет существенно. 236
Запросы Как подсчитать количество записей с одинаковым значением некоторого поля? Например, нужно построить счетчик элементов справочника «Контрагенты» по реквизиту «ОсновнойМенеджерПокупателя» и отсортировать его по убыванию. У элементов справочника «Контрагенты» есть реквизит «ОсновнойМенеджерПокупателя» (тип значения «СправочникСсылка.Пользователи»), В значения данного реквизита прописываются ссылки на менеджеров предприятия. Необходимо сформировать таблицу, в которой было бы видно, сколько контрагентов закреплено за тем или иным менеджером, причем в следующем порядке: Основной менеджер покупателя Количество закрепленных покупателей Иванов 33 Батов 17 Семашко 10 Лучше всего запросом: ВЫБРАТЬ Ко11грагекгы.Ос1Ю№к>ЙМенсджерПоку нагеля, КОЛИЧЕСТ0О(Контрагснты.Ссылка) КАК КоличсствоЗзкрсплснных ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (Контрагснты.ЭтоГруппа = ЛОЖЬ) И < Контрен енгы.Основ1н>йМенеджерПокунагеля о &ИеЗаиолненМенеджер) СГРУППИРОВАТЬ ПО Контрагенты.(кновнойМснсджсрПокупателя УПОРЯДОЧИТЬ ПО КоличествоЗакреплениых УБЫВ Выходными полями таблицы запроса по справочнику «Контрагенты» делаем «ОсновнойМенеджерПокупателя» и «Ссылка». Для того, чтобы группы не мешали нашей статистике - отбрасываем их. Кроме того, отбрасываем тех контрагентов, у которых не указан 237
Запросы, отчеты конкретный менеджер в реквизите «ОсновнойМенеджерПокупателя». Для этого параметру запроса «НеЗаполненМенеджер» нужно будет присвоить следующее значение: Справочники .Польмввтели.ПусааяСсилкэО Поскольку самих контрагентов показывать не нужно - применяем СГРУППИРОВАТЬ ПО. Групповым полем будет « Контрагенты. ОсновнойМенеджерПокупателя», суммируемым «Контрагенты.Ссылка», функция КОЛИЧЕСТВО. В результате получим уже свернутую (сжатую) по менеджерам таблицу. Упорядочиваем ее записи по убыванию. 238
Запросы Как в итоговых записях вывести количество различных записей? Например, требуется распечатать таблицу закрепленных за менеджерами покупателей с указанием их количества. В отличие от предыдущего примера в результате запроса должны остаться покупатели, но и суммарное количество покупателей нужно тоже показывать: Менеджер Покупатель Количество Иванов 3 Иванов ООО «Лабан и Ко» 1 Иванов ЗАО «Шустер и сыновья» 1 Иванов Энигма Инк. 1 Батов 1 Батов Краски и Лаки 1 Таблицу можно получить запросом с использованием ИТОГИ ПО. ВЫБРАТЬ Контрагенты Лк новнойМснсджсрГ1окупатсля. Представление КАК Основной Менеджер! 1оку нагеля, Коягри! и нт ы. Пре дета в. 1сние. I КАК КтнчсствоЗакрсллснных ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ (Контра ген гы ЭтоГру п на = ЛОЖЬ) УПОРЯДОЧИТЬ по Количество Закрепленных УЬЫВ ИТОГИ КОЛИЧЕСТВО(КолхчествоЗакреплснных) ПО Ос вовне й МенеджсрПокушп сля Источник - таблица «Справочник.Контрагенты». Посредством условия отбора отбрасываем записи групп справочника. Поскольку результат запроса потом надо будет выводить на печать, в качестве выходных полей используем представление поля «ОсновнойМенеджерПокупателя» и представление самого элемента справочника, и поле «КоличествоЗакрепленных» для каждой записи (для уровня детальных записей заполняем его единичками). 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 - Главный склад»). В выходной таблице данные документа в таких случаях должны быть свернуты. Поэтому запрос можно построить левым внешним соединением вложенного запроса по документу (группирующего данные из документа по номенклатуре и складу) и виртуальной таблицы «Регистр Накопления.ТоварыНаСкладах. Остатки» ВЫБРАТЬ Вложенный Зап рос. Номенклатура. ВложенныйЗапрос.Ртмещение КАК Склад, Вложен ныйЗапрос. КоличсствоСпнсываемое, Товары НаС клада хОс i ягкм. Кол и чест воОстаток ИЗ (ВЫБРАТЬ ВнутрснннйЗакачТовэры. Номенклатура КАК Номенклатура. ВнутрснннйЗаказТовары.Разметенис КАК Размещение. СУММ А 4 Вн у трен н ййЗакат Топары Колнчес т во "Вну гренннйЗакаэТовиры Коэффициент) КАК КоличествоСпнсывасмос 241
Запросы, отчеты ИЗ Документ.ВнутреннийЗаказ.Товары КАК ВнутрсннийЗаказТовары ГДЕ Внутренний Заказ! овары. Ссылка — АСсылка СГРУППИРОВАТЬ по ВнутреннийЗаказТ овары.Номенклатура, ВнутрениийЗаказТокарм Размещение ) КАК ВложенныйЗалрос ЛЕВОЕ СОЕДИНЕНИЕ Per негр Накоплен ня Тонарм! 1аСк 1Л.мк.Остатки(&МоментВремениДокумента, Склад В (ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫРАЗИ I Ь( ВнутрснннйЗака.зТоварыДляОт6ора. Размещение КАК Спроночник-Склалы) ИЗ Доку мент. В ну г реп мин Заказ Товары КАК ВнугреннийЗаказТоварыД|яСИ бора ГДЕ ВнузрениийЗгказГоварыДляОлГчфа.Ссылка <&Ссылка И НЕ ВЫРАЗНТЫВнутрсннийЗаказТоаарыДляОтбора.Размещение КАК Снравочник.Склады) ЕСТЬ NULL » И Номенклатуре В (ВЫБРАТЬ РАЗЛИЧНЫЕ Вну г решшйЗаклТоварыДляОтбора.Номенклатура ИЗ Доку мент. ВнугреннийЗаказ.Товиры КАК ВнутрсшгнйЗаказТовармДляОтбора ГДЕ ВнутреннийЗаказТоварыД;и|От1юра.Ссылка - ЛСсылка)) КАК Товары НэС кладах Остатки ПО В. юженны Л ЗапросНоменкла тура » ТоварыНаСкладал Остатки.! 1оменклатура И Вложенный Запрос.Размещение » Товары НаСкладахОстатки Склад Немножко подробнее о параметрах виртуальной таблицы «РегистрНакопления.ТоварыНаСкладах. Остатки»: Первым параметром должен передаваться момент времени документа. Момент времени - это тип данных, содержащий дату и ссылку на документ. Именно он позволяет однозначно позиционировать документ среди других, обладающих той же датой (дата ведь,, как известно, имеет точность - только до секунды). В результате мы получим данные об остатках именно на момент времени документа. Вторым параметром передаем отбор по измерениям. 242
Запросы Для измерения «Склад» надо передать таблицу тех складов, которые встречались в табличной части нашего документа. Получаем ее вложенным запросом. Сложность в данном случае заключается в том, что тип значения реквизита «Размещение» - составной. А нам нужны только значения типа СпрЗВОЧНИкСсылка.Склад. Сложность разрешается применением Выразить(). В результате мы приводим данные к нужному типу значения, а значения NULL, которые «не привелись» - отсекаем условием. Кроме того, выбираем только не повторяющиеся записи. Аналогично - для измерения «Номенклатура». В качестве таблицы для возможных значений отбора передаем таблицу номенклатурных позиций, полученную запросом по табличной части нашего же документа. Осуществлять такие отборы на параметрах виртуальных таблиц важно для обеспечения быстроты получения виртуальной таблицы. Чтобы не получилось, что она строится по тем номенклатурным позициям и тем складам, которых и в документе-то и нет. Само же соединение осуществляется по полям «Номенклатура» таблиц «ВложенныйЗапрос» и «ТоварыНаСкладахОстатки» и по полям «Размещение» и «Склад». Как в запросе осуществить отбор по значению перечисления? Необходимо отобрать всех работников предприятия, стоящих на момент «ДатаОтчета» на воинском учете. Данные о воинском учете данные хранятся в периодическом регистре сведений «ВоинскийУчет». D / - и . . Фи»1Мц(1 Q |» Ресурсы • | Опадивгме*В 'ЭеосйОбамгыостм । | К4а«горняЗ<мс4 | g ! I Состав ' г I 8ЫС ' f Гооссть -»нат f На «мнаМоблдо)f*«• ♦ I OMSpF jpr и* | ЗябронкфомЮрг днимиден s Реквмэ»лы
Запросы, отчеты Тип значения ресурса «ОгношениеКВоинскомуУчету» «ПеречислениеСсылка.ОтношениеКВоинскомуУчету». Получить требуемое можно посредством запроса: iai । рос. Текст = “ВЫБРАТЬ | ВоинскийУчетСрелПоследних.Физлицо |ИЗ | Регистре вслений.ВоинскийУчст.СрсзПослсдним&ДатаОтчста) КАК ВоинскийУчетСрсзПослсдних [ГДЕ | Вот1НскийУчстСрсзП1Хлсдних.Отио111снисКВоинскомуУчсту = ЛСостоит Источником является виртуальная таблица «РегистрСведений.ВоинскийУчет.СрезПоследних», рассчитанная на дату, указываемую в параметре «ДатаОтчета». В результате запроса получим таблицу физических лиц, удовлетворяющих условию отбора. Отбор производится по полю «ОтношениеКВоинскомуУчету». Сами же значение параметров устанавливается следующим образом: Запрос. У становить! 1арамстр* “ДтОтчета". ДатаОтчета); Запрос У с гановитъПараметр) “Состоит", Псречнс.тения.ОтиошениеКВопнскомуУ чету .Состоит); 244
Запросы Как получить курсы валют на две интересующие даты? Для получения данных используем запрос. Текст запроса приведен ниже: ВЫБРАТЬ Валют ыСрсз! 1 ос лсд н и х. Валюта, Валюты Срез! 1ослсдних.Курс, АПериаяДаи Как Дата ИЗ Регистре ведений. Вал юти .СрезПослсдиих( & Пернах Дата, ) КАК ВалютыСрсз! 1остсдних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Валют ыС резПослелн и х .Валки а. Валют ыСреэПоследних.Курс, &ВтораяДата ИЗ Pei исгрСведений.Валюты.СреэПослелних(&ВтормДата.) КАК Валют м( pcil locтедних Фактически первый запрос получает курсы валют на первую, интересующую нас дату, второй на вторую. Для сортировки можно дополнительно описать раздел «Упорядочить». 245
Запросы, отчеты Как одним запросом получить таблицу расхождений курсов взаиморасчетов всех выписанныхдокументов «ЗаказПокупателя» с официальным курсом? Необходимо получить таблицу следующего вида: Документ Валюта договора Курс взаиморасче то в Курс официальный Превышение Заказ покупателя ТК000007 от 05.08.2004 12:00:01 USD 31,51 30,6691 0,8409 Заказ покупателя ТК000003 от 26.07.2004 11:42:39 руб 1 1 Заказ покупателя ТК000023 от 26.09.2004 12:00:02 EUR 33,42 33,1609 -2,74 В отличие от вышеприведенного примера, дат получения курсов у нас очень много (по числу документов). В таком случае лучше поступить следующим образом: ВЫБРАТЬ ВложснныйЗапрос.Ссылка КАК Документ. ВложенныЙЗапрос .ДоговорКонтра! еитаВалютаВ 1анмора счетов КАК ВалютаДоговора. ВложснныйЗапрос.КурсВтанморасчстов, ВЫБОР КОГДА КуреыВалют.Курс ЕСТЬ NULL ТОГДА О ИНАЧЕ КуреыВалют.Курс КОНЕЦ КАК КурсОфициаиьный. ВЫБОР KOI ДА КуреыВалют.Курс ЕСТЬ NULL ТОГДА ВложснмыйЗанрис.КурсВтаиморасчети» ИНАЧЕ ВложенныЙЗапрос КурсВтаиморасчетоп - КурсыВалют Курс КОНЕЦ КАК Превышение ИЗ (ВЫБРАТЬ 246
Запросы Заказ! (окупатсля.Ссылка КАК Ссылка, МАКСИМУ М(КурсыВалю1.Период) КАК Период. Заказ! 1ок> ла геля. Курс Взии морас чггов КАК КурсВзаиморясчегов. ЗакаэПокупателя.ДоговорКоптраг^ша ВалюпВйнмораечеюв КАК ДоговорКошрвгенгаВалюгаВзаижфасчстов ИЗ Документ ЗаказПокутштсля КАК ЗаказПокупателя ЛЕВОЕ СОЕДИНЕНИЕ Регистре велений. КурсыВалют КАК КурсыВалют ПО ЗаказПокуiiaiел я. Деи оворКонграгс ига Валю i^Взаиморасчетом ® Курсы Валют. Валюта И ЗаказПокупателя.Дата >ж Курсы Валют. Период СГРУППИРОВАТЬ ПО ЗаказП оку и а тел я. Ку рс Взаи морасчетов, ЗаказПоку i гаг еля .Договор Koin par ен га. Вал ю i «Взаиморасчет ов. Заказ! 1окупатсля. Ссылка ) КАК Вложснный'Занрос ЛЕВОЕ СОЕДИНЕНИЕ Регистревелений.КурсыВалют КАК КурсыВалют ПО ВложенныйЗапрос ДоговорКонтраг с шаВал юта Взаиморасчетов = КурсыВалют.Вал юта И Вложен и ыйЗа и рос. Период КурсыВалют. Период Во вложенном запросе получаем необходимые данные из документа и максимально близкий к дате документа период записи по такой же валюте из таблицы регистра сведений «КурсыВалюты». Полученную таблицу внутренним соединением соединяем опять с таблицей регистра сведений «КурсыВалюты». Но теперь уже по совпадению полей «Валюта» и «Период». Из соответствующих этому совпадению записей получаем выходные поля, согласно требуемому. Обратите внимание, может иметь место ситуация, когда дата документа меньше периода самой первой записи регистра. Предусмотрено, что в этом случае поле «КурсОфициальный» вернет нулевое значение, а поле «Превышение» курс взаиморасчетов. 247
Запросы, отчеты Какнаписатьзапростаким образом, чтобы на определенном уровне иерархии запроса считались одни итоговые функции, а на другом уровне другие? Необходимо получить данные в следующем виде: Номенклатура Характеристика Остаток Заказ Резерв Ботинки муж. Размер 45 10 8 Ботинки муж. Размер 45 10 Ботинки муж. Размер 45 Заказ**1 2 Ботинки муж. Размер 45 Заказ №2 6 Ботинки жен. Размер 38 5 2 Ботинки жен. Размер 38 5 Ботинки жен. Размер 38 Заказ №4 2 В самой базе данных данные находятся в регистрах накопления следующей структуры: Остатки номенклатуры: □ г . Измерен*» ; [— I— ' Г“ • • o*^w**« pt- ИемВР^х^е Остатки заказов покупателей: йог 0*000 10Ч60М, wt о* 3».аэПа>.уп*е1та ТамрТ^м Следует отметить, что в прямой постановке задача не решается. При определении раздела «Итоги» агрегатные функции итогов будут 248
Запросы считаться на всех уровнях иерархии запроса. Но постараться добиться подобного эффекта можно с помощью запроса: ВЫБРАТЬ ОстаткиТомровКомпаиннОстаггкм.Номенклатура КАК Номенклатура. ОстагкнТо1шропКом11анилОстатки.Номенкла1урв1 Представление. ОстаткиТоваровКомпанинОстатки.ХлрактсристикаНоменклатуры КАК ХарактсрнстикаНоменклзтуры, Ос г агки Товаре в К ом 11 ан и нОст аггки. X ара кт ерисг и ка II ом с н к л атуры. П редспшл ение. ОстаткиТоваройКомпанииОс1атки.Кол11чес i иоОпаюк КАК КазичесгвоОгтаток. NULL как Закат, О КАК Резерв ИЗ Pei ис грНаконления.ОстатккТокаровКомпании. Остатки КАК ОстаткиТоваровКомнанннОстзткн ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Зака 1ыПокупателсйОсп!гкн. Номенклатура. Зака 1ыПокут1а1елейСХ1атк11.Номенклатура. Представление. ЗаказыПокупателейОстатки.ХараоериегикаНоменклзтуры, Заказы! 1окупатслейСХдаткм.ХаракдсрнстикаНомснклатуры.Представление. О, Заказы Пеку па re. тгйОс та тки .ЗаказПоку пат е л я. Зака л.|Покупагс.1СЙОстатки.Колмчсс1Ж)Оста ток ИЗ РегнстрНакоплення ЗаказыПокунагелей Остатки КАК Зака «ыПокупателейОстатки ИТОГИ СУММА!КоличествоОстаток). СУММА!Резерв) ПО Номенклатура. ХарактсристикаНомснкпа! уры Первым запросам выбираются остатки, в полях соответствующих данным о резерве проставляем NULL и 0. Вторым запросом получаем данные по резервам. Раздел ИТОГИ позволяет внести иерархию в результат запроса с указанием остатка по позиции и итога по количеству зарезервированного товара. 249
Запросы, отчеты Какполучитьпереченьдокументов, приведших данные подчиненного периодического регистра сведений к определенному состоянию? По данным периодического регистра сведений «КандидатыНаРаботу» Й-Д • Ихеречи *— ФнаЛимо 0 Гш Ресурсы I Стжу 0 2 —— Оиемс« • Подразделение - Долфмхль требуется построить таблицу: ФизЛицо Документ Статус Андреева Жанна Юрьевна Отложен Андреева Жанна Юрьевна Регистрация кандидатов 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
Запросы Данную задачу лучше всего решить посредством запроса со следующим текстом: ВЫЬРЛТЬ Кандидаты На Ра боту .ФизЛицо КАК ФичЛи но. КандидатыНаРаботу.Pci нсi рвгор КАК Документ. КандидатыНаРаботу.Статус КАК Статус ИЗ Регистре всихимй. Кандидаты НаРаботу.Срез!1ослелних(&ДатаОгчета.) КАК Кандидаты НаРабогуСрезПоследнмх ЛЕВОЕСОЕДИНЕНИЕ Регистре велении.КандидатыН«Работу КАК КандидатыНаРаботу ПО Канди штыНаРабстуСрсз!Iocjicahmx .ФизЛицо = КандидатыНаРаботу ФизЛицо ГДЕ КанлилатыНаРяботуСрсзПослсднич.Статус = &Отложен И КанлилатыНэРаботу.Псриод <= АДатаОтчста УПОРЯДОЧИТЬ ПО Кандидат ы НаРаботу.Физ/1ицо.Наименован не. Документ ИТОГИ МАКСИМУМ(Статус) ПО ФизЛицо АВТОУ1ЮРЯДОЧИВАНИЕ В качестве источника будет таблица - результат внутреннего соединения виртуальной таблицы « РегистрСве дений. КандидатыНаРаботу. СрезПоследних», рассчитанной на момент формирования отчета и реальной таблицы записей регистра сведений «КандидатыНаРаботу» по полю «ФизЛицо». В результате отбора останутся только записи, в которых значение поля «Статус» равно «Отложен» и где период записей меньше даты отчета. Выходными полями назначаем те, что требовались при постановке задачи. 251
Запросы,отчеты Как установить параметры запроса, если текст запроса заранее не известен? Такая необходимость может возникнуть, когда текст запроса формируется динамически, в зависимости от некоторых установок, выбранных пользователем. В этом случае можно воспользоваться методом запроса НаЙТиПараметры(), который возвращает коллекцию объектов ОписаниеПараметраЗапроса, содержащих имя и тип значения каждого параметра: Запрос = Новый Запрос^" (ВЫБРАТЬ | Номенклатура.Ссмлка |ИЗ | Справочник . Номенклатура КАК Номенклатура (ГДЕ | Номснклатура.Ссылка В ИЕРАРХИИ(&1 руппаНоменк-итуры)’); И Получить описание параметров запроса. Параметры Запроса « Занрос.НайгиПар«1ме1ры(); Для Каждого ПараметрЗапроса Из ПараметрыЗанроса Цикл ЗалзнносЗначснис - Нсопредслсно: // Открыть диалог ввода значения данног о параметра. Если ВвестиЗначение( ЗаданноеЗначсние, ’’Задайте значение параметра " ♦ 11арамстрЗапроса.Имя. Парам ст рЗа п роса. Т инЗначсния i Т огда Запрос.Усгановит1.Параметр< ПараметрЗаироса.Имя, За занное Значение); Иначе Возврат; КоиецЕсли; Конец! [нк ла; Результат Запроса = Запрос. ВыиолнитъО; 252
Ан ал изданных ® Как получить данные о товарах продаваемых вместе? В ряде случаев необходимо получить данные о совместно продаваемых товарных позициях. Такая информация может учитываться представителями торгующих компаний при раскладке товаров на стендах и прилавках. Например, если такие товары будут находиться рядом, то этот факт может увеличить объем их совместных продаж. Рассмотрим следующий фрагмент кода: Анализ = Новый А на.з изДанных; // Выбранный тип анализа как раз и указывает на то. что ищем а «совместно продаваемые* товары. Анализ.Тнп Анализа = Тнп("Анал изДан ныхПоискЛссоциаций*); Запрос « Новый Запрос: 'Запрос.Текст = ВЫБРАТЬ | ПродажнКомпанииОбороты.Рсг истратор Как Документ Продажи, | ПродажиКомпанниОборотыЛомемкла тури |ИЗ | Pci истрН<исои.1ення.ПродажиКомпании.Обороты(&IЗачПернода, & Кои Периода, Регистратор) КАК ПродажиКомпанииОбороты (УПОРЯДОЧИ ГЬ ПО ДркумснгПродажи"; Запрос. Установит ьГ1зраме1р|Нзч1 (ернола". 11ач11сриода); Запрос.УстановнтьПараметр*"КонПериода". Кон Периода); // Получить продажи за укатанный период. И Выбрана периодичность по Регистратору, т.к. необходимо получить //данные о совместных продажах в рамках одной покупки. Анал из. Истомин кДанных - Запрос. Выполнить/); Н Втлюлннгь анализ в соответствии с указанным источником. РезульпггАнализа = Анализ.Выполнить*); // Для вывода результата анализа воспользуемся построителем // отчета анализа данных. Построитель = Новый ПостроительОтчеглАнали таДанныхО; Пост роитель.Макет = Нсопрсдслсно; 253
Запросы, отчеты Построитель/Гип Анализа = Тип(" Авали |ДанныхПоискАсс< ТабДок - Новый ТабличиыйДокумент; Построитель.ВыяестнСРезультвтАкаяиза. ТабДок), ТабДок. Показан/); щиавин" )*, Результат анализа будет показан в открытом окне табличного документа. Следует обратить внимание на тот факт, что полученный таким образом анализ произведен исходя из значений параметров «по умолчанию». Значения таких параметров можно менять программно, либо через «связанный» элемент управления ТабличноеПоле. В общем случае состав и назначение параметров определяется видом анализа. ф Как порекомендовать сопутствующие товары? При покупке может возникнуть необходимость получения данных о том, чем данная покупка отличается от «среднестатистической» подобной покупки. Реализуем возможность получения рекомендаций покупателю исходя из соображения: «Обычно когда покупают закупленный вами перечень товаров, берут еще это...». Рассмотрим фрагмент кода: Авали? - Новый .А нал и?Дан ныч, // Найти ассоциации. Анализ!ипАнализз = Ти1»(Ана.1тДя11ных11оискАссоциаций*); Запрос = Новый Запрос. Запрос. Тевет = 'ВЫБРА I Ь | НродажиКомцинииОбирона.Рсг истрагор КАК ДокумегпПродажи, | 11родажиКомпанииОборогы.Номсн»с1атура |ИЗ | PerистрНакоплеяия.ПродажиКомпанин.Оборсны(&На*|1 I ери од а. & Кон11срио да. Регистратор) КАК ПродажнКом1мникОбор01ы (УПОРЯДОЧИТЬ ПО Доку мент Продажи”; // Ассоциации ищем по доку чтению, гго определяется повезен нем U объекта «АналнзДаниых» *по умолчанию» при ныборе // периодичности виртуальной таблицы Регистратор Запрос. Установить! (арамстрСНачПериода", НачПсриода). Запрос.УсгамогииьПара.мегрСКомПирио да", КонНсрнода); 254
Анализ данных Лналнз-ИсзочникДанных - Запрос.Выполнить!); Результат Л нал и ш — Авали зВыполнитьО; И Исходя из полученною анализа создать прогноз. МодельПрогнозэ = РезулматАналнза.СоматьМодельПрогнозм)*. //ТЗ- таблица значений, содержащая данные о том. // какие номенклатурные позиции вошли в ’’текущую” покупку. Моде/1ь11р01ноза.Исп>чникДанных я ГЗ; // TF1 - элемент управления "Табличное поле’ связанный через И свойство "Данные" с реквизитом формы "ТП" (тип ТаблинаЗначений) ТП Мидель Проз ио за Выполни !Ы); ЭлементыФормы.ТП.СоздазьКолонкш); В результате выполнения фрагмента кода «рекомендации» будут отображены в табличном поле «ТП». Следует помнить, о том, что в данном примере, что прогноз произведен исходя из значений параметров «по умолчанию». В общем случае состав и назначение параметров определяется видом анализа. ф Как посмотреть, что будет покупаться в дальнейшем? Необходимо решить следующую задачу: если клиент приобрел какой- либо товар, то с определенной долей вероятности он может прийти еще за каким-то дополнительным товаром. (Например, после покупки принтера он может приходить за расходными материалами к нему). Как получить подобную информацию? Рассмотрим следующий фрагмент кода: ТабДок я Новый ТибличныйДокумснт; Анализ = Новый Аналн зДанных. // Нужно спрогнозировать цепочку событий. ПОЗ!ому выбираем // тип анализа «Поиск последовательностей». А нал из Тип Анализа = ТнпГА нал и зДа1ШычПоискПоследователь1 гостей*); Запрос - Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанннСХюроты. Дог оворВзаиморасчстивПоку|1а геля. Владелец | КАК Контрагент. | П|Х37ахснКомпаиммОбор1угы.Номенклатура, 255
Запросы, отчеты | Продажи КомпанниОбороты - Период |ИЗ | РегмегрНакоплення ПродажнКомпании.Обороты!ЛНачПерио.па, &Кон! [ериода, Регаст ротор) КАК ПродажнКомгтанииОбороты"; Запрос.УстановитъПарамстр(*Н*чПср11одам, НачПериода); Запрос. УстановитъПарамегр<м Кон Периода*. Кон Периода): АнализЛеточникДанных = Запр<к.Выполнить!); Колонка Анализ.НастроАкаКолонок.НайтмСПернод"); // Указать, что колонка «Период» имеет тип «Время*, // чзо «позволиг понять» хронологию событий Колонка I ин Колонки = ТниКолонкиАнализаДанныхНоиск Последовательностей .Время; Результат Анализа = Анализ. Выполнить!); МодельПрогноза = РезульгатЛнализа.СозлатьМодельПро! нош). И ТЗ- таблица тначений. содержащая исходные данные дня прогноза // наприхгер. какой контрагент, какой товар закупил (исходя из чего // попытаемся узнать, что они cine закупят). МодсльПрогноза.ИсточникДанных = ТЗ; // ТП — элемент управления «Табличное поле» связанный через //свойство «Данные» с реквизитом формы «ТП» //(тип Табл и цаЗначен ий) 1П = МодельПрогноза.Выгюлнить!): Э лемент «Формы.ТП.СоздатьКолонки(); // Построитель - реквизит формы, имеющий тип // Пос трои гельОтчетаАнали шДанных. Ряд табличных полей // н диалоге могут быть связаны со свойствами-коллекциями И данного объекта Построитель Тип Анализа = Тип('’Лнали1Дйнн*4хПоискП(клсдователы1ОСтеЙ'')1 Построй гель. Вы вес I и< Ре зу ль i ат Л нал изн. Т абДок); ТабДок Показать!); Полученные данные (что клиенты еще будут приобретать дополнительно исходя из уже совершенных ими покупок) можно использовать, например, при анализе складских запасов. 256
Представление результатов отчетов Табличный документ, текстовый документ Как вывести результат запроса в табличный документ? Наиболее эффективным способом решения этой задачи является использование построителя отчета. Однако в некоторых случаях требуется более «тонкая» работа с макетом табличного документа и тогда формирование результирующего табличного документа необходиомо выполнять самостоятельно, без использования возможностей построителя отчета. Предварительно создадим макет (тип макета «Табличный документ»). Внешний вид макета приведен на рисунке. Имя макета: «Макет». Текст процедуры, в которой формируется запрос, и результат запроса выводится в табличный документ, приведен ниже: Оста! киТоваровКомпанииОсгатки.СкладКомпании КАК СкладКомпанннС сылк OciuiкиТо«арпвКомпа1111иОс1а1КИ.Номенклатура КАК НоменклатураСсылка. СУММА(ОстаткиТом1ровКомпанмиОетатки.Колмчес1воОна1ок) КАК Остаток. ()сгаткнТоваровКомпании()с1а1 кн. Номенклатура. Представление КАК Номенклатура. I Остатки I'оваровКомпанниОс1а1 ки.СкладКомпании.1представление КАК Склад [ИЗ Рп исчрНакотиення.ОстаткиТоваронКом паннм.Остатки&Момент) КАК ОстаткиТоваровКомпанииОстатки 257
Представление результатов отчетов (СГРУППИРОВАТЬ ПО | ОстаткиТоваровКом1и1НииОста1ки.Сю)адКом1ишииСсылка. | (КтаткиТоваровКомпании(Хггатки.НомснклатураСсылка (ИТОГИ СУММЛ(Остаток> ПО Общие. | Склад": Зап[х»с.УстановитьПираметр("М0ме1п", Неоорсделсно); Результат = Запрос.Выполнить!' И Получить поле табличного документа, и которое будем выводить реэулыат. ТабДок = ЭлсмснтыФормы.ПолеТаблпчногоДокумента; // Очистить данные в табличном документе И (возможно данные уже выводились рапсе». ТабДок Очистить!); Макет = ПолучитьМакст("Макст">; // Получить именованные области нт макета. ОбластьОбщнйИтог = Макст.ПолучитьОбластЦ"ОбщийИтог"); ОбластьСклад = Макет По,тучитьОбластьГСклад"); ОбластьНоменклагура = Макет.ПолучнтьОбласп>(Номсиклатура">: И Получить выборку по нерпой итоговой группировке (первый уровень). ВыборкаОбщиЙИюг Результат Выбраты ОбходРезульгатаЗапроса. ПоГ руппнровкам); И Запись общего итога всегда одна, поэтому можно обойтись без организации цикла. В ыборкаОбщийИтог .Следующий»; И Произвести запись данных из полей выборки в именованные // области с совпадающими именами Об ластьОбитийИтог.Параметры.Запошиты. ВыборкаОбтпнйИтог); // Включить область с заполненными параметрами в табличный документ. ТабДок. Вывести'Об.тастъОб|цийИтог): И "От" записи первого уровня получить подчиненную выборку //записей второго уровня (по итоговой группировке "Склад"). ВыборкаПоСкладу = ВыборкаОбщийИтог .Выбрагь(ОбходРезультагаЗапроса.ПоГруппнровкам); Пока ВыборкаЛоСкладу-Следующий*) Цикл ОбластьС клад. Пара метры Заполнить*ВыборкаПоСкладу); ТабДок.Вывсстн(ОбластьСклад); // Получить подчиненную выборку, содержащую детальные записи Выборка! 1оНомснклатурс - ВыборкаПоСкладу.Выбрать»; 258
Табличный документ, текстовый документ Пока ВыборкаПоНомснклатуре.Следуюшийо Цикл Об.ластьНоменклат\ра Пара метры. Заполнить* Выборка! 1оНомснклатуре>; ТабДок. Вы вести(ОбластьНоменклвгура): КоиецЦикла; КоиеиЦик ia. Следует сделать несколько замечаний к приведенному тексту. В полях выборки результата запроса получаются представления ссылочных полей «Склад» и «Номенклатура». Получение представлений необходимо для вывода их в табличный документ. В противном случае, если бы в табличный документ выводились не представления ссылочных полей, а сами ссылки, выполнялись бы неявные запросы к базе данных для получения представления ссылочных значений, что привело бы к замедлению вывода отчета. После выполнения запроса в переменную «ТабДок» получается расположенный в форме элемент управления ПолеТабличногоДокумента, в который и будет осуществляться вывод результата отчета. Результат запроса обходится по группировкам, в нескольких вложенных циклах. Сначала выбирается группировка верхнего уровня, содержащая запись общих итогов. Затем в цикле обходится группировка «Склад», и для каждого значения выборки этой группировки также во вложенном цикле перебираются детальные записи результата запроса. 259
Представление результатов отчетов Как вывести данные в табличный документ с возможностью сворачивания и разворачивания данных по группировкам? Вывод данных в табличный документ рассмотрен в примере «Как вывести результат запроса в табличный документ?» на странице 257. Рассмотрим особенность организации группировок (в нашем примере: группировок строк, хотя можно группировать и колонки). Перед выводом данных в табличный документ используется метод табличного документа НачатьАвтогруппировкуСтрокО, который автоматически создает группировки в табличном документе в соответствии со значением уровня строк, задаваемым при их выводе вторым параметром метода Вывести (). Следует отметить, что для определения группировок не обязательно это делать через автогруппировку. Для группировки строк можно использовать методы табличного документа НачатьГруппуСтрок() и ЗакончитьГруппуСтрок() (аналогичные методы существуют и для группировки колонок табличного документа). Как при выводе данных в табличный документ свернуть все выводимые группировки? Необходимо при выводе данных в табличный документ в развернутом виде оставить только группировки нулевого и первого уровней, а группировки более низких уровней отобразить в свернутом состоянии: 260
Табличный документ, текстовый документ В переменной «УровеньГруппировки» определяется уровень, до которого необходимо раскрыть группировки в табличном документе. Как при выводе данных в табличный документ произвольно определить состав свернутых и развернутых группировок? При выводе данных по заранее известным правилам, необходимо отображать какие-либо группировки в свернутом состоянии, какие-то - в развернутом. Допускается, что свернутые и развернутые группировки могут находиться на одном уровне. ТабДок. Вывеет и< ОблэстьНомснклатура. Выборка! lol ioMviiKJiurype.y ровень(). Ложь); Установка четвертого параметра метода Выбрать() в значение Ложь приведет к тому, что данная область будет отображаться в свернутом виде. ф Как выгрузить результат запроса с показом иерархии? В форме расположено табличное поле с именем ТП. Тип значения табличного поля - ДеревоЗначениЙ. Необходимо в табличном поле показать результат выполнения запроса с показом иерархии данных. Для реализации этой задачи необходимо написать текст запроса, который в обязательном порядке должен содержать раздел ИТОГИ (именно этот раздел определяет иерархию). В процедуре, отвечающей за заполнение данными табличного поля необходимо разместить следующие строки: Запрос = НодыЙ Запрос ЗапросТекст = ВЫБРАТЬ | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | ПродажиКомгванинОборспы.КалмчестмЮборпт КАК КоличесгвоОборот |ИЗ | РсгисгрНакш1лснии.11родажиКомиан1«и.(Хюроты1&Нач11сриода. & Кон 11 ср иода.. I | КАК ПродажмКоынанннОбироты (ИТОГИ СУММА(КслячсствоОборот) ПО 261
Представление результатов отчетов | Номенклатура ИЕРАРХИЯ*; Запрос Установи гь11аримстр^'НачПерно/1л \ Нач Периода), Запрос.Установи гь! 1ара.мегр< ~Ко»<11ериодам, Кон Периода); Результат » Запрос. Вы поли him'); ЭлсмснтыФормы.ТП,Значение = Результат Выгручить(ОбходРсзулы атаЗапроса .Hol руfширинкам): // Осуществить выгружу с сохранением иерархии. ЭлсмснтыФормы.ТП. Создать КолонкиС): Метод СоздатьКолонки() элемента управления ТабличноеПоле удаляет ранее существовавшие колонки и создает новые в соответствии с новым источником данных. ® Где и как можно увидеть макет, автоматически генерируемый построителем отчета? Поскольку тип значения свойства Макет построителя отчета - ТабличныйДокумент, то, как и всякий табличный документ, - его можно вывести на экран при помощи метода Показать (): 11 ос троит с л ьОтчста. М а кет Ноопредслено; 1I встроите льОтчста. Макет!1оказатМ В данном примере имя построителя отчета было «ПостроительОтчета». Разумеется, данный код можно писать после того, как построитель отчета сформирован. Первая строка кода - с присвоением свойству Макет значения Неопределено нужно только в тех случаях, когда мы точно хотим получить именно автоматически генерируемый построителем отчета макет. Дело в том, что до нашего кода построителю мог быть назначен другой макет, или он был изменен. 262
Табличный документ, текстовый документ ф Как из построителя отчета передать данные в сводную таблицу? В форме отчета есть табличный документ «ДокументРезультат», в его составе встроенная таблица «СводнаяТаблица». Необходимо обеспечить ее автоматическое заполнение по данным построителя отчета «Построитель ОтчетаОтчет». После формирования построителя отчета можно сделать следующее: 1СМГ1П ыФормы Доку мет Резу.м» i ат .ВстросмныеТабл ицы СводнаяТэблнца ИсючннкДанных » ПостроитсльОтчстаОгчст ЭлементыФормы Документ Речуль гаг Ik । роеннысТ аб. i нцы .С иодная Iаблнци Отображать Поля = Истина; Сначала указываем сам построитель отчета сводной таблице в качестве источника данных. Далее установкой свойства «ОтображатьПоля» вызываем на экран окно для интерактивного управления полями сводной таблицы. Хочется подчеркнуть, что источником данных для сводной таблицы может быть не только построитель отчета, но и результат запроса. 263
Представление результатов отчетов Отчетформируется построителем отчета. Как убрать одну из колонок, поместив ее данные в расшифровку другой? По документам «РегистрацияСобеседованияКандидата»: Дат аСо6еседсм»»«я Псмккашелем* Доп*мос?ъ Резу*тарСобесаа10ы»мя необходимо построить отчет по форме: Кандидат Результат Абрамов Андрей Алексеевич Отклонен Аввакумов Алексей Аркадьевич Предложили работать Алексеев Вадим Юрьевич Отклонен Андреева Жанна Юрьевна Отложен Кандидаты должны располагаться в алфавитном порядке. Причем при двойном клике по любому «результату» должен открываться сам документ, в котором данный результат был зафиксирован. Данную задачу можно решить посредством следующей процедуры: Процедура ЛлфавитпыЙПереченьКанДИдатопСРас шифровкой!) I кктроительОтчсга - Новый Построители )тчстэ: Построите л ьОтчет а .Т екст =" ВЫ БРАТЬ | Регистрация!. обесчиоммияКамдидота ФизЛигю КАК Кандндаг. | РстстраиияСобсссдованияКандилата.Рсзульт эт<обсссдования КАК Результат. | РегмстрацияСобеселоаанияКацдилата.Ссылка |ИЗ | Док у мсти Pei ис 1 рация! <»бсссд< пип ши Кандида ш КА К РсгнстраштяСобсссдованияКанлидата 264
Табличный документ, текстовый документ (УПОРЯДОЧИТЬ по | Ре1ис1раци»Собс<.'сдо1Ш11няКан.1идд1а.Фих1|1цо Нанменовал1к- : ПостроигельОтчетаВыполнитьО; Макет = ПостроительОтчста. Макет; И Очистить области, связанные с ссылкой. ТекущаяОбласть - Неопределено; Пока Истина Пикл Текуи!аяОбтасть = Макет.НайтиТекст("(’сытм" Текут иаяОблас п.. Макет ,Область()): Если ТекущаяОбласть - Нсопрсделсно Тогда Прервать. Иначе ТекушаяОблаеть.Очистнты Истина. Истина. Истина!; КонецЕслн; КоиецЦикла, И Заполнить параметр расшифровки для областей, где параметр = "Результат". ТскушаяОбласть = Нсоирсделсно: Пока Истина Цикл ТекущаяОбласть = Макет .НайтиТекст» "Результат". ТекущаяОбласть. Макет .ОбластьО); Если ТекущаяОбласть = Нсопрслслсно Тогда Прерван., Иначе Если ТекушаяОбласть.Парамегр = "Результат" Тогда ТекущаяОбласть. ПарамстрРасшифровки = "Ссылка"; КонецЕслн: КонецЕслн; КоиецЦикла; ПостроительОтчета Макет = Макет; ПостроитсльОтчета ВывестиО; КонеиПроцедуры 265
Представление результатов отчетов Используем объект ПостроительОтчета. Текст запроса позволяет получить из таблицы документов «РегистрацияСобеседованияКандидата» данные о кандидате, результате и ссылке на документ, в которой были зарегистрированы эти данные. Далее построитель отчета выполняет указанный текст запроса. Поскольку в выходной форме табличного документа колонок должно быть две - исправим макет построителя отчета. Для этого считываем на переменную «Макет» макет, автоматический генерируемый построителем отчета. Далее открываем цикл перебора областей ячеек макета, в которых присутствует текст «ссылка». Метод области ячеек табличного документа «ОчиститьО» позволяет за счет своих параметров добиться очистки текста, формата и рамок области. Каждую найденную область - очищаем полностью. Далее открываем цикл перебора областей ячеек табличного документа «Макет», где присутствует текст «Результат». Если в найденной области еще и параметр установлен, как «Результат» - значит именно в этой области нам нужно установить значение «ПараметрРасшифровки» как «Ссылка». Таким образом, мы обеспечим размещение содержимого полей «Ссылка» результата построителя отчета в расшифровки ячеек отображения полей «Результат» при формировании табличного документа по исправленному макету. Остается только назначить построителю отчета исправленный макет и вывести построитель отчета. Как сохранить настройки построителя отчета до следующего открытия формы отчета? Допустим, необходимо сохранить настройки построителя отчета «ПостроительОтчета». Для этого нужно в обработчике события При закрытии формы вписать команду на сохранение значения настроек. Например, так: Сохрая11ТьЗначснис('НастроПкл11остронгсляД,1яС>гчста1 |р>1ажи + МетадаикыеО.Имя, I loci рои гельОгчел а.Пол) читъ! lac тройки*)); Первым параметром указано имя сохраняемого значения. Вторым - само сохраняемое значение. Поскольку метод сохраняет значение индивидуально для пары «ИнформационнаяБаза - Пользователь», то 266
Табличный документ, текстовый документ уникальность имени сохраняемого значения обеспечиваем за счет его формирования. Например, из имени отчета и имени формы. При открытии данной же формы, для того, чтобы «вернуть» построителю отчета его настройки - можно будет сделать следующее: Восстанавливаем (сохраненное при окончании предыдущего сеанса работы с формой) значение настроек - по соответствующему имени значения. Убедившись, что восстановить значение настроек действительно удалось - устанавливаем эти настройки для построителя отчета. 267
Представление результатов отчетов Как организовать показ примечаний в формируемом табличном документе? По данным документов «Событие»: необходимо вывести информацию о зарегистрированных за период событиях по следующей форме: Как видите, в колонке «ОписаниеСобытия» в некоторых ячейках установлены примечания, содержащие «СодержаниеСобытия» 268
Табличный документ, текстовый документ Для формирования подобного табличного документа потребуется макет «Отчет» по следующей форме * -ф| — 1гхг»>'н^ /«ni'j Состоявшиеся события (кратко) <Период с [ДатаНач] по [ДатаКон)> Обратите внимание, ячейка, содержащая «ОписаниеСобытия» - поименована («Описание»). Сам же табличный документ будет формироваться следующей процедурой: Процедура ОгчекДагаНач. ДагаКон) Экспорт Запрос = Новый Запрос, И Сбор данных. Запрос.Текст = "ВЫБРАТЬ | Событие.Ответственный КАК Ответственный, | Событие Дата, I Событие.ВидСобытня, | Событие. Контрагент. | Событие СолержаниеСобытня. | СобьтгнеОпнсаннсСобытня |113 | Документ.Событие КАК Событие I |гдн | Собыгие.Дага МЕЖДУ ЛДагаПач И &ДатаКон I И I (Событие.Проведен! I | (’обытнс.('остоянис<’обытия = ^Завершено I (УПОРЯДОЧИТЬ по | Ответственный"; Запрос.Установить! 1арамстр< "ДаггаКон", ДатаКон); Запрос.УстановитьПараметр< "ДатаНач", ДатаНач); Запрос УстановитьПарамегр("Завершено". 269
Представление результатов отчетов Перечисления .СостоянияСобытий. Завершено); Результат = Запрос.Выполнить)); //Сформирова1ь табличный документ. Макет = ПолучитьМакст) Отчет”); Об. 1асть'3аго ловок — Макет. ПолучмтьОбласть) "Заголовок”); ОбластьШапкаТаблицы = Макет! 1о.1учнтьОбласгь("111апка1 аблицы*); ОбластьДсти.и>ныхЗапноей Макет.Получи 1ьОбласты ”Дс1алн"); ТабДок = Новый ТабличныйДокумент; ОбластьЗаголсииж.11араметры .ДатаНач ДатаНач; ОбластьЗагиловок.Паре.четрыДатаКон ДатаКон. ТабД ок. Вывести) ОбластьЗа головок); ТабДок. Вывести) Область!!! at 1 каТаблниы); ВыборкаДеталн = Реэультат.Выбрать)); Пока ВыборкаДеталн.Следующий)) Цикл ОбластьДетальныхЗаписей. Параметры. Заполнить) ВыборкаДеталн); О6ласгцДеталы)ыхЗаписен.ОбластЫ "Описание" (Примечание.Текст = ВыборкаДеташ. СодержаниеСобытия; ТабДок.ВывестшОбластъДетальных Записей); КонеиЦикла; ТабДок.Покатать!); КонсиПропсдуры Выполняем запрос для получения всех необходимых данных по записям таблицы документа «Событие», которые удовлетворяют условиям отбора: документы проведены, их дата находится в интервале формирования отчета и значение реквизита «СостояниеСобытия» равно Завершено (тип значения Перечисление Ссылка. СостоянияСобытий). Далее работа идет по выводу результата запроса в табличный документ. Получаем макет. Из макета получаем необходимые для работы области. Создаем табличный документ «ТабДок». Устанавливаем параметры области «Заголовок» и выводим ее в табличный документ «ТабДок». Выводим область шапки таблицы. Далее открываем цикл выборки из результата запроса. 270
Табличный документ, текстовый документ Внутри цикла: Заполняем параметры области детальных записей данными из одноименных полей строки выборки по результату запроса. А в область «Описание» области детальных записей добавляем примечание. В качестве текста примечания указываем данные из поля «СодержаниеСобытия» выборки результата запроса. Выводим очередную область детальных записей в «ТабДок». По окончании цикла показываем сформированный табличный документ пользователю. ф Как обеспечить, чтобы при вводе на печать не печатались первая колонка и первая строка табличногодокумента«ДокументРезультат»? Для решения этой задачи лучше всего воспользоваться свойством табличного документа ОбластьПечати. После того, как табличный документ «ДокументРезультат» сформирован, пишем: ДокументРезультат.ОбласгьВечатн = ДокументРезультат ,Область(2. 2. ДокументРетульпп.ВысогаТаблииы, Документ Результат. Ширина («блицы В качестве комментария: свойству ОбластьПечати необходимо передать область ячеек табличного документа, которую будем выводить на печать. Для определения этой области указываем прямоугольную область, начинающуюся со 2-ой строки, 2-го столбца, и заканчивающуюся последней строкой табличного документа (ее номер определяем из свойства табличного документа ВысотаТаблицы) и последним столбцом (его номер определяем из свойства табличного документа ШиринаТаблицы). ф Как обеспечить фиксацию верхней части табличного документа, генерируемого построителем отчета, по срезу шапки таблицы? Если макет автоматически генерируется построителем отчета можно воспользоваться тем, что в его составе есть область «ШапкаТаблицы» и 271
Представление результатов отчетов следовать она будет сразу после области «Заголовок». Значит низ области «ШапкаТаблицы» как раз и будет границей желаемой области фиксации. Например, построитель отчета называется «ПостроительОтчета», а табличный документ «ДокументРезультат». Тогда после вывода построителя отчета в табличный документ можно сделать следующее: ДокумеитРсзульпи-.ФнксацияСьсрх} = ПостроительОтчета .Макет Области .ШапкаТаблицы Ню; То есть, устанавливаем значение свойства ФиксацияСверху табличного документа как номер нижней строки области «ШапкаТаблицы» макета табличного документа. ©Табличный документ формируется построителем отчета. Как при печати табличного документа обеспечить вывод шапки таблицы на каждой странице? Если табличный документ строится по макету, сгенерированному построителем отчета, то в его составе будет область «ШапкаТаблицы». Если табличный документ называется «ДокументРезультат», а построитель отчета - «ПостроительОтчета», после вывода построителя отчета в табличный документ можно сделать следующее: Област ьШипки = I loci рои 1ельО!чста.Макег.Об.шс ги. ШапкаТаблицы; ДокумснтРсзультат.Повторять! 1риГ1счатнС троки = ДокументРслультят.Облас'пДОбластьШапки.Верх, , Область!Папки.Низ) В свойство ПовторятьПриПечатиСтроки табличного документа достаточно передать любую область ячеек табличного документа, и она станет повторяться в каждом печатаемом листе. В нашем случае данную область определили по координатам области «ШапкаТаблицы» автоматически генерируемого построителем отчета макета. 272
Табличный документ, текстовый документ ф Как при выводе на печать «длинного» документа указать в колонтитулах страниц номер документа, дату и номер страницы? Работа должна вестись со свойством ВерхниЙКолонитул табличного документа. Тип значения его объект Колонтитул ТабличногоДокумента. Та6ДокуМ1*н1.Верм1нйКолои1итул.Выводить - Истина; ТабДокумеш .ВсрхннйКолонгитул ПачальнаяСтраница = 2: ТабДокумснг.ВсрхнийКолонттул.ТекстТ'лсва = Мстзданныс().11рсдставлсннс(> + " №" + Номер; ТабДокуменг.ВеркнийКолонтнгул ТекетСправа = "!&НомерС|ронины!"; Устанавливаем для нужного колонтитула признак вывода на печать. Далее указываем, что начинать вывод колонтитула следует не с первой страницы (по умолчанию), а со страницы № 2. Передаем значения для заполнения свойств ТекстСлева и ТекстСправа. Обратите внимание, что типы значений этих свойств - Строка. В текст слева выводим представление и номер документа. В текст справа выводим номер текущей страницы. ф Табличный документ формируется по макету, автоматически генерируемому построителем отчета. Какзадатьориентацию страницы при печати? Ориентация страницы в любом случае задается уже для самого табличного документа. Пос тронтельОт чета. Вывссти(ДокумснтРезультат); Д<>куме*пРе о льтат.Орие1пацияСтранниы = ОриентацияСтраницы Ландшафт; В данном примере свойству ОриентацияСтраницы табличного документа «ДокументРезультат» назначается значение Ландшафт системного перечисления ОриентацияСтраницы. 273
Представление результатов отчетов Табличный документ формируется построителем отчета. Как для всех выводимых числовых показателей установить вывод без дробной части? Регистр «ПартииТоваровНаСкладах» имеет ресурсы «Сумма» (точность: 2) и «Количество»(точностъ: 3). По регистру строится отчет посредством построителя отчета. Внешний вид табличного документа определяется настройками построителя отчета. Необходимо обеспечить, чтобы все числовые показатели отчета выводились в формате целых чисел. Для решения данной задачи лучше всего поработать с областями макета построителя отчета перед выводом построителя отчета в табличный документ. Текст областей макета построителя отчета (названия параметров) будет определяться названиями выходных полей запроса. Как правило, псевдонимы выходных полей запроса построителя отчета в своих именах упоминают имена ресурсов («Количество» или «Стоимость»). Обязательно проверьте - так ли это в Вашем случае. Для этого можно получить макет построителя отчета, как показано в примере «Где и как можно увидеть макет, автоматически генерируемый построителем отчета» на странице 262. В результате можно утверждать, что в тексте областей макета построителя отчета, связанных с выводом информации по ресурсам, скорее всего, будут присутствовать упоминания названий этих ресурсов. Значит, нам достаточно перебрать все области с текстом содержащим «Количество» или «Стоимость», и для каждой из них установить формат "ЧДЦ=0". Находим в процедуре выведения построителя отчета на табличный документ сам момент выведения и перед ним дописываем: И Получить макет построителя отчета. Маке! = ПостроительОтчета.Макет; И (’форматировать вес области, где встречается слово «Стоимость» ГекушаяОбласть » Неопределено; Пока Истина Цикл ТекушаяОбласть = Макет НайтиТексЦ’Стоимость". Теку шаяОбласть. Макет.Область()); 274
Табличный документ, текстовый документ Если ТскушаяОб.tacit = Неопрсдосио Тогда Прервать; Иначе Если ТекущаяОбласть.Парамегр о *" Тогда Теку щая()бласть.Формат = "ЧДЦ=ОН; КоиецЕсли. КоиецЕсли; КонецЦикла; И С форма! кровать все области. где встречается слово «Количество». ТскушаяОбласть = Неопределеио: Пока Истина Цикл Текущая Область = Макет. НайтиТекстТ*Количес1 во*. Теку шаяОбласгь. Макет Области)); Если ТекущаяОбласть = Нсопределсно Тогда Прервать; Иначе Ехли ТекушаяОбласть.Параметр о Тогда ТекущаяОбласть Формат » ’ЧДЦяО"; КоиецЕсли; КоиецЕсли; КонецЦикла; И Назначить построителю измененный макет. ПостроитсльОтчста.Маке1 « Макет; И Вывести результат работы построителя отчета в табличный документ Сначала в переменную «Макет» получаем макет построителя отчета. Промежуточной переменной «ТекущаяОбласть» назначаем значение Неопределено. Открываем цикл, который будет выполняться до точки прерывания. Внутри цикла находим очередную область табличного документа, в тексте которой упоминается слово «Стоимость». На первом витке цикла 275
Представление результатов отчетов это будет первая область от начала макета, на каждом очередном - следующая. Если не удалось найти такую очередную область (то есть ее значение Неопрбделено) - прерываем цикл. Если же удалось, проверяем, есть ли у данной области параметр. Если есть - меняем формат выводимых в этой области числовых данных. Форматная строка «ЧДЦ» определяет количество разрядов после запятой. В нашем случае - ноль. При этом сами данные будут при выводе округляться в соответствии с правилами округления, заданными для конфигурации. Далее аналогичные действия выполняются для слова «Количество». После всех циклов измененный макет отдаем в качестве значения макету построителя отчета. Еще раз хочется подчеркнуть, что решение основано на известности названий выходных полей запроса построителя отчета. Необходимо искать области, текст которых содержит эти названия. ф Какдля построителя отчета совместить назначение своего макета и применение одного из стандартных макетов оформления? Посгроите.1ьО|чега.МжкетОфорылеиня П<х1учнт».Маке|Оформле11ИЯ(СтандарП1оеОформленис.Апельси10 ПостроительОгчета. Макет = Получи ibMaKei(«Maxei3roj оОтчега»): Построите/! ьОтчета.ОформитъМакет( >; Назначаем макет оформления построителя отчета, выбирая его из стандартных. Устанавливаем макету построителя отчета значение макета, созданного вручную и хранимого в составе макетов этого отчета. Для применения стандартного макета оформления к назначенному макету - перед выводом табличного документа необходимо использовать метод ОформитьМакет(). Замечание: «свой» макет должен иметь области со стандартными именами, иначе построитель не будет знать, что оформлять. Как при получении данных из запроса обойти только итоговые записи? При обходе результата запроса не хотим обходить детальные записи. 276
Табличный документ, текстовый документ ТабДок = ЭлемснтыФормы.ПолсТабличногоДокумснта; ТабДок.Очистить! т: Макет = ПолучитьМакет! "Отчет"); 'Запрос = Новый Запрос. Заирос.Текст и "ВЫБРАТЬ | 11|ю.1ажнКомпанинОбороты.Номенклатура КАК Номенклатура, | 11родажиКомпанннОбороты.Иомснклатура.Прслставлсннс, | П|юдажмКомпанинОбороты.Колнчесп1оОборот КАК КоличссгвоОборот, | ПродажиКомпанииОборо1Ы.СуммаПродажиОбортл КАК СуммаПродажиОборот |ИЗ | РегистрНакои. тения.ИродажиКомпании.ОборотыС&НачПериола.&КонПсрнода) КАК ПродажиКомпанииОбороты I (ИТОГИ СУММА(Ко.1нчествоОборот). СУММА(СуммаПролажиОборот) ПО | ОБЩИЕ, | Номенклатура Иерархия": Запрос Установить! 1арамстр("АНачПериода", НачПериода); Запрос.У сгановитъПараметр! "&КонПернодв". КонецДия! КонНериода)); Результат = Залрос.ВыполнитьО; ОбластьЗаголовок = Макет.ПолучитъОбластЫ 'Заголовок"); Область! ктдвал = Макет ПолучктьОбластЫ" Подвал"): ОбластьШапкаТаблицы Макет.ПолучктъОбластМ "ШапкаТаблицы" >; ОбластьПолвалТаблниы = Макст.Полу'пгтьОбластьСПодвалТаблипы"); ОбластьОбщийИтог = Макет.ПолучитьОбласты "ОбщиеИтопт"); ОбластьИоменкла|ура » Макет. Получи гьОбластъС'Номснклагура"); ОбластьДстальныхЗаписсй = Макет.ПатучитьОбласть("Дста.1и"); Т абДок. В ывест и( Облает ьЗат оловок); ТабДок.Вывест и(Облас i ьШат i каТ аблтшы): И Обход по определенным в запросе итоговым труппировкам. ВыборкаОбщийИтог = Результат . Выбраты. ОбходРезульта таЗапроса.ПоГ руппнровкам к // Запись общих итогов одна, полому нет необходимости в цикле. ВыборкаОбщийИтог.Следутощий!); ОбластьОбщийИтог. Параметры. Заполнит Ы ВыборкаОбщийИтог): ТабДок. Вывести! ОбтастьОбщийИтог); И Получить подчиненную выборку по итоговой группировке ^номенклатура-. ВыборкаНоменклатура = ВыборкаОбщийИтог Выбрать! ОбходРезу.и>|атаЗа11роса.ПоГруппировкам): Пока ВыборкаНомсиклагура.СлсдующийО Цикл 277
Представление результатов отчетов (Х>ластъ!1омснклагура.!1арамстры.3«11юлн1гть( Выборка Но меняла гура); ТабДок Выаести(ОбласпЛ !оменклатура); И Несмотря на то, что можем получить еще одну подчиненную If выборку (по детальным шписям) мы тго не делаем. т.е. «ракгически // при обходе пропускаем легальные записи. КоиецЦикла; ТабДок. Вывести! Облает ь! I отвал! аблнцы). Т абДок. Вы вест! Облает ь! Тодвал): Как при получении данных из запроса обойти только иерархические итоговые записи? В примере «Как при получении данных из запроса обойти только итоговые записи» на странице 276 в методе Выбрать() вместо варианта обхода ПоГруппировкам необходимо использовать ПоГ руппировкамСИерархией. В результате часть кода изменится: ВыборкаОбпшйИтог = Результат Выбрать* * ( ХтходРетультятаЗапроса .ПоГруппнронкамСИерархиенк Выборка* ХбщийИтог.СледующийО; ОблаетьОбшнйИпм Парачетры.Зшюлннть* ВыборкаОбщий Итог); ТабДок Вы1кхти(ОбластьОб1ЦНЙИтог); ВыборкаНоменклатура = ВыборкаОбшнйИгси ВыбратмОбходРетул ьта гаЗапроса .ПоГруппировкамСИерархией); Пока ВыборкаНомеикллтура Следующий*) Цикл Область! 1омснклатура.1I арам стры.Заполнить* ВыборкаНоиснклзтура); ТабДок.Вывес*'И(Областъ11оменклагура); КоиецЦикла; В результате в табличный документ будут выведены только: • запись общих итогов (она относится к иерархическим) • итоговые записи по группам справочника «Номенклатура» (иерархические итоговые записи) 278
Табличный документ, текстовый документ Остальные данные (содержащиеся в результате запроса) обходиться не будут, таким образом, будут выданы только иерархические записи, расположенные на первом уровне. ф Как вывести картинку в табличный документ? В макете определим именованную область «ОбластьСКартинкой». В ней разместим элемент управления Картинка (имя «Логотип»), как показано на рисунке: В процедуре, которая будет выполняться при формировании печатной формы, разместим следующий текст: ТабДок — Новый Табл ичмыйДоку мент: Мажет = Обра1к>гкаОбъскт.11олу'чнтьМакс1(’’Маке1 "К ОблэстьКартинки = Макет. 11олу*1ить(>5ласть(’’ОблэстьС’Картннкой"); Картинка = Новый Картинка(ПутьККартинкс); // Элемент управления Логотип’ входит в коллекцию картинок области ОбластьКарт11Нкн.Рисут1кн.Логогип.Картинка = Картинка; ТабДок.Вывес i и(ОбластьКдр1мнки к Т абДок. Пока «агь(); 279
Представление результатов отчетов Как вывести картинку в табличный документ без изменения макета? Необходимо в шапке отчета (выводимого в поле табличного документа) отобразить логотип компании. При этом не нужно менять макет данного отчета. Полный путь к картинке находится в одноименной переменной. Для решения задачи необходимо внести в процедуру, формирующую табличный документ следующие строки кода: Область = Макет.ПолучитьОбластЫ "Шапка*); Рису нс к к Облог г ь. Рисунки. Добавит М Т ни Рису нки Г абличп ш о Доку мен та. Картинка Рисунок. Верх = 5; Рисунок. Высота = 10; Рисунок. Ширина = 10; Рисунок. Лево = 5; Рисунок.Картинка = Новый Кар1ИНка(11утьККартннке), Рисунок. РазмсрКартнн кн = РазмерКартинки.РсальныЙРазмср: ТабДок Вывестя(Областьк Первоначально создается новый элемент коллекции рисунков табличного документа. Далее устанавливается положение нового рисунка и, используя свойство Картинка, в новый рисунок загружается изображение из файла. Как работать со сводной таблицей? Для иллюстрации одного из способов работы со сводной таблицей создадим обработку. В диалоге основной формы разместим элемент управления ПолеТабличноГОДокумента (имя «ПолеДокумента»). В данном элементе управления необходимо выделить любую прямоугольную область и воспользоваться пунктом главного меню программы «Форма | Встроенные таблицы | Вставить сводную таблицу»: I 280
Табличный документ, текстовый документ При этом будет создана сводная таблица с именем « СводнаяТаблица 1». В процедуре обработчике нажатия на кнопку «Выполнить» разместим следующие строки: Запрос Новый Запрос; Запрос. Текст = "ВЫБРАТЬ | Продажи КомпакннОбороты Дог о вор В тинморас чет овПоку нагеля. Владелец КА К ДоговорВзаиморасчстойПоку патсляВл.зде icu. | ПродажмКомпанниОбороты.Номснклатура КАК Номенклатура. 1 Продажи Komi шшиОбороты.ПодрвэделенмеКомиаиии КАК Подразделен исКомпан ин, | СУММА(ПродажнКомпанииОбораты.КоличсствоОборот,1 КАК КолнчеспюОборот, | СУ ММА(IТрод&жиКомпанинОбороты.Сумма! 1ролажн()борот) | КАК СуммаПродажиОборо! |ИЗ | Регистр! Ькоплення ПродажиКомпаннн (Хк»рпты(&!!ачПернода,&КонПериола) КАК ПродажиКомпанннСХюроты К ГРУППИРОВАТЬ ПО | ПродажнКомпанвиОборо|ты.Дого1юрВзаиморасчето1|Покупатедя. Владелец. | ПродажиКомпанииОбороты.НомеН1Слатура. | 11родлжиКомпанниС>бироты.Полрс!1делгниеКомпанин (ИТОГИ СУММА(Колнчсство()б(>рот), СУММАССуммаПродажиОборот> ПО | До1 оворВзаиморасчеговПокунагеляВладелец. | HoMCHKjiaiypa. | Подразделен неКом пан и и”; // На состав полей, которые moiyt быть размешены в измерениях. //данных сводной таблицы влияет раздел ‘•Итоги*. Запрос. Установить! ]араметр< "Пач11срмода". Нач! 1сриода); Зи 11 рос. У становигьП арамегр( " Кон Периода*. Кон Периода); Результат ® Запрос. Выполнить)); (водная = Элемсн т ыФормы . ПолеДокумен I и .ВстросннысТаблнцы Сводная Таблица 1; С водная .ИсгочникДанных = Результат» В сводную таблицу передается результат запроса. Состав отображаемых полей определяется в диалоге, который вызывается путем выбора пункта «Отображать поля» контекстного меню сводной таблицы. 281
Представление результатов отчетов Как программно разместить данные в сводной таблице и оформить ее? Для того чтобы облегчить чтение сводных таблиц, содержащих большое количество данных, можно использовать свойства сводной таблицы МакетОформения и ОтображатьЛинии, позволяющее задать режим отображения линий, а для размещения данных использовать свойства сводной таблицы Строки, Колонки и Данные. Например: Построитель = Новый ПостронтсльОтчстаО; Построит ель.Тсксг = "ВЫБРАТЬ | Товары НаСкладахОстаткиИОборагы.Склад КАК Склад | Товары НаСкладл хОстатк и ПОборогы. Склад. Представление, | ТоварыНаС клад ах Остатки И Обороты. Номенклатура КАК Номенклатура, | ТоварыНаСкладяхОстатмйЮборогы-Номенклатура.Прсдставлснне, | СУММА(ТоаарыНзСклалахОстатки1Юборагы.Коли'1ес1вс1Приход) | КАК КатичествоПрнхил. | СУММ ACT оварыНаСкла.тах Остатки I !Обороты. Количес твоОборот) | КАК КоличсствоОборсгг. | СУММАСТоварыНаСкладахОс'ППКиИОбороты.Количес i во Расход) КАК КоличсствоРасход |ИЗ Pci исгрНакопления.ТоварыНаСкладах-ОстагкиИОбосопн КАК Товары НаС кладах Оста ткиИОбороты (СГРУППИРОВАТЬ ПО | Г овары! 1аС кл&дахОстагкн I Юбороты.С клад. | Товары 11 аСкладахОсгаткиИОбориты I (оменклатура. | Товары НаСкладахОсга)кнИОборогы.Склад.HpeuciaiLiiTiiK*. | Товары НаСк ластах Остатки ИОбороты Номенклатура. Предстал лен не [ИТОГИ СУММА(КолнчесгвоПрнход). СУММА(Кол)1честти»Оборот). СУММА!КоличесгвоРасход) ПО | ОБЩИЕ, | Номенклатуре ИЕРАРХИЯ, Склад ИЕРАРХИЯ Таблица Элемешы Формы . П олеТабли чногоДокуме» i га I . Вс троен! гыеТаб ли i (ы .С водна яТабл ина I *. Таблица.МакстОфс»рмлсния - 282
Табличный документ, текстовый документ ПолучятьМ11сетОформ.1ОДИя4Стш!ДАртн(хОформл£Ние.Лед) Таблица. ИсточнмкДанных - Построитель: Таблица.( троки ДобавитМ" Иоменк тэт ура"); Т эблица. Колонки. Добавить! *С клад"); Табли на. Данн ысДо6авн1Ь(и Коли чествоПрмход*’); Таб.И1па.<)то6ражать.Линии = ТилОтображеиичЛинийС нолиойТаб,1ИП1.1 .Всегда; Каксоздать печатную форму посредством текстового шаблона? Требуется создать печатную форму для формирования заявок на пропуска сторонних лиц на встречи в офисе компании. Заявки впоследствии должны печататься на матричном принтере, поэтому для формирования выходной формы удобнее использовать текстовый документ: Заявка на пропуска на 09.08.2004 Планируемое время посещения с 10:00:00 по 15:00:00 ----------------------—--------— ----—+ | «ИО | +———---— ---———— -—----------+ I Шлаков Семен Кузьмич | |Кротов Иван Ильич IКолесниковская - Абдурахманова Александра | |Константиновна | Ответственный: _______________/Федоров 283
Представление результатов отчетов Для решения данной задачи создаем сначала макет текстового документа « ЗаявкаНаПропуск». 284
Табличный документ, текстовый документ Макет сделаем следующего вида: ^Область Заголовок «Поле Дата «Формат "ДФ-dd.HB.yyyy" «Поле ВремяНач «Формат "ДЛФ=Т” «Поле ВремяОкоич «Формат "ДЛФ“Т" Заявка на пропуска на [Дата Планируемое время посещения с [ВремяНач ] по [ВремяОкоич ] | ФИО | «Ко нецОбласти «Область Состав | [ ] | «Поля ФИО |< >| «Поля ФИО S-------------------------------------------------+ «КонецОбласти «Область Подвал Ответственный: ______________/[Ответственный ] «КонецОбласти Каждая область заключается внутри маркеров ее начала и конца. Форматирование выводимых в области данных можно производить посредством обращения к выводимому полю, далее «# Формат» и форматная строка. Аналогично там же можно производить выравнивание, например: «#Выравнивание Лево». Вывод значений параметров определяется указанием имен параметров области между квадратными скобками. Количество разрядов между квадратными скобками определяет - во сколько разрядов будет помещено отображаемое текстом значение параметра. Поэтому отдельный интерес представляет ситуация с выводом длинного, не вмещающегося в одной строке, текста. Она отработана при выводе строк области «Состав». Заметьте, в первой строке вывод поля указан в квадратных скобках, строкой ниже - в угловых. То есть вторая строка появится только тогда, когда выводимое не поместится в предыдущую строку. 285
Представление результатов отчетов Сам же текстовый документ будет формироваться так: Н Создать текстовый документ, в ко юры й будет нынолнзнься вывод. Текс г Док х Новый ТекстовыйДоку.мепц // Получить макет. Макет = ПолучитьМакет("ЗаявкаНаПропуск"); // 3ai олово к. Область = Макет. Пол учитьОб ласты "Ъюл тюк"), Область.Параметры.Да!а » Дата: Область.Параметры.ВремяНач НачалоСобытшг. Область. Параметры.ВремяОкоич = ОкончаниеСобытня; Текст Док Вывеет Ж Область); // Состав. Область > Макет.ПолучитьОблдсзЫ "Состав"); Для Каждого ТскСтрокаСтороннмсЛица Из Сторон нисЛ и ца Цикл Область.)Втраметры.ФИО « С1рока<ТекС|рокаСюронннеЛица Лицо): ТскстДок.Вывссти(Обласгь); КонецЦикла: И Подвал. Область = Макет .Получил ьОбласты ’ Подвал"); Об.iacn>.Параметры Оимггственный = О|вететвснный.Наименование: ТексгД ок. Вывести (Облает ь); И Открыть сфорМИроН<1ННЫЙ ДОКуМСНТ. Текст Док.ПоказатъС Заявка на пропуска для События №‘ + Номер); Создаем в оперативной памяти текстовый документ. Для его заполнения используем текстовый макет, который мы создавали подчиненным документу «Событие». Получаем область «Заголовок», производим заполнение ее параметров, выводим полученную область в текстовый документ. В цикле перебора строк табличной части документа «СторонниеЛица» производим заполнение и вывод области «Состав». В подвале текстового документа выводим ответственного и показываем текстовый документ на экране. 286
Диаграммы ф Как заполнить диаграмму данными? Рассмотрим пример, позволяющий показать данные в круговой диаграмме. Данная диаграмма имеет одну точку и произвольное количество серий. Первоначально в диалоге необходимо разместить элемент управления Диаграмма (имя элемента «Диаграмма»). В свойствах элемента управления укажем, что будем работать с круговой диаграммой. Далее в модуле формы определить текст обработчика нажатия на кнопку «Выполнить»: Диатрамма = ЭлсмснгыФормы. Диаграмма, // Очистить диаграмму, возможно ранет в нес уже выводились данные. Диш рамма Коли чествоСерий =Ch Диаграмма. КоличссгвоТочек = О; // Колнчссгво серий будет сираничиваться {нс вес значения будут показываться). Диаграмма.МаксимумСерии = МаксимумСсрнй. Ограничено; Диаг рамма.МаксимумСсрийКо.тичество = 7; Диаграмма. Ви д| (одписей - Вид! 1ол писей К Диаграмме. Процент; Диатрамма.ОблаиьЗаго.ювка Текст » ’’Обороты номеяклвтуры"; Запрос Новый Запрос; Запрос.Текст = "ВЫБРАЛ» | ПродажнКомнанииОбороты. Номенклатура, | СУММА( 11родажнК\>мпанииОбороп>1.Колнчсс i воОборо i i КАК Количестве^ Мюрот [ИЗ | Регистр!! ако1ысния.Продажи.ОборОТЫ(,.,) КАК ПролажиКомпанинОбороты |С1 РУППИРОВАТЬ ПО 1 11ро лажи Ким пцнииОбороты.Номеикляту ра*; Результат « Запрос. Выполнить!); //’Запретить обнон.тснис диаграммы на время вывода данных. Диш раммаОбновлсние в Ложь; // Установить единственную точку. Днш римма.Количсс1»оТочек » 1; Диаграмма.Точкн[0| Текст - "Ко отчество*; 287
Представление результатов отчетов Выборка ® РезультагВыбрлгМ); Пока Выборка.Следующий! I Цикл И Количество серий, если бы нс ограничивали лая и се л о бы от результата запроса КолнчествоСсрий = Диаграмма.Серии.КоличествоО; Диаграмма. КоличсствоСсрнй = КоличсствоСсрнй * 1; Диш рамма.Серии [Кол и мест воСерий)Текет — Выборка. Номенклатура; // Установить значение «на пересечении» точки и серии // 11ервын параметр — 0 , так как в диаграмме только одна точка. Дил рамма.УстановнтьЗначение<0. Колнчсст воС ерий. Выборка. Коли чсствоОиорот); КонецЦикла; // Обновит!» диаграмму. Диаграмма. Обновление = Истина: В результате выполнения этого кода будет сформирована следующая диаграмма: 288
Диаграммы Следует заметить, что специфика круговой диаграммы заключается в том, что она содержит одну точку и некоторое количество серий. В других видах диаграмм для вывода аналогичных данных номенклатуру лучше назначать точкам диаграммы. Кроме этого, заполнение диаграммы данными может быть выполнено также через свойство ИСТСЧИИкДанных аналогично тому, как заполняется сводная диаграмма в примере «Как заполнить данными измерительную диаграмму?» на странице 289. Как заполнить данными измерительную диаграмму? Чаще всего при выводе в измерительную диаграмму, необходимо настроить полосы диаграммы, и, возможно, максимальное и минимальное значения шкалы диаграммы. Следующий пример демонстрирует настройку и вывод данных в измерительную диаграмму при помощи кода, однако надо заметить, что аналогичную на стройку измерительной диаграммы можно выполнить интерактивно в палитре свойств: // Настрои гь свойства диаграммы Диаграмма = ')лсмснтыФормы.ДиаграммаГ1|ю.тажм; Диаграмма.ТипДиаграммы * ТипДиатраммы.Измерительная Диш рам ма.Ав юМаксималыюеЗначение « Ложь: Диаграмма.МаксимальноеЗначенме = 20000: Диаграмма. Авто.МнннмальносЗначсние = Ложь; Диаграмма. МиннмальносЗначсннс = 0; // Создать три полосы. Полосы - Диа! раммаПолосыИзмерительнойДиа! рам мы; Новая! lo.ioca« По.юсы. Добавили); НоваяПо. юса. Начало = (): НоваяПолоса.Конеи = 1000; Новая! lo.ioca. ЦветФона &№сЫДвстз.Красный; НоваяПолоса = Полосы .ДобавитМ [); Новая Полоса. Начало = 1000; НоваяПолоса Конец = 5000: 1 клваяПо.'юса.ЦвсгФона sWeblXacra.Желтый: НоваяПолоса = Полосы ЛобевктьО; Новая Полоса Начало 5000; Новая Полоса. Конец = 20000; НоваяПолоса. ЦвсгФоиа =№еЬЦвета Зеленый. 289
Представление результатов отчетов Запрос = Новый Запрос! * {ВЫБРАТЬ | Про дажиОборогы. Период. | ПролажпОбороты.СтоимостьОборот |ИЗ | Рсп<стрНакоп.1сния.11родажи.(1бороты(&ДатаНачала. &. ДатэОкончания, День, ) КАК ПриДвжиОборО! ы Запрос УстановитьПароме1р(пДа1аНачала". ‘2004.08.1000:00:00’); Запрос. Установить! 1арамс1р(иДэтэОкончанмя'\ *2004.08.30 23:59:59*); ЭлсменгыФормы Д|1шрач1ма11родажи.Исто,1ннкДанных = Запрос .Выполнит U j .ВыгрузятъО; В результате работы данного кода будут получены данные о продажах за четыре дня августа 2004 года (в другие дни продаж не было), которые отобразятся в измерительной диаграмме четырьмя стрелками, указывающими на объем продаж: 290
Диаграммы <ОКаквывести результатзапроса в сводную диаграмму? Для того чтобы отобразить результат запроса в сводной диаграмме, следует использовать свойство сводной диаграммы ИСТОЧНИКДЗННЫХ, а затем установить нужные значения серий, точек и ресурсов диаграммы: Запрос 11овый Запрос! "ВЫБРАТЬ Т овары НаС клада хОс татк и И€>боро гы .С клад КАК С клад. Товары НаС юивдахОстаткиИОбороты .Склад. 11редс им. iciiiic. ТоварыНэСклалахОстаткиИ<)бороты.Номенклатура КАК Номенклатура, Товары! 1аСкладахОстаткиИ<Тбороты.Номенкла1 ура. Представление, СУ ММ А(Товары Н аСкладахОс га ткиИОборо т ы. Кол нчествоПри ход) КАК КолнчсствоПрнход, СУ ММА< ТоварыНаСкладахОста гхиИОбо роты. Количество!Хю рот) КАК Кол и мест воОборо!. СУММА! Т овары! !аС кладахОс i а гкиМОбороты. Количество Расход) КАК КоличествоРасход ИЗ । Pci нстрНакоппения.ТоварыНаС'кталах ОстаткнИОбороты КАК ТоварыНаС’кладахОстпткиИОборогы [СГРУППИРОВАТЬ ПО | Помары! 1аС к ладах Остатки И Обороты. Склад. , Г и нары НаС кладихОс глгкиИОбори i ы. Номеик. и ту pu. , Товары 11аСклалахОстаткнИОбороты.Склал,.Предетавлснн< | Товар ы НаС клалахОс татки IК )борот ы. Номен кд ату pa. 11 рсдс 1ТОГИ СУММ Al Колнчес! воПрнход), СУМ М А( Колн чсствоОбори г). СУММА! Кол и честно Расход) ПО ОБЩИЕ. Номенклетуро ИЕРАРХИЯ Склад ИЕРАРХИЯ"): impdMMa Элемеи1ыФормы.СводнаяДиа1 раммлк itui рамма.ОбластьЗаголовка.Текст = Приход товаров 1сто*|н)| «Данных = Запрос. Выпот Harpas«Ma. Сери и. Добавить! Номенклатура"): на! рам ма. Точ к н .Добив и т ь( "Склад” К иагрзм ма Ресурсы.Добавиты."КоличествоПр! 291
Представление результатов отчетов В данном примере сводная диаграмма «СводнаяДиаграмма1», расположенная в форме отчета, заполняется данными, полученными в результате выполнения запроса: Программное добавление серий, точек и ресурсов диаграммы выполнять не обязательно - можно предоставить пользователю возможность самостоятельно разместить в сводной диаграмме данные, используя системный интерактивный диалог: Данный диалог можно вызвать, используя пункт контекстного меню элемента управления сводная диаграмма. 292
Диаграммы Как заполнить диаграмму Ганта данными? Создадим обработку. В диалоге основной формы разместим элемент управления Диаграмма Га ШЭ (имя элемента управления «ДГ»). В обработчик события нажатия на кнопку «Выполнить» поместим следующие строки: ДГ = ЭлемеятыФормы.ДГ; Н Установить заголовок диаграммы. Д1 .ОбласгьЗаголовка.Тексг "График дежурств*; // Интервал будем определять самостоятельно. у|Г.АвтоОпрсделсниеПолно1 оИнтервала » Ложь. //Установить нтггеркал. ДГ УспздюйнгьПолныйИнтервал< НачалоМгсяпа^ ТгкушаяДата()), Кинс* 1 Месяца!.Теку щанДага())); // В диаграмме будет две точки - сотрудники Петров и Сидоров... ТочкаП ДГ.УстановитьТочкм "Петров"); ТочкаС = ДГ.УстановитьТ(У1ку( "Сидоров"); // к две серии * дежурство на вахте и дежурство в центральном офисе. Серия На Вах тс я ДГ.УстановитъСернкХ"На вахте*); СерияВЦенгре ДГ.УетаиошыьСерикм* В центральном офисе’); И Задать цвета серий, отличные oi цвета по умолчанию. Серия НаВах гс. Цвет = \УсЬЦвета.Синий; Сери я В Центре. Цвет - №еЬЦмтв.СветлоЖелтыЙ: ПсрвыйДсиь я НачалоМгсяиа( ГекущаяДатаО); // Получить значение диаграммы - дежурство Петрова на вахте. Значение - ДГ.Поду чииЗначеиие(Точка11. Серия На Вахте); Н В шачении определи гь новый интервал. Интервал я Значение.Добавиг ь<); Интервал. Текс г "Работает на вахте"; //Определить границы интервала. Интерна л. Начало = ПсриыйДснь; Интервал.Конец я Первый Лень -г 10*24*60*60, И Получить значение диаграммы - дежурство Петрова в центральном офисе Значение и ДГ.Получ1ггьЗ||аченне('ТочкаП. СерняВЦеизре); Интервал • ЗиачеинсЛобавитМ); 293
Представление результатов отчетов Интервал .Текст = "Работает в центральном офисе”; Интервал Лачало ПсрвыйДснь 4 14*24*60*60; Интервал Конец = Первый День 4 24*24*60*60; // Получить значение литрам мы - дежурст во Сидорова на вахте Значение = Д1. Получит ьЗначснне( ГочкаС. Серия На Вахте); Интерна.! ЗначениеДобавиты ); Интервал Текст = "Работает на пахте"; Ин герма, i Начато = ПсрвыйДснь 4 5*24*60*60; Интерна! Конец = Первый День + 15*24*60*60: И Получить значение лит рам мы - дежурство Сидорова н центральном офисе Значение = ДГ.ПолучитьЗначенис! ГочкаС. СерияВЦснтрет; Интерват =• ЗначеннеДобави1ь(). Интервал.Текст = ’Работает в центральном офисе”: Интервал Начало ж ПсрвыйДснь 4 21 *24*60*60; Ин lepiMLi.Конец = ПсрвыйДснь 4 25*24*60*60; Для того чтобы заполнить диаграмму Ганта, необходимо создать нужные серии (в нашем случае это виды дежурств), точки (в нашем случае это сотрудники) и заполнить свойства значений диаграммы для каждой пары точка - серия. Значение диаграммы представляет собой в общем случае совокупность нескольких интервалов. В данном примере каждое значение диаграммы содержит лишь один интервал, для которого задается начало, конец и текст, выводимый в качестве подсказки при наведении курсора мыши на этот интервал. В результате работы этого кода будет сформирована следующая диаграмма: В реальных механизмах данные для построения, скорее всего, будут получаться из базы данных, в соответствии с этим будет меняться и алгоритм работы с диаграммой. 294
Диаграммы Каксвязать интервалы диаграммы Г анта? Диаграмма Ганта позволяет устанавливать связи между различными интервалами диаграммы. Для иллюстрации этой возможности доработаем пример «Как заполнить диаграмму Ганта данными?» на странице 293. Чтобы связать между собой интервалы дежурств каждого из сотрудников, добавим в этот пример следующий код: // Получить значение диатраммы - дежурство Петрова на пахте. Значение = ДГ.Получит ьЗначеиисСТочкаП. Серия На Вах ге); // В значении определить новый интерпал. Ин терна.! • Значение.Добавнть(). // Запомнить интервал начала святи. С нм ii.HhiервалНачало « Ин терши; // Получить значение д на i рам мы - дежурство Петрова в центральном офисе. Значение « ДГЛолучи (ьЗначснисЧТочкаП. СерияВЦенгрс); Интервал Значсиие.ДобавиттЛ): // Запомнить интервал окончания святи. Сья л.И нт ервал Конец ж Ншервал; //( витать два интервала. Снять = (кязьИн1срвалНачал<}^1ибавнгы(ня тьИндервял Конец); С вить. Цвет а Web Цвет а. Си и ий; // Пат учить тмачение диаграммы - дежурство Сидором на вахте. Значение = ДГ.ПолучигьЗнлчснме(ТочкаС. Серия НаВахтс); Интервал - Значение ДобапигМд; СвятьИнтервал Начало в Интервал; // Получить шаченис диаграммы дежурство Сидорова в центральном офисе Значение - ДГЛолучнтьЗначсннсС ГочкаС. СсрияВЦентре); Интервал - Значение Добавит М); Снять Интервал Конец = Интервал; U ( вязать два интервала. Свить = (вятьИи гервалНачало.Добави ттДСвятьИн терна. тКоисп): ( вязь.Цвет №еЬЦвста.( ннин; Для добавления связи необходимо выполнить метод Добавить() того интервала диаграммы, который является началом связи. В качестве параметра этого метода необходимо передать интервал диаграммы, 295
Представление результатов отчетов который будет являться окончанием этой связи. Кроме этого можно задать другие свойства связи, например цвет. В результате будет получена следующая диаграмма: Как обработать интерактивное изменение интервалов диаграммы Ганта? Для того чтобы пользователь имел возможность интерактивного изменения интервалов диаграммы Ганта, необходимо свойству Редактирование нужных интервалов присвоить значение Истина: // Получить значение диаграммы - дежурство Петрова на вахте. Значение = ДГ.ПолучитьЗначение(ТочкаП. СерияНаВаме): И Ратрешить итеракгнвиое редактирование интервалов. 1начение.Редак1иротц|ние = Истца: И Подучит», значение диаграммы - дежурство Петрова в ценралыюм офисе. Значение = ДГ.Получи1ьЗначсн1к(Точка11. СерняВЦензре!; (качение. Редактирование = Петина: И Получить значение диат роммы - дежурство Си.дорока на вахте. Значение — ДГ.Полу'читьЗначение1ТочкаС. СермяНаВаме); Значеине.Релактнрование = Истина; И Получить значение диатраммы - дежурство Сидорова в центральном офисе. Значение = ДГ.ПалучитьЗначение(ТочкаС. СерняВЦентре); Значение.Редактирование - Истина: Интерактивное изменение интервалов диаграммы Ганта приводит к генерации события При окончании редактирования интервала. Используя обработчик этого события, можно выполнять различные 296
Диаграммы действия, связанные с изменением интервалов. Например, можно «дискретизировать» перемещение границ интервалов, «округлив» их до нужного значения или изменить цвет связи между интервалами, если интервалы «перекрывают» друг друга: I (роцедура Д! При(.)к0нчанииРе.и1КтнрованияИитерв«*.1«(Олемент. Интервал, Отмена) // Сгладить погрешности интерактивного перетаскивания - // окруышь интервал по iранние дня. Интервал.Начало = Иитервал Начало + 3600 * 12; Интервал. Начало — НачалоДнш Интервал Начало); Ингервал.Конси - Интервал.Конец + 3600 * 12; Интервал. Коней = НачалоДя н(Ингервал. Конец >; // Скорректировать циста святей Для Каждого Связь Из Интервал Цикл Если Связь.Начало.Кокен <я Связь. Конец. Начало Тогда Связь Цвет = \УеЬЦвеза Синий. Иначе // есть пересечение интервалов * выделить красным Связь.Цвет » \УеЬЦвста.Красный: КонецЕслн; КоиецЦикла; КонеиПроцедуры Если добавить этот код к примеру «Как связать интервалы диаграммы Ганта?» на странице 295, то изменение границ интервалов диаграммы станет возможным с «точностью до дня», а при частичном перекрытии связанных интервалов связь между ними будет отображаться кэасным цветом. 297
Представление результатов отчетов Как разместить непериодические метки в диаграмме Г анта? Диаграмма Ганта позволяет размещать на шкале времени непериодические метки, которые могут использоваться для обозначения контрольных точек или произвольных событий, связанных с отображаемыми в диаграмме данными. В качестве развития примера «Как обработать интерактивное изменение интервалов диаграммы Ганта?» на странице 296, можно добавить в диаграмму две непериодические метки, которые будут обозначать события проверки дежурств, выполняемых сотрудниками: И Установить непериодические метки - контроль дежурства. // Создал, отдельный элемент шкалы времени (для более на» ладного отображения) ЭлементМсток - ДГ.ОбластьПостроснмя и1калаВрсмсни.Элсмснты.Добавить(); Элемент М сток. Единица = Гн п Еди 11 и i ты 111 калы Врем сн и Ден ь; // Скрыть периодические мет ки добавленного tie мента ЭлсмснтМсток.ОтображатьПсриодичсскнсМгткм » Ложь. // Установить метку - первая проверка - 10 часов утра 9 числа. 11срвая Проверка » Первый День + 8 * 24 * 60 * 60 4 10 * 60 60; Метка = ЭлсмснтМет<ж.Метки.Добавитъ(ПерваяПроверка); Мелся.Текст « "Проверка"; Метка ЦветТекста ₽ WebUee та. Красный: Мет ка.Цвет Линии « Метка, Цвет Текста; И Установить метку • вторая проверка - X часов вечера 23 числа. Вторая! 1роверка = 11срвыйДснь + 22 * 24 * 60 * 60 ♦ 20 * 60 * 60; Метки Э.темснтМеток. Метки Добавн г ь( Вторая Про верка); Метка.Текст = 'Проверка"; Мстка.ЦветТскста = \УеЬЦвста.Красный: Метка. Цвет Линии = Метка.! (встТекста; 298
Диаграммы Для добавления непериодических меток мы используем дополнительный элемент шкалы времени лишь для более наглядного отображения меток. Те же самые метки можно было бы добавить и в существующий элемент шкалы времени. Также для каждой метки мы задаем текст, цвет надписи и цвет линии, которая будет отображать эту метку в диаграмме. В результате будет получена следующая диаграмма: 299
Представление результатов отчетов Как выделить некоторые интервалы фона диаграммы Ганта? Диаграмма Ганга позволяет выделять цветом фона произвольные интервалы. Эта возможность может использоваться, например, для «подсветки» выходных дней. Для иллюстрации этой возможности к примеру «Как разместить непериодические метки в диаграмме Ганта?» на странице 298, можно добавить код, который выделит выходные дни другим цветом фона диаграммы: // Выделить выходные дни другим цветом <|юна. I {еделя = 3600 ♦ 24 ♦ 7; Выходные = 3600 • 48; МаксимальнаяДзта = ПсрвыйДснь ♦ Неделя * 4; ТскущаяДата - ПсрвыйДснь; Пока ТскущаяДата <= МаксимальнаяДаш Цикл; Кокен = ПачалиНетелиСТекушаяДатаг. Начало = Конец - Выходные: ДГ.И|11ерва.1ыФона Доб>ави1'ь(Начало. Конец); ТскущаяДата = Теку тая Да га ч- Неделя; КонецЦикла: Чтобы выходные дни выделить другим цветом, мы добавляем нужные интервалы к коллекции интервалов фона диаграммы. Цвет создаваемых интервалов мы не меняем - используем назначаемый по умолчанию. В результате будет получена следующая диаграмма: 3 0 0
Географическая схема (D Как отобразить в форме файл географической схемы? Для этого следует разместить в форме поле географической схемы (например, «ГеоСхема») и выполнить метод ПрОЧИТЗТЬО: Схема = ЭлсмснтыФормы ГеоСхема; С хемз. Прочитать! 'DTMyGeo.geo'); (D Какотобразить в форме макет географической схемы? Для этого следует расположить в форме поле географической схемы (например, «ГеоСхема»), а затем получить макет географической схемы (в следующем примере это один из общих макетов), и вывести его в поле в форме: Схема = ЭлсменгыФормы.Г еоСхема; । Схема Вывести! Получитг.ОбтийМакетСГеографическаяСхемаРоссии*)); (D Как изменить масштаб географической схемы? Для этого следует установить соответствующий режим отображения географической схемы (ЗадаетсяМасштабом) и задать требуемый масштаб: Масиггаб = КМХХХГ, Если ВвсстиЗначснис! Масштаб) Тогда Э.к-мсктыФормы.ГсоСхема.ПодаержкаМасштаба = РсжимОгображснияГсографичсскойСхсмыЗадастсяМасапабом: ЭлементыФормы ГеоСхема. Масштаб = Масиггаб; КонецЕслн; 301
Представление результатов отчетов Как отобразить на географической схеме выбранный город? Предположим, что в форме расположено поле географической схемы («ГеоСхема»), в которую выведен макет регионов России, содержащий слои «Регионы» и «Города» (такой макет, например, содержится в демонстрационной конфигурации «Географическая схема» ИТС). Требуется предоставить пользователю возможность выбрать из списка некоторый город и затем отобразить этот город на карте России. Эта задача может быть выполнена при помощи следующего кода: Схема = ЭлсмснтыФормы.1 соСхсма; СпмсокГ'ородов я Новый СписокЗввчений И Запретить перерисовку схемы на время обновления. Схема) )бнов.|енне ~ Ложь; И Отобразить слой Регионы. СхемаХ лои.Регионы Видимость = Истина; ИЗадать тип отображения названий городов. С.тойГорода = С хема.Слои Города: СлойГорОда.Серии.Название.ТицОтображсния = ТнпОгображенияСерниСлояГео|рафичсскойСхсмы.Текст; // Сформировать список городов и скрыть все города. Для Счетчик = О По СлойГорола.Объскты.КоличествсК) - 1 Цикл Город = СлойГородаОбьект ы.Получить) Счетчик); Город. Видимость « Ложь; НазваниеГ орода = С.тойГорода. ПолучитьЗначение( Город. Слой Города .Серни На лешие); НазваниеРегиона = Слой Городя . ПолучнтьЗиаченне) Горо.ц С лойГоро на.Серии. Регион); СписокГородов .Добиви ть( Счсгч нк, НазваннеГорода Значение + " (” -г Назвал иеРегиона.Значение -в ")"); КонецЦикла; СлойГорода.Видимость = Истина: // Отобразить слой Города. СписокГородовХортироватьПоПрслстаалснзпо)); ВыбраннынГород = СписокГородов.ВыбратьЭлемент)>; Если ВыбранныйГород о Неоцреледено Тозда I оролСхсмы = С лойГорода-Объскты.Получить) ВыбранныйГород.Значение); ГоролСхемы.Видимость - Истина; // отобразить выбранный город КонецЕсли; Схема.Обнов.1сннс = Истина: Н Обновить схему. 302
Географическая схема В этом примере осуществляется обход всех объектов слоя «Города», и формируется список городов, который затем открывается для выбора пользователю. После того, как пользователь выбрал город, видимость выбранного объекта устанавливается в значение Истина. Поскольку для серии «Название» задан тип отображения Текст, рядом с городом будет отображено и его название. Как использовать таблицу значений в качестве источника данных географической схемы? Для иллюстрации работы географической схемы с произвольным источником данных расположим в форме поле географической схемы (например «ГеоСхема») и под ним табличное поле («ИсточникДанныхГеоСхемы»), связанное с таблицей значений. В поле географической схемы выведем макет регионов России, содержащий слои «Регионы» и «Города» (такой макет, например, содержится в демонстрационной конфигурации «Географическая схема» ИТС). Затем выполним следующий код, который создаст источник данных типа На Пересечен И И и назначит его географической схеме: Схема ЭлименгыФормы.ГеоСхема. Схема.Обновление = Ложь; Н Запретить обновление схемы. //Отобразить слои Регионы и Города. Схема. Слои Pei ионы Вилимость = Истина; СлойГорода = Схема.Слон. Города: Слой Города. Вили мость = Истина; // Добавить новую серию для отображения данных источника. Сери я Информация - Схема.С.1кШ. Города.СсринДобавить{'Информация' >; СсрияИнформаиия.Значеиис "Информация"; //Сформировать таблицу значений источника данных. ИсточникДанныхГеоСхемы. Колонки. Добавн i ьСЗначениеГорида"); ИсточпикДа1П1ЫхГеоСхемы.Колонкн.ДобавитьССерняИнформаиия". Новый ОписаниеТиновССтрокз")); // Добавить справочную" колонку в истоник данных //(нужна только для "iiaiладности" работы с источником). 11сточникДаниыхГеоСхемы.Колонки.Добавить(”НазванисГорода"); । // Заполнить в первой строке источника данных значение серии, // для которой будут выводиться данные ИсточникЛэнныхГеоСхемы.ДобавитьО.СсрняИнформация = Информация'; 303
Представление результатов отчетов // Задать тми источнику данных Схсма.Слои.1 орода. I ип()рглннзацниИсточниклД.знных — ТипОр1аннзац}1иИсточникаДанныхГсо1 рафическойСхемы.НаПересечении Тип(>гобрзжсния( срин<’.тояГсо!ра<|)ичсс'кой('хсмы Гскст; // Заполнить источник данных значениями всех объектов. Для Каждого Город Из С лоЙГоро да.Объекты Цикл Город. В иди мосты = Истина; Строка Ист он ннкаДанных » ИсточникДвнныхГеоСхемы.Добавить(): С |рокаИсючнимаДалных. Значение Гирода » Город.3начсние: СтрокаИсто’гникаДанных НазваннсГорода = СлойГорода ПолучигьЗначсние< Город. СлойГорода.Ссрни Название» Значение: КоиецЦикла; Элемен1ыФормы.ИсточникДанныхГеоСхемы.СоздатьКолонкн(»; Схема Обновление = Истина; И Обновить пате географической схемы. // Назначить источник данных. СдойГорода.ИсточникДанных « ИсточникДанныхГеоСхемы: Табличное поле «ИсточникДанныхГеоСхемы» иллюстрирует устройство источника данных типа На Пересечен И и. В первой колонке расположены значения объектов, а во второй - должны находиться те значения, которые должны быть отображены для этих объектов в серии «Информация». Серия, в которой должны отображаться значения, идентифицируется своим значением, которое указывается в первой строке источника данных в соответствующем столбце (в нашем случае это строка «Информация»). Последняя колонка в источник данных добавлена исключительно в «демонстрационных» целях. Этой колонке не соответствует никакая серия в слое Города, поэтому она просто игнорируется географической схемой. Введя произвольные значения в колонку таблицы «СерияИнформация», можно увидеть, что они будут отображены для соответствующих объектов слоя «Города». Следует учитывать, что данный пример лишь иллюстрирует работу с источником данных, поэтому он содержит для наглядности все объекты слоя Города (около 2 500 городов), что замедляет его работу. Кроме того, в реальных задачах обычно в качестве источника данных используется не таблица значений, а результат запроса, имеющий аналогичную структуру. 304
Администрирование Запуск 1 С:Предприятия из командной строки ф Как запустить 1С:Предприятие из командной строки? Для запуска 1С:Предприятия в пользовательском режиме, в случае если база данных функционирует в файловом варианте. 'CAProgram Files\lcv8\bin\U-v8 exe' ENTERPRISE /F ОЛКонфи! урации\Тшювь№\УпрТорг /N ИмяПользователя /Р Пароль Для запуска ЮПредприятие в режиме «Конфигуратор», в случае если база данных функционирует в файловом варианте. "CAProgram Files\lcv8\binUcv8.exe’ CONFIG /F 0;\Конф|11\раини\Тнг10вые\УпрТор! /N ИмяПользователя /Р Пароль Для запуска ЮПредприятие в пользовательском режиме, в случае если система функционирует в клиент-серверном варианте. "CAPiogram Fil<-s\lcvR\bin\lcv8 e»e" ENTERPRISE ZS СерверУБаза ZN ИмяПользователя ZP Пароль Для запуска ЮПредприятие в режиме «Конфигуратор», в случае если система функционирует в клиент-серверном варианте. "C:\Prngram Files\lcv8\bm\lcv8.exe” CONFIG ZF ОАКонфнгурацииХТ иповысУУпрТор! ZN ИмяПользователя /Р Пароль 305
Администрирование ENTERPRISE - режим «Предприятие» CONFIG - режим «Конфигуратор» /F Путь к базе, функционирующей в файловом режиме /S ИмяСервера\ИмяБазы, функционирующей в клиент-серверном режиме /N Имя пользователя /Р Пароль пользователя Замечание: в этих и последующих примерах командная строка отформатирована (добавлен перенос на следующую строку) для повышения наглядности. В реальных примерах весь текст должен записываться в одну строку. Как из командной строки заставить 1 С:Предприятие сделать выгрузку базы данных? В командной строке необходимо прописать следующее: "C:\Program FilesUcv8\binUcv8.exe" CONFIG /F ОАКонфнгураинмУГиповмсХУпрТорг /N Имя1 1о 1ьмша1еля /V Пароль /Dump! В сАнчя.Л Какиз командной строки обновить изменения текущей конфигурации в конфигурации базы данных? В командной строке необходимо прописать следующее: "C:\Program Files\lcv8lbin\lcv8.exe'' CONFIG /F 0;\Конфнгурании\Типовыс\УпрТорг /N Имя! !ольюватсля /Р Пароль /UpdalcDBCfg 306
Запуск 1 С:Предприятия из командной строки Каквыполнитьтестирование и исправление информационной базы без проверки ссылочной целостности вавтоматическом режиме? Для этого следует использовать режим пакетного запуска конфигуратора из командной строки: "C:\Progrum Files\lcv8\bin\lcv8.exe" CONFIG /F*C:\Documems and Sciting'Uiu'f'Aly DiH4inwntsUC\DeinoTrd2* ZN "Федоров (Администратор)* /Р** ZIBcheck And Repair -Loglntegrity Параметр /IBcheckAndRepair позволяет выполнить тестирование и исправление информационной базы, а ключ -Loglntegrity указывает, что при проверке логической целостности не будет выполняться проверка ссылочной целостности. Как выполнить проверку конфигурации в автоматическом режиме с выводом результатов проверки в файл? Для этого следует использовать режим пакетного запуска конфигуратора из командной строки: ’C:\Program Files\lcv8\bin\lcv8.exe* CONFIG /F*C:\Docunient.s and ScttingsVuscrAMy DocumrnU\1C\DcmoTrd2*' ЛМ^Федоров (администратор)" /Р’" ZOutDAmyMog.txt /CheckConfig -ClientScrver -Client -ExtemalConnectionScrver -ExlemalConneclion -Server -DisiributivcModulcs -InconcctRefcrences -OmfigLogiual Integrity -Unrctercnce Procedures -HandlcrsExistcncc -EmptyHandlcn Параметр /Out позволяет задать имя файла, в который будут выводиться результаты проверки. Параметр /CheckConfig позволяет выполнить проверку конфигурации, при этом используются следующие ключи: -ClientServer - Работа клиентского приложения в режиме клиент - сервер. Проверка компиляции модулей в режиме эмуляции среды клиентского приложения, выполняемого в режиме клиент - сервер. 307
Администрирование -Client - Работа клиентского приложения. Проверка компиляции модулей в режиме эмуляции среды клиентского приложения, выполняемого в файловом режиме. -ExternalConnectionServer - Работа внешнего соединения. Проверка компиляции модулей в режиме эмуляции среды внешнего соединения, выполняемого в режиме клиент - сервер.. -Server - Работа сервера 1С:Предприятия. Проверка компиляции модулей в режиме эмуляции среды сервера 1С:Предприятия. -DistributiveModules - Поставка модулей без исходных текстов. В случае если в настройках поставки конфигурации для некоторых модулей указана поставка без исходных текстов, проверяется возможность генерации образов этих модулей. -IncorrectReferences - Поиск некорректных ссылок. Поиск ссылок на удаленные объекты. Выполняется по всей конфигурации, включая права, формы, макеты, интерфейсы и т.д. Также осуществляется поиск логически неправильных ссылок. -Config Logical Integrity - Проверка логической целостности конфигурации. Стандартная проверка, обычно выполняемая перед обновлением базы данных. -UnreferenceProcedures - Поиск неиспользуемых процедур и функций. Поиск локальных (не экспортных) процедур и функций, на которые отсутствуют ссылки. В том числе осуществляется поиск неиспользуемых обработчиков событий. -HandlersExistence - Проверка существования назначенных обработчиков. Проверка существования обработчиков событий интерфейсов, форм и элементов управления. -EmptyHandlers - Поиск пустых обработчиков. Поиск назначенных обработчиков событий, в которых не выполняется никаких действий. Существование таких обработчиков может привести к падению производительности системы. 308
Запуск 1С предприятия из командной строки Как сократить журнал регистрации программно? Для этого следует использовать режим пакетного запуска конфигуратора из командной строки с параметром /ReduceEventLogSize: "C:\Program Files\lcv8\b<n\lcv8 exe" CONFIG /F"C:\Docunwnt_s and Scttings\user\My Documents) I C\Den>oTrd2' /ЬГФедоров (администратор)" /Р"“ /OutDAmyUog.txt /RcduccEvcnll.ogSia: 2(X)4-l2-26 -savcAsC:\Oidl.og.elf После параметра /ReduceEventLogSize обязательно должна быть указана новая граница журнала регистрации, а ключ -saveAs позволяет указать файл, в который будут сохранены копии выгружаемых записей. Как выгрузить модули прикладного решения в виде текстовых файлов из командной строки? Для этого можно использовать режим пакетного запуска конфигуратора из командной строки с параметром /DumpConfigFileS: "C:\Program Files\lev8\bin\lcvX.exe’ CONFIG /F*CADixrumcnts and SettingsXuscrXMy D<x.uinenls\IC\Den>oTrd2’‘ /N "Федоров (администратор)4 /Рии /DumpConfigHilts "D:\l\l I " -Module После параметра /DumpConfigFiles указывается каталог, в котором будут находиться выгруженные файлы, а ключ -Module указывает, что необходимо выгружать только модули, содержащиеся в конфигурации. 309
Администрирование Какзагрузить в прикладное решение файлы справки, сохраненные в формате htm? Для этого можно использовать режим пакетного запуска конфигуратора из командной строки с параметром /LoadConfigFiles: "CAProgram Files\lcv8\bin\lcv8.exe* CONFIG /F*C:U Jocumcnls and Sctlings\user\My I>x.'umcrHs\IC\Dcino1 rd? /Ь"Фсдорок (администратор)" /Р"" /LoadConfigFiles "D:\l\l Г -Help______________________________ После параметра /LoadConfigFiles указывается каталог, в котором находятся загружаемые файлы, а ключ -Help указывает, что загружать нужно только файлы справки. 310
Разное ф Как поменять значение рабочей даты? Прежде чем устанавливать значение рабочей даты на «УсганавливаемаяДата», необходимо убедится, что рабочая дата не определяется системной датой компьютера: Если ИсполиованиеРабочсйДаты - РсжныРабочснДаты.Назначать Тогда РабочаяДата УсганаилинаемаяДата; Иначе Сообщить)'Рабочая дата не будет сменена (Необходимо сначала в меню Сервис-Параметры-Общая (снять флажок - Использовать текущую дату* компьютера ") КонецЕсли; Проверка осуществляется для свойства глобального контекста ИспользованиеРабочейДаты на равенство значению Назначать системного перечисления Режим Рабочей Даты. В случае выполнения условия назначаем значение свойству глобального контекста РабочаяДата. © Какустановить/снятьмонопольныйрежим? Установленный монопольный режим позволит пользователю быть единственным пользователем базы, пока он установлен. Однако сам монопольный режим возможно установить только в том случае, если на момент установки пользователь был единственным: Попытка УстанояитьМонопольныйРсжим) Истина): Исключение Предупреждение)'К базе подключены пользователи. (Монопольный режим установить невозможно'*. 7); КонеиПопы тки: Как видите, если применение процедуры работы с информационной базой УстановитьМонопольныйРежим() приводит к ошибке приходится с этим смириться. Хотя если захотите обеспечить выход других пользователей из системы - в настоящем издании есть пример 311
Администрирование того, этого добиться: «Как принудительно завершить работу всех пользователей информационной базы в клиент-серверном варианте работы?» на странице 320. Кроме самой установки монопольного режима можно еще, например, убедиться, что в текущий момент работа идет в монопольном режиме: Соо^щитьСМонопольнын режим установлен**); КонсцЕсли: Или же снять монопольный режим: Ус1а1Юнип.МоногюльныйРгжнм(Ложь); ф Как внести запись в журнал регистрации? Основные события системы (запись, удаление объектов и т.п.) при установках соответствующей политики ведения журнала регистрации заносятся туда автоматически. Однако есть еще возможность регистрации дополнительных действий. Например, приведенный ниже код позволит регистрировать факты обращения пользователя к отчету «Рапорт руководителя». Его надо лишь разместить в соответствующем обработчике события. Запис1* *Жур11алаРег11С1раимиГОтчг1 шаеДанные.Просмотр'. УровеньЖурналаРе! неiрации Информация, Метаданные!). Да т а Кон. i; В качестве параметров можно указывать: • событие (строковое описание, допустимо использование «.»); • уровень важности события (будет отображено соответствующей пиктограммой). Тип значения - элемент системного перечисления УровеньЖурналаРегистрации; • объект метаданных. В нашем случае определили его посредством соответствующего метода; • данные. Для указания ссылок на объекты, с которыми связано данное событие. Например, на конкретный документ или элемент справочника. В нашем случае - указали переменную содержащую дату формирования отчета; • комментарий. 312
Разное ф Как получить данные о зарегистрированных пользователях информационной базы? Данная задача может возникать при выгрузке подобных данных в другую информационную базу, или при первичном заполнении справочника «Пользователи». Выборка х Нольх>мг1СЛиИнформацио1||10йБп1>1.ПалучитьПолыоште.кй(1 Для Каждого ЭлсментМассива Из Выборка Цикл ИмяПользователя = Э.1ементМасснва.Имя; ПолносИмяПользователя = ЭлемснтМасснва-ПолноеИмя; Есть! !зроль а 'ЭлсментМагсива.ПарольУстаноален; Роли = ЭлементМассива Роли: Для Каждого Роль Из Роли Цикл ИмяРоли = Рол (..Имя. КоиецЦикла; КоиецЦикла; В указанной процедуре работа по получению списка пользователей начинается с обращения к свойству глобального контекста ПользователиИнформационнойБазы. Метод ПолучитьПользователейО возвращает массив объектов ПользовательИнформационнойБазы, который обходится потом в цикле. 313
Администрирование (ОКакопределить общую системную информацию? Получить подобное предупреждение: можно посредством такого кода: Инфо = Новый Системная! (мформаимя; Текст = "Версия I С: Предприятия 8.0: " 4- Инфо.ВсрсияПриложсння; Текст = Текст 4 Символы.ПС 4 "Конфигурация: * 4 Метаданные.Синоним; Текст® Текст 4 Символы.ПС + "Поставщик: " д Метаданные .Поставщик; Текст я Текст 4 Символы. ПС 4 'Операционная система:' 4 Инфо.ВсрсняОС; Текст = Текст + Символы.IIC 4 "Оперативная память (МБ): " 4 Инфо.ОперспивначПамять. Текст = Текст 4 Символы.ПС + "Процессор." 4 Инфо.Процессор; Предупрежден н<,ч Текст,, "ДАННЫЕ ТЕКУЩЕГО КОМПЬЮТЕРА И КОНФИГУРАЦИИ"); Создаем конструктором новый объект СистемнаяИнформация. Считываем из него версию приложения, версию операционной системы, данные об оперативной памяти и процессоре. Данные о конфигурации считываем из глобального контекста, объект Метаданные. 314
Разное Как программно добэвить пользователя в информационную базу? При переносе данных из одной информационной базы в другую может возникнуть необходимость перенести и пользователей информационной базы. Для этого можно воспользоваться свойством глобального контекста ПользователиИнформационнойБазы: Новый! (оль'ювзтсль = ПользователиНнформашюнноЙБазы .СозджгьПользомтеляС); Новый!(ольздватсль.Имя - “Имя*; НовыйПояьэомтелъ.ПолноеИыя к ’Фамилия Имя Отчество"; Новый! 1ользова1елв.Ау1снгнф|1кацияСганяар(ная « Истина; Новый! 1олыоватсть.Оснонной11ггтерфейс = Метаданные Ин герфсйсы .Администратор; НовыйПольэонатсль.Паридь =’пароль"; Новый! (ольюватсль. Роли. Добавить^ Метаданные. Роли. Администратор); НовыйПольюватс.ть.Пока>ывап»ВСписксВыСюра я Ложь; НовыйПольюватель.Ятык » Мстадаииыс.Языки.Русский; НовыйПользователь.ЗаписзтьО; Следует отметить, что в свойство Пароль можно только записать новый пароль, прочитать записанный (определенный) ранее нет возможности. Замечание: добавление новых пользователей в информационную базу может осуществлять пользователь, обладающий административными правами. Если административные права у пользователя отсутствуют - он может изменить только ограниченный набор сведений о себе. Для того чтобы предоставить, например, менеджеру, не имеющему административных прав, возможность добавления новых пользователей с правами менеджера, можно поступить следующим образом. Создать обработку, с помощью которой менеджер будет задавать имя, пароль, набор ролей и другие свойства нового пользователя. Однако запись нового пользователя выполнять не на клиенте, а на сервере, передав нового пользователя в качестве параметра в процедуру привилегированного модуля: ЗапиеатьНово! оПагыоваге.1я( НошлйГ1 ель); 315
Администрирование В этом случае система не будет выполнять проверку прав пользователя, поэтому о проверке необходимых прав нужно позаботиться самостоятельно. Например, процедура привилегированного модуля может выглядеть следующим образом: Процедура ЗаписатьНовогоПользоватсляП 1овыйГ1ользовз1 ель) Экспорт И Проверить наличие роли Администратор у нового пользователя. РольАдминистраюр ж Метаданные. Роли. А дмнннсграюр; Если 11овый11ольюватель.Роли.Содержит^РояьАдминис tpaiop) Toi да <'o<i6miiTt>(VU*^ajLU*HHc гюль«) на те ля с адмннистрш ивнымн правами |й1 н решено."»; Иначе//у новою пользователя нет роли Администратор // Проверить, что текут и ii пользователь обладает правами Менеджера И или Администратора Если РольДостутша(РольАлминистратор) ИЛИ РатьДоступна1 Мсгаланныс.Разн.Менеджер) Тог та // Выполнить запись новою пользователя. НовыйПоль'юватель.ЗэписагьО; Иначе Сообшиты "Недостаточно прав доступа для добавления пользователя КонецЕслн. КонецЕст и; Коней! 1роислуры Если выполняется попытка добавить нового пользователя с административными правами - выдается запрет. Если набор ролей нового пользователя не содержит роль «Администратор» проверяется, является ли текущий пользователь менеджером или администратором - и если это так, то выполняется запись нового пользователя. В противном случае выдается сообщение об отсутствии прав доступа. 316
Разное Каксоздать собственный лог-файл для записи результатов работы внешней обработки? Для этого можно использовать объект ЗаписьФаЙЛЗ, который позволяет выводить текстовые строки в указанный файл: ФайлРсгнстрации = Новый ЗапнсьТекста<‘’C:\LogFile.ix Г» Кодировка Текс та ANSI, Истина); Файл Реп кпракии.Записатым Первое сообщение’’ + Символы. ПФ), Фай. (Регистрации. Записать! "Второе сообщение + Символы.! 1Ф); ФайлРегистрации.Закрытье);_____________________________________ При создании нового объекта ЗаписьТекста в качестве четвертого параметра конструктора указывается значение Истина, что говорит о том, что содержимое файла будет сохранено, если файл уже существует. 317
Администрирование Как в форме отобразить список пользователей, которые работаютсданной информационной базой? Для этого можно расположить в форме табличное поле (например, с именем «Пользователи»), и воспользоваться методом глобального контекста ПолучитьСоединенияИнформационнойБазыО, который возвращает массив, состоящий из описаний соединений с текущей информационной базой: Масси вС оеди нений = По луч н т t»C ое линек ня И нформа иноннс Колонки = Пользователи.Колонки; Колонки. Добавить) "Пользователь". ♦. 10). Колонки.Добиви гы "Приложение , 10); Колонки.ДЫэавитъСНачалоРабогы"... 10): Колонки Добавить!" Компьютер".». 10): Колонки Добавить) "Соединение*... 10); Для Каждого Соединение из Массиве ослинеинй никл НоваяСзрока ж Пользовате ли .Добавить)); НоваяСтрока.Компьютер = Соединение .ИмяКомпмозера; НоваяСтрока. Приложение — 11рслстав.1енисПрнложсння( Соединение И м н П ри.'южения); НоваяСтрока. ПачатиРабслы = Соединен не. НачалоСеансэ. НоваяСтрока. Соединение = Соединен ис.НомерСоединения; НоваяСтрока.Пользователь = Соединение.! 1ользовалельЛмя, КонецЦикла: Элемент ыФормы. Пользователи.Со здзтьКо тонки)) Как выгрузить журнал регистрации вХМ1_- формате? Для анализа событий, происходивших при работе прикладного решения (например, с использованием консоли анализа журнала регистрации) может потребоваться выгрузка журнала регистрации в формате XML. Выгрузка всего журнала может быть выполнена следующим образом: Bui рузитьЖу риал Pei ист рации) "C:\log.xmr). 318
Разное Если требуется, например, выгрузить только события, связанные с определенными пользователем (пользователями), можно в форме расположить список (например «СписокПользователей»), заполнить его имеющимися пользователями: Пользовал ели = 11ользоватеяиИиформаи1КМ{ноАБазы.ПалучитьПаяьзова1е.'1ей( ); Для Каждого Пользователь из Пользователи цикл НовыйЭчемент = Список! 1о л ьзовате лей ДобавитьО, НовыйЭлемен г.Пометка = Истина: НоныйЭлемеиг.Значение = Пользователь; НовыйЭлемект. Представление = Пользователь.Имя; КонецЦикла; А затем, отметив нужных пользователей, выгрузить только те записи журнала регистрации, которые относятся к выбранным пользователям: Массив = Новый Массив. Для Каждого Пользователь из СписокПользователей Цикл Если Пользователь. Пометка Тогда Массив. Добави i М Польюва i ель); КоиецЕсли; КонецЦикла: СтруктураФитыра = Новый Структура; СтруктураФюыра.ВставнтЦ "I !ольэовагсль'. Массив); ВыгрузнтъЖурналРсгистрации("(':\k>g л ml". СтруктураФильтра. "Дата. Поль ювазель. ПредставлсннеСобыгия*): 319
Администрирование Как принудительно завершить работу всех пользователей информационной базы в клиент-серверном варианте работы? Для этого можно воспользоваться возможностью программного доступа к серверу 1С:Предприятия. Нужно создать COM-коннектор и выполнить метод CoiinectServer(), который позволяет подключиться к указанному серверу 1С:Предприятия. Затем следует аутентифицироваться с правами администратора в выбранной информационной базе, получить все клиентские соединения этой базы и разорвать их: Коннектор = Новый СОМОбъектС'VK.COMConnccior Сервер = KoHHeKTop.ConiicctServcrf'Te^tSener'’); // Аутентифицироваться с административными нравами it нужной базе. С ервер. Adil A ui he пт icu< ton ("Л дм и и негра гор ”, "); // Соыять объект нужной информационной базы Ин форм анион на я Баш = Cep«cp-CrcatclnfoBascliifo(); ИнформацноннаяБаза.№ате = “Test Base"; // Получить соединения базы. СослиненияБазы = Сервер. (jclIBCTonncctionM Информ а пион чая База); // Разорви!ь соединения клиентских приложений. Для Каждого Соединение И t Соединения Базы Цикл 320
Интеграция Текстовый файл ® Как выгрузить данные из справочника в текстовый файл? Текст = Новый Текстовый Доку мент; Выборка - Слраоочншш.Номенкл8тура.ВыбратьО: Пока Выборка. Следуют и ЙО Цикл Стр СтрЗамсни гьШыборка.Наименование. Снмвол(34), *%квч9"): Код »Строка! Выборка..Код) * Chmbo.i(.M); Текст. Добави i ьС т року i Код + Стр); КонецЦикла. Гскст.Зяп исатЦ Hc:\tcmp\iext.txtw); В строке текста значения реквизитов справочника разделяются символом кавычка. Его можно получить, например, используя функцию Символ(34). В случае если символ разделителя (в данном случае - кавычка) может встречаться в выгружаемых данных, то перед помещением в строку меняем этот символ на заранее определенную комбинацию символов. В нашем случае это «%квч%». Считается, что подобная комбинация символов не может встретиться в данных. 321
Интеграция ф Как загрузить данные из текстового файла? Текст Новый 1скстовыйДоку.чеит: Текст. Проч итать( "c:\iemp\text.txt"); Для НомсрСтроки = 1 По Текст.КоличсствоСтрокО Цикл Стр Текст. ПолучитьСтрокуЧ НомерСтроки»: Позиция = НайгшСгр. Снмвол(34»; Код «Срсд(Стр. 1. Полиция-!): прНаименование = Срел(Стр. Позиция + I): Наименование — СтрЗамснитьОтрНанмсновамис, "%квч%", Символ!3-4)); СообшиттДКод + ♦ Наименование): КонецЦикла; При загрузке ориентируемся на используемый разделитель значений (это кавычка). После получения значения делаем обратное преобразование для разделителя (при выгрузке данных кавычку, встречающуюся в выгружаемых строках, заменяли на комбинацию символов «%квч%») Работа с текстом. Модель последовательного доступа Если в предыдущем примере текстовый документ загружался полностью, то в следующих примерах документ загружается «построчно». Это позволяет при работе с файлами больших размеров значительно уменьшить время выполнения задачи. Запись данных в файл: Путь = "c:\tempMext.ixr; Текст = Ноный ЗаписьТекст а( Путь, КолировкаТекста.1ПТ8); Выборка = Справочники. Номенклатура. Выбраты V. i 1<жа Выборка.СлсдующнЖ) Цикл Текст.Записать^ троку(Выборка Наименование); Конец Пн кла: Текст.Закры । ь(); 322
Текстовый файл Чтение данных: 11уть = ’c:\tcmp\iext. Ixt”; Текст = Ноиый ЧтсннеТексгЫПугь. КодировкаТекста.ЦТРЙ); Стр = Текст.ПрочнгагьСтрокуО: Пока Стр о Нсооредслсно Цикл Сгр = ТекстЛрочиттОгрокуО: Сообгпнтъ(Стр); КонецЦикла; 323
XML ф Как из одной базы перенести документ в другую базу? Необходимо экземпляр документа «РеализацияТоваровУслуг» (ссылка на который выбирается в диалоге создаваемой обработки) перенести в другую базу данных. Структура конфигураций идентична. Справочники (и другие сопутствующие объекты) синхронизированы по значениям внутренних идентификаторов. Для выгрузки потребуется выполнить следующий фрагмент кода: // Вытру игл» в фий.1 xmJ. ЗаиисьХМЕ=Новый ЗапнсьХМЕО; ЗапнсьХМЕ.ОткрьпьФай.и "c:\doc.xml*); ЗаписьХМЕ.Запис1ПъНичалиЭлемси1а1 "Root** К И Получить объект по ссылке. Bui ружисмыйОбъск! -Доку мен i .Получи гьОбьск п К // С помощью средств серпа лизании записать объект в фай. Записать X М ЦЗаписьХ МI,, ВытружасмыйС )бъсктк ЗаписьХМЕ.ЗаписатьКонсиЭлемен га(); За । тис ьХМЬ. Закрыты); При выгрузке создаем элемент «Root» исходя из соображений, что в xml-документе должен быть только один корневой узел, а в общем случае (но не в нашем) выгружаться может не один объект. 324
XML Для загрузки выгруженного значения используем следующий фрагмент кода: ЧтениеХМЬвНовый Ч iciineXMLO; ЧтенисХМЬ.Откры i ьФайлСсЛйос.хтГ): // Текущим становится элемент Root. ЧтсниеХМЬ.Прочитвгы ): //Текущим становшся элементе документом. ЧтснисХМЬ. Прочитать!'): // Проверить сможе! ли с данным значением 'справиться И система сериализации в данной базе. Если ВозможностьЧтеиияХМ! .(ЧтениеХМ!.) Тог ла // Получить Доку мен 1О6ъекг.Реализация! оваровУслуг Загружаем ыйОб1»ект=ПрочнтатьХ Ml.(ЧтсннсХ ML); 3.тгружасм!4ЙОбъс>п .Записи гъ(); КонсцЕсли; ЧтсннеХМк. Закрыть!); 325
Интеграция Как можно сформировать ХМL-документ произвольной структуры? Путь к формируемому XML-документу указан в переменной «ПутьКФайлу». Используется модель последовательного доступа (работа осуществляется только с одним текущим узлом). Запись = Новый ЗзписьХМЬ, Запись. О г крыть Фа ill (ПутьКФайлу); Зап ис ь-Зап нсэтьОбъ я ял снис X МI .О; 3ai 1 на». ЗаписатьНачалоЭлемента<" Корневой" Г. Запись. Записи! ьЛ трибут( ’С i ipuuoM ник"." Номенклат у ре"); Запиеь.ЗаписотьКомментарнй! "Краткая информация о номенклатуре”): Выборка = Справочники. Номенклатура. ВыбрзтьИсрархичсскмО; Пика Выборка.Следуюшнй! ) Цикл Если Выборка ЭтоГруппа Тогда Продолжить. КонецЕслн; Запись.'Записать! 1ачалоЭле мента! "Элемент"); Запись.ЗаписатьАтрибут! "Кол”. Строка!Выборка Кол)); ЗапнсьЗаппсатьЛтрмбутС Артикул”, Строка! Выборка Артикул)); Запись. ЗаписдгьТексг! Выборка Наименование); Запнсь.ЗипнсагьКоиецЭлеменгаО: Консц1 (икла: Запись.'ЗаписатьКонсцЭлсмснтз!); В результате будет получен файл вида (просмотр в Internet Explorer): <?xml version="l,0" ?> <Корневой Справочник-’НоменклатураВ * * 11 > с:Элемент Код="6" Артикул="1234">В|д (капилярная)</Э.г Олемент Код="3" Артикул--" 1 235" > Пар кер "Golg”</3J18M« Олемент Код="5" Артикул=" 1 236">Шариковая обычная Олемент Код="7" Артикул=п1 237">КоИ!пог м</Элемент> <ЭлементКод="8"Арти кул=" 12 3 8" > КоЫпогт</Элемент> <ЭлементКод="4йАрти кул="123 9"> КоМпогтмс/Эле мент> Олемент Код="14" Артикул="1240">Агс!о TL 1000 ЕХ-1</ Олемент Код=”15" Артикул=*124Г>1т1в5Н: WS 105ТХ</ Олемент Код="11" Артикул=н1242н>ВО8СН KGS 3760 1Е< Олемент Код="12" АрТ5!К’лп="1243">ЕЕЕСТПОЕиХ ER 900 </Корневой> 326
XML Можно сказать, что XML-документ состоит из набора элементов. Элемент можно упрощенно представить в виде совокупности структурных единиц: < НачалоЭлемента ИмяАтрибута=Значение ИмяАтрибута=Значение.....> Текст <КонецЭлемента> Создание XML-документа с помощью объекта 3anMCbXML производится путем помещения в строгой последовательности (иначе будет нарушена структура) «частей» узлов. Как сформироватьXML-документ в строку? Требуется, чтобы запись XML-документа производилась не в файл, а в строку. Рассмотрим пример: Запись = Новый ЗалмсьХМЦ); {ап ись. У станов м гь(т року (); Запись. ЗаписатьОбъявтсниеХМЦ); Запись. Записи гьНачалоЭлемеи га( "Корневой"): Запись/ЗалнсатьАтрибут("Справочник", "Номенклатура"); Запись. ЗаписатьКоммсптарийС*Краткая информация о номенклатуре"); Выборка = Справочники.Номснклатура-ВыбршъИерархичсски (); Пока Выборка.СлеяуюшиЙС) Цикл Если Выборка/ЗтоГруппа Тогда Продолжить, КоиецЕсли; Запись.Запнса! ьНачалоЭлемента( "Элемент"); Запись.Записи! ьЛ i рнбут(иКод”. Строка! Выборка.Код)); Запись.Зш1ИсагьАгрнбуП "Артикул". Строка! Выборка. Артику л)); Зап ись. Зап иса гьТскс г< Выборка. И ан ме в о ван и с); Запись Записал ьКонсцЭлемен ratf); КонецЦикла; За пись. Зап иса । ьКонецЭ.темеша!); Crpz Запись.Закрыты); СообщитЫСтр); 327
Интеграция Для вывода X ML-доку мента в строку после создания объекта ЗаписьХМЦ необходимо использовать метод УстановитьСтроку(). Только в этом случае метод Закрыть() вернет строку, которая будет содержать сформированный XML-документ. Как можно обмениваться данными, используя XML-сериализацию через файлы других форматов? Под XML-сериализацией понимается возможность записи или чтения данных из ЮПредприятие 8.0 в (из) XML-документ. Но фактически при выгрузке данных выгружаемое значение агрегатного типа можно посредством сериализации преобразовывать в фрагмент XML и сохранять в файлах произвольных форматов как строковое. Необходимо выгрузить экземпляр документа, ссылка на который находится в переменной «СсылкаНаДокумент» в текстовый файл: ЗаписьХМТ. = Новый ЗапнсьХМи); Зал и сь X ML. У станов нтьСтроку (): Данные = СсылкаНаД<жумеи'Г.По:|уч1пъОб1«ектО: ЗалмсатъХМЦ ЗанисьХМЬ. Данные): ТскстСообшення = ЗаписьХМТ ..Закрытье'); Текст « Новый Те кетовый Док у мент; Текст. УстановитьТексИ ТекстСообщен ня): Текст. ЗапнсатЦПугьКФайлу); Метод УстановитьСтрокуО устанавливает режим вывода данных не в XML-файл, а в строку (строка возвращается при выполнении метода Закрыть()). В другой базе необходимо загрузить данные из полученного текстового файла: Текст «= Новый Текс юны и Документ; Текст. I ТрочнтатьНТутъКФайпу). ЧтениеХМЬ = Новый ЧтеннсХМЦ); ЧтсниеХМиУ ст ановитьС троку (Т скст .1 Тол уч итьТексп.)); Если ВозможностьЧтенняХМиЧтеннеХМТ ) Тогда Данные = ПрочнгагьХМЦЧтсниеХМТ.); ДаннысЗаписатьТ); КонецЕсли; 328
XML Следует отметить, что данный механизм будет работать в том случае если документ в базе данных источника и приемника имеет абсолютно одинаковую структуру. Как можно загрузить ХМL документ произвольной структуры? Путь к загружаемому X ML-доку менту указан в переменной «ПутьКФайлу». Используется модель последовательного доступа. В данном примере под загрузкой будет пониматься чтение данных и вывод их в окно служебных сообщений. Загружать будем документ, выгруженный в предыдущем примере. Чтение = Новый ЧтениеХМЕ; Чтение От крыт ьФай, К 11 утьКФайлу); Пока Чтение. Прочнтагь() Цикл // Прочитать «структурные части» элементов. // Проверить. какая часть элемента - текущая. Если Чтенне.ТипУзла = ТнпУзлаХМЕ НачалоЭлсмента Тогда Имя Ухта - Чтение.Имя; Сообщили * ИмяУзла); // Атрибуты элементов можно читать только если текущая часть - К начало элемента Пока Чгснне.ПрочнгатьАтрнбугО Цикл И Прочитан» данные узла атрибут. ТипУзла = Чтение.ТилУпа: Имя = Чтение.Имя; Значение ~ Mienne.Значение. //Обработать полученные значения. КоиецЦикла; Иначе Если Чтение ТипУзла = ТнпУзлаХМЕ,Текст Тогда // В примере просто выводим текст в окно сообщений. Сообщить! "Текст;' + Чтснис.Зиачсние); ИнячеЕсли Чтение ТипУзла а ТнпУхтаХМЪ.КоиепЭлемснтз Тогда // В примере просто выводим признак конца элемента // в окно сообщений Сообщить!-Конец:” ♦ Чтение.Имя). КонецЕслн, КонецЦн»- | | 329
Интеграция Объект ЧтениеХМ1_ производит чтение данных, используя модель последовательного доступа. В этой модели обход документа производится именно по его структурным элементам последовательно, за исключением узлов атрибутов, для которых необходимо организовывать вложенный цикл. Приведем фрагмент данных выводимых в окно служебных сообщений: * I-Корневой * Атрибут ИМя:Справочник Значение:Нимем>натура * --Элемент * Атрибут Имя: Кол ваче кие; б * Атрибут Кин;Артикуя Значение:1234 * 'Текст: Big (калияяркаяi * — Ковеи: Элемент * [ — Элемент ’Атрибут Имя:Код Значат^ :3 * Атрибут 1*ее: Артикул Значение: 1235 * I Тенет: Паркер ’’Golg” • I --Конец: Элемент 330
DBF-файлы ® Как можно построить выгрузку-загрузку посредством файлов DBF? Не смотря на то, что формат DBF считается уже устаревшим, может возникнуть необходимость работы с файлами данного формата. Выгрузка данных: БД Новый XBase: ЬД11о.1х.Дибавить('СООЕ. *S", 5); БДПоля.Дт>бав1ТГЫ^АМЕ", "S’.40); БД.Сох1атьФайл(Путь + "start.dbT, Путь + "index.cdx"): БДИн;тексы.Доиавиты'ЮХСООЕ", "CODE"); ФлИБД = БД.СоздатьИ||лсксныйФаП.1(Путь + "index.cdx*): БД.АвтоСохрансннс = Истина; Выборка = ( правочннкн Номенклатура.Выбрвгь11ерархически(); Пока Выборка.Слсдующий!) Цикл БД Добавить!), БД-CODE = Выборка.Код. БД NAME - Выборка.Наименование; КонецЦикла: БД ЗакрытъФайл!); Загрузка данных: БД = Новый XBase. БД Откры гьФайл! Пу ть + " start.dbT. Путь + "index.cdx'); БД.ТекутийИнлекс = БД.Инлсксы.ЮХСООЕ; Пока БДСледующая!) Цикл Сообщить) БД-CODE); Сообщиты БД.NAME); КонецЦикла: БД.ЗакрьгтьФайл)); 331
Работа с HTML-документами Ф Заполнение HTML-анкет Необходимо заполнить анкету, реализованную как HTML-документ и расположенную на веб-сервере. Будем считать, что необходимо внести данные о фамилии, имени, отчестве физического лица. Фрагмент HTML-кода анкеты выглядит следующим образом: <ftxm »aine=’frm' actio<i=”anketa.asp"> ciablo <1г><и1>Фамил|1)«ЛДх|Л><1пр11( type«iext nan>e='fam'x/nJxAr> <trxtd>MM»</td><utxinpw type=4ext naine= num'xAdxAr» <trxtd>OT4ccTB<xftdxKixinput lypc=<cx< name='Mch'xAd></tr> </tablc> Сама анкета в «незаполненном» состоянии будет иметь следующий вид: 332
Рабогас HTML-документами В примере используется функциональность элемента управления ПолеНТМЦЦокумента (его имя в примере «ПолеНТМЬ»), расположенного в форме обработки. Также в форме обработки расположено поле ввода «URL», в котором указывается адрес анкеты. Для перехода к необходимой интернет-странице в обработчике события При изменении поля ввода «URL» используется строка кода: I 1ропсдура URLI !рн Изменении! Элемент) Э.к-мснпиФирмы.ПолсНГМЕ 11ерейти(URL Конец Процедуры Для записи данных следующий код (в данном случае) желательно размещать в обработчике события Документ сформирован поля HTML-документа. I 1 pout дура По.1еНТМЕДокумен1<'фор.миро1Ш1 if Элемент) // Событне возникает н при открытии формы, когда в реквизите // URL содержится пустая строка. Если URL о Тот да Док = ЭлементыФормы.ПолеИТМЕ.Документ. П При попытке обратиться к несушеетвующем\ свойству // пройдой лет ошибка Док. forms! "fan"), fam. Value = "Иванов"; Док. forms! "fnn"].nam Value "Иван"; Док.forms("fnn"].u(ch. Value "Иванович”; КоиецЕсли; КонецПроцелуры 333
Интеграция В результате, после отображения анкеты в форме, ее поля сразу же будут заполнены указанными значениями: 334
Работасфайлами ф Какорганизовать диалог выбора текстового файла? В ряде случаев (особенно при решении задач, связанных с обменом информации) возникает необходимость указания пути к файлу, выбора каталога (фактически то же указание пути к каталога). Указание пути к файлу: Режим = РсжимДиалогаВыбораФайла.Огкры т ие; ДиалогОткрытияФайла = Новый ДиалогВьгбсраФаЙла(Режим): Диалог ОткрытняФаи.1а.ПолносНмяФаи_|а = **; Фильтр = ’ Тексте ДиалогОткрытияФайла-Фильтр = Фильтр; ДиалогОткрытияФайлаМножествениый Выбор в Ложь; ДиалогОгкры 1ияФай.1а За!олоиок • "Выбери! с файл*; Если ДиалогОткрытияФайла. ВыбратьО Тогда ПугьКФанлу * Диалог ОткрьпияФанла.ПолносИмяФайла; КонецЕсли Выбор каталога: Режим - РежимДиалогаВыбораФайла.ВыборКаталога; ДиалогОткрытия - Новый Диалог ВыбораФайла( Режим); ДналогОткрытия. Каталог = Диало|Откры1 ия.МножественныйВыбор я Ложь Если ДналогОткрьгтия.ВыбратЦ) Тоста 335
Интеграция СС Как прочитать информацию о файле? При помощи ниже приведенного кода можно дать возможность пользователю выбрать любой файл и сообщить его параметры: ДиалогОткрытияФайла = Новый Диа.югВыбораФайла(Реж11мДна.юг<зВыбораФайла.ОгкрЫ1Нг): ДиалогОткрыт ияФаЙла. Выбра п.(); Файл Новый Файл(ДиалогОткрытияФайла.11олноеИмяФайлаН Текст « "Файл: " + Файл.Имя; Текст Текст * Символы.ПС 4 "Расширение: " + Файл.Расширение: Текст = Текст + Символы.ПС + "Полное имя: * ♦ Файл. Поли оеИмя; Текст = Текст 4- Символы.ПС 4 "Путь: " ♦ Файл. Путь; Текст = Текст + Символы.ПС + "Размер: * Файл.РазмерО 4 * байт": Текст = Текст 4- ?(Фай;1.ПогучитьНевнлнмсктъ(). Символы.ПС + "Невидимый. ", ""г Текст а Текст 4* ?(Файл.Получ1пьТолькоЧтениеО. Символы.ПС + "Только чтение.", *"); Текст = Текст 4- С имволы ! IC 4- "Последнее изменение ♦ Фай.1.Получни»Врсмя11зменеиия<); Сообщи гМ Текст): Создаем конструктором диалог выбора файла для открытия. Даем возможность пользователю выбрать в нем файл. Далее конструктором создаем файл, для чего считываем полное имя файла из диалога открытия файла. Далее на строковую переменную собираем все характеристики и сообщаем их пользователю. ф Как получить список файлов в указанном каталоге? Например, требуется получить список xml-файлов, находящихся в указанном каталоге. Эго можно выполнить следующим образом: Масси в Найденных = НайтиФайлы("С:\Обмсн\Вхоля1!1нс", "•.хтГ): Для каждого Файл из МассивНайденных Цикл Сообщник Файл. И мя); // Обработать найденные файлы. Конец! (нкла; 336
Работа с файлами Методу НаЙТИФаЙЛЫО передается в качестве параметров путь и маска поиска. В результате получим коллекцию найденных файлов. Замечание: если файлы находятся на ftp-сервере, необходимо указывать прямые слеши а не обратные '\' в параметре «Путь». Как переместить файл, выложенный на ftp к себе на локальный компьютер? Если Най1иФаГ1.1Ы(’С \TempVSkkidмпГ’) о llrwipe.ie.ieHO Тогда Уда.1И1ьФай.1Ы("СЛТетр\ Sklad мп1 "); Конен Если; Если НайгнФайлыСТф*.//!11.222.333.4/Sklad.xmT) о Неопредслено Тогда 11срсмсститьФайл("Г1р://111.222.333.4/Skhd.xml '. ’C:\Temp\ Sklad л ml"). Сообщить^ "Файл перемещен."); Иначе С\мм)щитъ<"Действие нс выполнено Файл в источнике нс найден."); Коней Если; Сначала убеждаемся, что в папке-получателе такого файла не существует. Если существует - удаляем. Далее убеждаемся, что нужный файл есть в папке-источнике. Если есть - перемещаем. Обратите внимание на написание слешей при работе с йр-сервером. Как разделить большой файл на несколько файлов определенного размера? При передаче файлов большого размера может возникнуть необходимость в «разделении» файла на более мелкие «части» (если есть ограничения на размер писем электронной почты или если, например, необходимо передать файл на дискетах). В этом случае можно воспользоваться методами глобального контекста РазделИТьФаЙЛ() и ОбъединитьФайл ы (). Метод РазделитьФаЙл() позволяет разделить указанный файл (в данном случае «MyFile.exe») на несколько файлов указанного размера (в примере - 1 Мб), и поместить их в указанный каталог: РапслитьФаПлГО./1/MyFik.xmr, ><►24*1024. '1)71/11Г); 337
Интеграция Метод ОбъединитьФаЙЛЫ() позволяет «собрать» файл из нескольких частей, указывая маску, по которой должны выбираться файлы, и имя результирующего файла: __________________________________________________________ Как поместить файлы в архив? Для того чтобы создать архив файлов, расположенных в некотором каталоге, можно использовать объект Запись71РФаЙла: ФайлАрхива = Новый lanitci.Zip<I>aii.ia("CAArch.zjp",,, МегоаСжап1я21Р.Сжагис, УровеньСжатмяХТР Максимальный); Фа ил Архива. Добавить; "C:\lnetpub\wuwrootXAppiic1\*. •*, РежимСо.храненияПуге(ШР.Сохраня гьОтноситсльныеПу ги. РежимОбрабсггкнПолкаггалогоаЯР.ОбрабатымтьРекурсимо); ФайлАрчнва.ЗаписатЦ); Для извлечения файлов из ZIP-архива, следует использовать объект Чтение21РФайла: ФайлАрхиаа = Новый 4TcxiieZIP<baina("C\Arch/ip"); ФайлАрхива.ИтвлсчьВсс) "C:\Opcn", Режим ВосстаноалеииаПугсйФай ФхС! Архива. Закрыть!);_______________________________ iobZI Р. Восс т анаа.1 и на гь); Как сравнить два текстовых файла? ДиалогОткрытияФайла = Новый ДиалогВыС>ораФаГтлл(РсжимДиалогаВыгюраФайла.(>Пфыт11с): ДнхтогОткртлияФапла Фильтр = "Текстовый локументС.1хО|*.(х1'*; // Выбрать первый файд. Диалоге УткрьпияФайл а Заголовок « "Выберите первый файи ДмалогОткры гияФаГ1ла.Выбрэп»(); ИмяФай.1з1 «= ДиалогОткрытияФайла ПспмоеИмяФайла; // Выбрать второй файл. ДиалотОткрыгияФайла.Загаювок = "Выберите второй файл:"; ДиалогОткры г ияФийта.ВыбрагЦ); 338
Работа с файлами ИмяФнйла2 = ДналшОгкрытияФак1а.11алносИмяФайла; И Сравнить выбранные файлы СршшеннеФайлов = Новый СрмненмсФийловО: СравнсннеФайло*.ПервыйФаЙл = ИмяФаЙлаГ. СравнсннеФайлов.ВторойФайл я ИмяФайлаЗ; СрввнсннсФанлов. Игнорировать! 1устое11ространство = Истина. С рав1КНиеФан.юв.Способеравнения - Способе*равненихФамлов . Т eicci овыЙДоку Meirr: СравнениеФайлс'в.ПоказатъРагтичняО: Для того, что бы пользователь мог выбрать файлы для сравнения - создаем конструктором диалог выбора файла. Устанавливаем соответствующий фильтр (txt-файлы) и режим диалога. Даем пользователю выбрать первый файл, потом второй. Далее создаем конструктором объект СравнениеФайлов. Назначаем имена первого и второго файлов (сравниваемых). Указываем значения свойств, что нужно игнорировать при сравнении пустое пространство и что способ сравнения будет ТекстовыйДокумент (значение устанавливается из системного перечисления СпособСравненияФаЙЛОВ). Далее посредством метода ПоказатьРазличия() демонстрируем различия в тексте файлов: Замечание: кроме текста можно сравнивать файлы как таблицы или побайтно. Для этого нужно установить лишь соответствующее значение свойства СпособСравнения. 339
Интеграция Как организовать контроль формирования файла внешним приложением? Реализуем механизм, который позволит отследить факт появления в определенном каталоге файла с необходимым расширением. Процедура ПровсркаНалнчи*Файла( I ИмяКтлога = "c:\temp"; Маска = **.хтГ; НайдсннысФайлы = НантиФай.1ы( Имя Каталога, Маска); Для КажлоюФайл Из НайдсннысФайды Цикл Сообщить^ Файл. И мя); КонецЦикла; КонецПроиедуры Следующую строку можно разместить в обработчике события При открытии, в теле модуля, либо в других процедурах (зависит от специфики реализации механизма в целом). Подкл10читьОбрябо1чикОжи.'1ания<'11роверкаНа,1ичияФай ia". 10); 340
ActiveX (D Как использовать элементы управления ActiveX? В качестве примера, на котором продемонстрируем возможность использования в диалоге формы элементов управления ActiveX, рассмотрим возможность использования Microsoft Media Player (для прослушивания музыкальных файлов, воспроизведения видео файлов). Для вставки в диалог формы соответствующего элемента управления необходимо воспользоваться пунктом главного меню «Форма | Вставить ActiveX..». В открывшемся диалоге выбора отметим нужный нам объект (как показано на рисунке): 341
Интеграция Определим имя элемента управления: «WMP». Кроме этого разместим в диалоге кнопку, при нажатии на которую будет вызываться обработчик события, содержащий ниже приведенный текст: Режим - РежимДиалотаВыбораФайла.Открытие; ДиалогФыбораФайла = Новый ДиалогВыбораФайла!. Режим): ДиалогФыбораФайла.Филыр = "Все файлы (всс)|*.*“; ДиалогФыбораФайла.Заголовок — "Выберите медиа файл"; Если ДиалогФыбораФайла-ВыбратъО Тогда ПутьКМедиаФайлу Диалог ФыбораФайла ПолноеНмяФтйла; И В зависимости от варианта объекта запись полного пути к файлу // ироитводигся либо в свойство FileNamc, либо в свойство URL. Попытка Э.тсментыФормы WMP,Filename = ПутьКМедиаФайлу: Исключение ЭлемешыФормы WMP.URL = ПутьКМедиаФайлу: КонеиПопытки; КонецЕслн; В указанной процедуре большинство строк кода работают с объектом ДиалогВыбораФаЙЛЭ, позволяющим организовывать удобный диалог выбора файла. Запуск выбранного файла производится с кнопки «Воспроизведение/Play» элемента управления WMP. 342
Макеты ActiveDocument Как сформировать новый договор на основании файла Microsoft Word? Для заключения договоров с контрагентами разработан типовой договор («пустышка»). При его оформлении (для реального контрагента) в определенные места документа вставляются данные о контрагенте. Подобные фрагменты определены следующим образом «<ИмяОбласти>» (на практике можно использовать другие способы). Фрагмент такого договора приведен на ниже следующем рисунке: (ДОГОВОР №-^Ном₽рДоговора л I •Мест"—’-—-• -• -♦ -♦ ——— <Наз₽ЯННеКс»мпании>,* кмасуемоет дтлгйшас- "ЗАКАЗЧИК-,- »• я <ГсдералыдыЯДир , • • действующа с • на* основании’ У става, • с • едкой- ст Оформленный таким образом документ сохранен в файле, который загружен в качестве макета (при его создании указывается, что тип макета - «Active document»). Констрчжтор макет о X Им* Догоаор Смсяаеи Дргсаор Кжхнтар»*» Выберите w мелете Т в»стдекуиен* 1 Дво*ев*е а»тм • Actve doconcri HTML лг» уим«т Фвм-а || 3 4 3
Интеграция Далее в соответствующем обработчике события (например, в обработчике нажатия на кнопку «Создать договор») размещается следующий текст: Договор = ПолучитьМакетСДопнюр"); И Получить объект из макета. MSWonJ - Дог овор.Получнгь)); ИаимсновзнисКонтрагента = "ООО Торгуем всем"; Попытка Документ = MSWord.Applicaiion.DocumentM I); Документ .Activate!): И Получить объект. который будем использовать для поиска и замены. Замена = Документ.Content.HikI; И Заменить заранее определенные ключевые конструкции на требуемый текст. Замена.ЕхссиТе("<НазваннеКомпаннн>", Ложь. Истина. Ложь... Истина.. Ложь. НаимснованисКонтрагснта); И Далее аналогично для остальных к-почевых конструкций. И Делаем видимым приложение и активизируем его. MSWord Application.VixiWe = Истина, MSWord. Activate*); Исключение И Если произойдет ошибка выводятся данные об ошибке и объект закрывается. СообшнтьСОиисаииеОшибкиО): М S W ord. Appl nation .QuitO; КонепПопыткм: 344
Работа с Интернет Работа с электронной почтой Как организовать работу с электронной почтой через установленного почтового клиента? Поставим задачу: необходимо реализовать возможность отправки и приема электронной почты непосредственно из 1С: Предприятие 8.0. В данном случае прием и отправка писем проходит через установленного почтового клиента. Отправка сообщения: Почта = Новый Почта; Почта ПоTKflioMiiTbcat "login", "password"); Сообщ « Новый ПочтовоеСообщенне; Сообш. Текст = ’’Доброе время суток!!!!*; Сообщ.Тема = "Срочно в номер!!!"; Данные к Новый ДвоичнысДанные(мс;\а11ас11.1.\1"); Сообш Вложения Добайнты Дан и ые."аи*кЬ. i.\ i * ); ( 006111Лолу*I3TC.1 и.Добавить( "hl iпс 4* I с.гн”); Почга. ПослатЫ Сообщ, Ложь); Почта. Отключиться! ): Прием сообщения: Почта = Новый Почта; Почта.Подключиться! "login". "password” I; Выборка ж Почта.Выбрать! Истина, Ложь); Для Каждого Сообщение Из Выборка Цикл СообщитМ "Тема:" + СтрокаССообтение.ТемаО; Сообщить! * Текст:" + Строка(Сооб1 пенне. Текст)); Дтя Каждого Вложение Из Сообщение. Вложения Цикл Сообшитм,Строка! Вложение Наименование)); КоиецЦикла, КоиецЦикла; 345
Интеграция Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя? Данный вариант работы не требует установленного почтового клиента, обращение производится непосредственно на сам почтовый сервер. Отправка сообщения. Текст процедуры, отвечающий за формирование и отправку сообщения следующий: // Сформировать почтовый профиль. // При отправке нет необходимости указывать настройки, связанные с POP сервером ИНН = Новый ИитсрнстПочтовый Профиль; ИППАдрссСераервБМТР ® Константы. AjpecCepecpaSM'ГР. ПолучитМ); ИПП.ВрсмяОжилаиня = Константы ВремяОжилания.Пол>чнть(); ИНН.Пароль • Константы.Пароль.Получить! >; ИПП.Пароль$МТР ® Константы. ПарольЗМТР.Получить!); И ПП.Пользователь = Константы. Польэоватедь.ПолучитЦ); ИПП.ПользовзтельЯМТР = Константы! 1ользоватсль$МТР.Получить(); ИПП.ПортЗМТР • Константы. Порт SMTP. Получить!); // Создать сообщение. Сообщение = Новый ИнтернетПочтовосСообщение; Сообщение. 11олу ча гел и Добав и п4 “hl ine<01 с .пГ); ('ообщсние.Отправитсль.Алрес = ’’booktcstG»' yandcxyandex.ru"; Сообшение.Тема = "Срочно в номер’*; Сообщен не. Теисты Добавить!"Доброе время суток!"); Вложение = Новый ДвоичныеДанные^ПутъКФгтйлуВложгиня); Сообщенис.Вложения Добавит ЦВложсние."attach.txt"); if Подключиться и отправить. Почта ж Новый Ин гер нет Почта; Почта.Подключи I ься! Профиль); Почта. Пос тэты Сообщен не); 1!очта-( >т ключи тъся(); Данные, необходимые для установления подключения к почтовому серверу, находятся в константах конфигурации. Если предполагается, что каждый пользователь работает со своим почтовым ящиком, такой подход не подойдет. Подобные данные нужно будет хранить либо в регистре сведений, либо в справочнике «Пользователи» (его аналоге). 346
Работа с Интернет После создания почтового профиля производится создание почтового сообщения (в общем случае сообщений можно создать любое количество). После этого производится подключение к почтовому серверу и отправка сформированного сообщения. Прием сообщений. Необходимо создать обработку, которая получала бы письма напрямую с почтового сервера и записывала бы данные в документ «Письмо». В форме обработки определены два реквизита: • «Позиция» (тип ЧИСЛО). В диалоге формы обработки размещается элемент управления Индикатор, через свойство Данные связанный с данным реквизитом. При загрузке индикатор будет показывать ход процесса записи данных из полученных почтовых сообщений в документы. • «СостояниеПриема» (тип Строка). В реквизит будет записываться информация о текущем этапе работы обработки. В диалоге размещается элемент управления Надпись, связанный через свойство Данные с данным реквизитом. Кроме этого у обработки определен реквизит «ЗабиратьССервера», имеющий тип Булево. В диалоге формы размещен флажок, связанный через свойство Данные с данным реквизитом обработки. Предполагается, что письма будут удаляться с почтового сервера только в том случае если значение данного реквизита равно Истина. В модуле формы размещена процедура со следующим текстом: // Формирование почтовою профиля. // При получении нет необходимости указывать настройки, связанные с SMTP сервером СостояниеПриема » 'Подключение к серверу"; ИПП = Новый ИнтернстПочтовыЙПрофнль; ИПП.АдресСернераРОР) Константы.АдресСервераРОРЗ.Получить; т; ИПП ВремяОжидания = Константы.ВремяОжилания.ПолучитьО: ИПП.Пароль — Константы Пароль.Получитъ(): ИПЛ.Полыоаатель Константы. Пользователь. Получить)); ИПП.ПортРОРЗ = Констаиты.ПортРОРЗ.ПолучитьО; Соединение <= Новый ИнтернетПочта; Соединение. Подключит ься) ИПП): СостояниеПриема = 'Получение выборки писем'; Выборка = Соединение. ВыбрагтыЗабиратьССсрвера»; СостояниеПриема "Создание документов - писем";_________________________ 347
Интеграция Количествен Выборке - Выборка Количествам ); Индекс = I; Для Каждою Письмо Из Выборка Цикл ТекПспипия = Окр( Индекс* 1 ОО/КолпчссттюВ Выборке); Если 1ек11ознцня о Позиция Тогда Полиция = ТекПозииня: КоиецЕсли; Док Доку менты. 11»н.ьмо.Сотда1ъДокумст(); Док.Тема — Пись мо.Тема СтрПолучатсли = Для Каждого Адрес Из Письмо.Получатслн Цикл СтрПолучатсли = СтрПолучатсли * Адрес.Адрес ♦ “«*; КонецЦикла; Док. Получатели = СтрПолучатсли. Бели ТипЗнч< Письмо .Отправитель) = 1 ип<’Строка") То< да Отправитель = Письмо. Отправит ель: Иначе Отправитель - Письмо.Отправитель.Адрес; КоиецЕсли; Док.Отправитель = Отправитель; Содержание * Для Каждого ТекстСооби1сния Из Пнсьмо.Тексты Цикл Содержание « Содержание 4- ТекстСоибщения.Тексг < Символы. ПС КонецЦикла; Док.Содержание » Содержание; Индекс = HitiiCKc + I; Док.ЗанисагьС г. Конец! (икла; Соединение-Отключиться! >; Данные, необходимые для установления подключения к почтовому серверу, находятся в константах конфигурации. Если предполагается, что каждый пользователь работает со своим почтовым ящиком, такой подход не подойдет. Подобные данные нужно будет хранить либо в регистре сведений, либо в справочнике «Пользователи» (его аналоге). После создания почтового профиля производится подключение к почтовому серверу. Далее производится выборка сообщений. В цикле каждое 348
Работа с Интернет почтовое сообщение из выборки разбирается и одновременно идет запись в созданный в цикле экземпляр документа «Письмо». Если в письме встречается несколько текстов, то в документе они разделяются символом перевода строки. Работа с файлами Загрузка файлов по FTP Создадим обработку, которая позволит просматривать файлы в каталоге по указанному FTP-адресу. Имя FTP-сервера будет записываться в реквизит «FTPServer», файлы будут отображаться в поле списка (с отмеченным свойством «Отображать пометку»). В модуле для кнопок командной панели необходимо определить обработчики событий: Процедура 3aipyiirrbOi меченныйКнопка) Сервер = Новый КТРСоедннений FTPServer); Для Каждого Файл И1 ПолеСниска Цикл Если Файл.Помета Тогда С ере ер. Получить! Фай. i .Значение ПолносИ мя. "c:\rcmp" -г Файл.Значение ПолноеИмя); Файл.Пометка — Ложь; КонецЕслн; КоиецЦикла; КонецПроцелуры 349
Интеграция Процедура 11росмитрет1>( Кнопка) Сервер = Новый f'TPCocj»HCHiie<F'rPServcr); МассивФайлов Сервер.НайтнФайлыС/'."* *"): Для Каждого Файл Из Масс и и Файлов Цикл Если Файл.'ЪоФайлО Тогда ПолеСпнекя.Добави гы Файл. Файл.И мя) КопейЕсли: Коней! [и «ла; Конец! 1роцедуры Выполнение HTTP запроса В ряде случае существует необходимость получения каких-либо данных из Интернета. Необходимые данные могут размещаться на страницах html, или они могут формироваться при обращении к исполняемым (с точки зрения WEB-сервера) файлам. Для получения таких данных можно использовать HTTP запрос. СервсрИсточннк = HTTPsvrver; Адрес = "/price.asp"; ИмяВходящсгоФанла = "c:\tcmp\inptiLhtm!"; HTTP Новый НТТРСослмнеине(С’ервсрИсл очник); HTTP. Пол у чить( Адрес, ИмяВхоляше! иФайла); ВходяшийФэйл = Новый ФайлШмяВхоляшсгоФаЙла); В переменной «HTTPserver» указывается путь к каталогу ресурса. 350
Работа с СОМ-объектами © Как из одной базы 1 С:Предприятие 8.0 перенести остатки товаров в другую базу, используя СОМ-соединение. Требуется перенести остатки товаров из рабочей базы в новую. Принято решение для этой цели использовать СОМ. Для этой цели создана обработка, у которой определен реквизит «ДатаПереноса» (на какую дату необходимо смотреть остатки). Считается, что база, в которую переносятся данные, функционирует в файловом режиме (в противном случае по другому оформляется строка подключения к базе). Путь к базе находится в переменной «Путь». В переносимой базе существует пользователь с именем «Usrl» со сброшенным паролем. Текст соответствующей процедуры: Запрос ж Новый ’Запрос; Залрос.Тскст* “ ВЫ БРАТЬ | ОстаткмТомровОрганюацийОстатки.Орг анизацми КАК Органи шипя, | (Зетапси I онаровС )рганизации( Хгтатки. Нименклатура, I Остатки ТошровОр1ВМИзацийОстатки.Г1 ДОрганизаднн, | Оста ткнТовлровОрганизаднйОс татки. СтраиаПро1К'хожде11ия. | ОстаткиТовар<1вОрганизацийОс1а1КИ. Комиссионер. | Остатки ГоваровОрганизацийОстатки.КалпчествоОстаток |ИЗ | Pci нстрНакопления.ОстаткиТоваровОр! нн1тшциЙ.(Хг1аткм( & Дата Переноса, ) КАК Остатки ТонаровОр! анизапийОстатки (ИТОГИ НО | Организация"; Запрос. Установить! 1а рамс ip( "Дата Переноса”, Дат а! 1срсноса); V8 = Новый СОМОбъскт(‘’У8.(?отпСоппсс(ог”к Попытка Открытие = V8.Connoct("File="’" Путь 4- ’"";Usr»"*’U»rl Исключение Предупреждений "База данных нс открыта!’!4): Возврат, КонецПопытки; 351
Интеграция Выборка = Запрос .Выполнили) Выбрагь(ОбчодРе тульЮТ а За ириса. ПоГруппироекам); МснсджсрДокумснта = ( Икрытис.Документы .ОприходованиеТоваров; МенсджерНоменклатуры » Открылие.Справочники.11омен кла лура; МснеджерО|»«низаний = Открытие.Справочники Организации; И Менеджеры остальных справочников: Пока Выборка.Следующий!) Цикл Докумет = МенеджерДокумсига.СоадатьДокумеигО; Код = Выборка.Органнзания.Кол; Организация = Менеджере )рга низацнй. Найти 11оКоду( Код): Если Организация Пустая() Тогда Opi«низания = МенеджсрОр!«ни ыпийСозда 1ьЭлемент(); Организация. Кол = Кол; //Поильные реквизиты Оргаяяпацмя.ЭапжапЦ > КоиецЕсли; // Обработка остальных реквизитов, справочников: Выборка! 1одчиненная = Выборка. Выбрали); Пока ВыборкаПодчиненная.Следующий! i Цикл // Поиск/неренос данных справочников // заполнение табличной части документа Конец! 1икла: Доку мент.Записать! РсжнмЗаписиДокумен га. Проведение); Конец! (и кл а; Следует отметить, что в реальной ситуации при переходе на другую базу понадобиться переносить данные и из других объектов системы (состояние взаиморасчетов и т.п.). 352
Работа с СОМ-объектами Пример обращения кпрограмме 1С:Предприятие 8.0 из модуля MS Excel через СОМ-соединение Например, в файле Excel хранится список контрагентов, который нужно загрузить в ЮПредприятие: Для решения этой задачи в таблице Excel можно создать макрос (Сервис | Макрос | Макросы...), который будет запускать требуемую информационную базу 1 С: Предприятия в режиме СОМ-соединения и переносить в нее данные: Suh load)) Dim cntr As Object Dim trade As Object Dim Элемент As Object Dim СправочникКонтрагснтоа As Object Dim ГруппаКонтрагентов As Object Set cntr - CreateObject("V8.COMConnector") Set trade - cntr ConnectCFilc="'C:\DcmoTrd4’";Usr=”<t>eaopoB (администратор)";") I___________________________________________________________________________________ 353
Интеграция Set Справочник Контрагентов = trade.Справочники.Контрагенты Sei ГрушшКонтрагенгов С правом никКот роге 1Гтов.СотдатьГруппуО Труп па Контрагентов. Наименован нс = Экспорт из Excel **•**• Гру ппа Контрагентов .Записать N»ll Количество строк в списке поставщиков For Count в 3 То N Set Элемент = СправочникКоитрагентов.СоздатьЭлементО Элемент.Код и Applkadon.CelM Count. 1).Value Элемент. Наименование = Application,Cells(Count, 2).Value Элемент.!! НН = Application.Ccll$(Coui*t, 3).Value Элсмент.НаименованиеПолное « Application. CelhtfCount, 4). Vai не Элемент.Роди гель = ГруппаКинграгентов.Ссылка Элемент.Запнсать Next Count End Sub Этот пример представлен на языке MS Visual Basic. Сначала выполняется создание и запуск приложения 1С: Предприятие, в справочнике «Контрагенты» создается новая группа ****** Экспорт из Excel ******* в которую будут помещаться создаваемые элементы. Далее, в цикле обхода таблицы Excel для каждой строки создается новый элемент справочника «Контрагенты», заполняются его свойства и элемент справочника записывается. 354
Работа с СОМ-объектами ф Как организовать считывание данных из файлов *.xls? Рассмотрим простой фрагмент кода позволяющий работать с книгой, состоящей из количества страниц, определенных в переменной «КоличествоСтраниц». Данные в странице расположены следующим образом: ООО «Торгуем всем» Ботинки муж. 10 Ботинки жен. 200 На каждой странице в первой строке, первой колонке расположено наименование контрагента. Со второй строки идет «табличная часть»: во второй колонке наименование товара, в третьей колонке его цена. Док ПолучигъСОМОбъект! Путь * ' цены к он ку рентой.xls’); Количество! 'границ = 2; Ды ТекНомер 1 По КоличествоСтраниц Цикл Контрагент = Док.5Ьесх$(ТскНомер).Се11*(1,1)Лга1ис; Товар = Док. Sheeis!TeKHoMep).Cel!s(2,2). Value; Цена • Док .Sheets! Тек Номер). Cells(2,3). Value; счСтроки = 3; Сои6шить(С1рока(Товар) ♦ 4 Строка!Цена)); Пока СокрЛП(Товар) о Цикл // можно использовать другой признак // окончания данных на листе Товар = Док. 5Ъееся(ТскНомер)-Сс1к(СчСтроки,2). Value; Цена = Док.8Ьее1з(ТекНомер).Се1ЫСчСгроки,3).¥а1ие; Сообшить(Строка(Товар) * ♦ Строка!Цена)); счСтроки = счСтроки ♦ I; КонецЦикла; КонецЦикла; Док. Application. QuiU. К Выполнение последней строки обязательно для корректной работы с любыми приложениями Microsoft Office. 355
Интеграция Как запустить макрос, записанный в книге Microsoft Excel? В ряде случаев может потребоваться (после выгрузки данных в существовавшую книгу Microsoft Excel) запустить определенный в этой книге макрос. Следующий текст иллюстрирует такую возможность Попытка // Создать объект. Excel • Новый СОМОбъекг!’Excel Application"); Исключение Сообщить! "Не удалось инициализировать Excel’); Во t врат; Коней! 1опытки; Попытка // В реальном примере путь может быть совершенно другим. Excel. WorkbooksOpenCciViocxIs4); И Запустить макрос с именем «Оформление*. Excel Run!’Оформление’); Excel.Visible Истина; Исключение И Если произойдет ошибка выводятся данные об ошибке и объект закрывается Сообшить(( )писанисО!Пибки!)); Excel. Quito; КонеиПопыгки; 356
Работа с С ОМ-объектами Как создать документ программы Microsoft Excel по оформлению, приведенному в другом документе? Необходимо создать книгу Microsoft Excel с оформлением, пример которого приведен в заранее подготовленной книге. Пример оформления приведен на рисунке. На листе книги определена именованная область «Шапка», предполагается, что в ней будут находиться данные о контрагенте документа, и в ней же определена шапка табличной части. Шапка • Дг Контрагент Кроме этого определена именованная область «Строка». В ней будут находиться данные о строках табличной части документа. В колонке «Сумма» определена формула (умножение цены на количество) Оформленный таким образом документ сохранен в виде файла. В процедуре, которая будет производить выгрузку данных, размещены следующие строки кода: Попытки // Создать объект. Excel = Новый СОМОбъекП’Excel. Application*); Исключение СообщитЫ’Не удалось инициализировать Excel*); Возврат; КопецПолытки; Попытка 357
Интеграция И Если при отработке следующего фрагмента кода произойдет ошибка И объект" Excel Application’ будет закрыт. И Открыть книгу, содержащую шаблон оформления. Excel. Workbooks. Open)’ c:\doc.xls*); НомерКииги = Excel.Workbooks.Count; Книга > Excel.Workbooks.hemiHoMepKnHnt); Лист = Excel.ActivcSheet; И Создать новую кишу (в нее будем записывать данные). Excel. Application. Workbooks. Add! I); НомерКииги = Excel.Workbooks.Count; КнигаНовая - Excel.Workbooks.ltemlHostepKHHrH); ЛистНовый Exoel-ActiveSheet; // Установить ширину колонки в новой книге. ЛистНовый Columns(’B’).ColumnWidth = 40; И Копировать область из книги-шаблона в новую книгу Лист Range*'Шапка*I.CopylЛистНовый Rangel" А1 ;ЕЗ*) >; ЛистНовыЙ.Сс11я(1,1),Value = ’Наименование контрагента": И Считаем, что в пашем случае необходимо сформировать только // две строки табличной части Для НомерСтроки - I По 2 Цикл Лист .Range) "Строка") Сору(ЛнстНовын Rangel Л истНовын.Cells! 3 + НомерСтроки, 1), ЛистНовыЙ.Се1ЬКЗ ♦ НомерСтроки. 5 >»; И Записать значение в ячейку листа новой таблицы И в реальном примере данные будут браться из информационной базы ЛистНовый.Се||я(3 + НомерСтроки. I). Value = НомерСтроки; ЛистНовый.Се1ЫЗ ♦ НомерСтроки. 2). Value = ' Наименование номенклатурной позиции * + Строка(НомерСтроки); ЛистНовый.Cellsl.3 ♦ НомерСтроки. 3).Value = НомерСтроки; ЛистНовый.СеИмЗ + НомерСтроки, 4).Value = НомерСтроки; Лист11овый.Се11МЗ ♦ НомерСтроки. 5).Valuc = Номер!.'троки; КонецЦикла; Excel. Visible = Истина; Исключение Сообтцить(ОписаниеОшнбкиО); Excel.Quitl); КоненПопытки: 358
Работа с СОМ-обьекгами Созданная таким образом книга, после наполнения ее данными делается видимой для пользователя (после чего она может быть им сохранена). Ф Как выгрузить прайс-лист в документ программы Microsoft Word? Необходимо реализовать возможность выгрузки данных о стоимости номенклатурных позиций в документ программы «Microsoft Word». При этом желательно использовать хотя бы простейшие возможности по форматированию текста в документе. Для этой цели создадим обработку в обработчике нажатия на кнопку «Выполнить» которой разместим следующий текст: 11ОПЫТКЭ MS Word * Новый COM06bCKT(*Word. Application"); Исключение Сообщнть("Не удалось инициализировать Мicrosoft Word’); Возврат; Ко н епПоп ытк и; Запрос = Новый Запрос; // Получить данные для формируемого прайс-листа. Запрос. Текст = "ВЫБРАТЬ I ЦеныКомпанииСрезПослелннх.ЕлиницаИзмерення.Наименование I КАК ЕдиницаИзмерсния, I Цены КомпамииСрезПос леди их . Цена, I ЦеныКомпанниСрезПоследннх. Номенклатура. Наименование КАК Номенклатура. I 1 КАК Количество 1ИЗ I Рсгистр( 'ведений. Цены Ком панн и.Срсз!1оследних(&Дата. Тип Це и = ЛТииЦен) I КАК ЦеныКомпанниСреШоследних (УПОРЯДОЧИТЬ ПО I Номенклатура 1ИТОГИ Количествам Количество) ПО I ОБЩИЕ"; Зап рос. У становит ь П арамс тр<" Дата", Теку щая> |ата()); Запрос. У становитьПарв.метр<" Тмп Цен ’. ТниЦен); Результат Запрос.Выполнил/); Попытка 359
Интеграция // Создать новый документ MSWord.Documents Add(i; Документ = MSWord-ActivcDocumcntt); //Добавить новый пара1раф в стланный документ. Документ.Paragraphs. Add(); НомерПараграфа = Документ.Paragraphs.CountO; Параграф = Документ.Рага£гар1ь.11еп1(НомерПараграфа); И В созданный пара!раф вставить новый «диапазон» //и разместить в нем текст «Прайс-Лист». Г1а[>аграф.Кап8е.1пчеаАйсг('Прайс-Лист"): //Установитьстиль параграфа «Заголовок I» (он должен быть определен). llaparpa<|).Rangc.Stylc="3aro.TOBOK Г; Документ .Paragraphs. Add<). Номер Пара графа Досумент.РагавгарЬв.Соип1(); Параграф = ДокумситРага£гарЬс11ет(НомерПараграфа) 11араграф.Range.lnscrtAfter(’Сформирован на дату; * ♦ СгрокаГТекущаяДатаО)); riaparp^.Rangc.;Style = “Обычный"; ВыборкаКолнчества Результат .Выбрать(ОбхолРезультатаЗапроса.ПоГруппировкам); ВыборкаКолйчесгва.СледующийО; КоличесттюСтрок = Выборка Количества. Количество, 4oKyMeHT.Paragraptw.Addi); НомерПараграфа = Документ. Paragraphs.Count/); Параграф=Доку Mem-ParagraphsItemt НомерПараграфа); // Вставить таблицу с количеством строк равным количеству записей // в выборке результата запроса и с тремя колонками Документ.ТаЫея Add(Паратраф.Range. КоличествоС трок. 3); // Получить таблицу как объект в отдельную переменную // учитывая тот факт, что таблица у нас единственная Таблица - Документ.ТаЫеяЛспЦ.1); // Записать данные в ячейку таблицы строка №1. колонка №1 Таблица.СеШ 1.1)J<ange( LlnsertAftert ’Номенклатура’); // Установить цвет фона в ячейке Таблица.СеН/ 1,1 (.Shading BackgroundPatternColor = 16776960; Таблица.СеЩ 1,2).Range() InsertAfterCUeHa’): ТаблнцаСеИ/1,2). Shading BackgroundPattcmColor = 16776960; Таблнца.Сс11( Ui.Range/) InsertAflert"Ej.H3M.*); Таблица Cell/1.3).Shading.Backgro4ndPaneinCol« « 16776960; 360
Работа с СОМ-объектами НомерСтроки = I; Выборка - ВыборкаКолнчества.Выбраты); Пока Выборка С ле дующий О Цикл НомерСтроки = НомерСтроки + I; ТаблииаСс!l( 11омсрС троки, I).Rangel). Insert Afterf Выборка 11омснкллтура); ТабдишкСеШ 11омерС 1 роки.2). Rangel KlnscrtAlterl Строка! Выборка. Цена .1); Таблица .Celli НомерСтроки,?) Ranges >. Insert Aften Выборка. ЕлииицаИтмерения); КонецЦикла: MSWord.Visiblc = Истина; MSWwd.Activaiel): Исключение // Если ироиэойдег ошибка выводятся данные об ошибке и объект М1крыиас1ся. Сооб|цитъ(Описание(>111нбки()); MS Word. Application .QuiU); КоненПопытки; В первой конструкции «Попытка - Исключение» создаем объект, с помощью которого будем пытаться создавать новый документ. Вторая конструкция «Попытка - Исключение» описана на случай, что если при работе с документом произойдет ошибка, в этом случае созданный объект «WordApplication» будет закрыт. В противном случае созданный документ будет открыт в новом окне программы Microsoft Word. 361
Интеграция ® Как выполнить запрос к произвольной базе данных SQL? Данный пример иллюстрирует возможность получения данных из базы данных SQL данных, используя механизм «ADODB». стр1 Заключения - «Drivcr=[SQl. Server}:* сгрГЗдключения = сгрГЗдключения * ИмяСервера > сгрГЗдключения = стрПодключения +*Utde» + ПмяПольювагеля + «>. стр!Заключения = сгрГЗдключения ♦ «Pwd=* + Пароль >•<;*; стр! Заключения я сгрГЗдключения 4 «DataBase * ИмяБазы + «•;»», cipl Заключения = стр I Заключения 4 «Pwd-* 4 Пароль > *:*; Connection = Новый COMO6betn("ADODB.Connect ion"); Connection OpenServer = ст pl Заключения. RS = Новый СОМОбъекгС ADODB. Recordset*); // Запрос к базе на языке SQL запросов. RS Open("Select * from TradeUftit". Connection); Пока RS.EOFC) = ОI(нкл // Можно обращаться и обрабатывать значения полей шиборки. ИД = RS.FiekbilD"). Value: Код = RS.Fields "Code") Value; // Обработка других полей RS.MoveNcxtO КонеиЦикш: В начале процедуры создается строка подключения, в которой указывается имя сервера, имя базы, пользователя и пароль. Для подключения к базе используется объект «Connection». Запрос и получение данных производится через объект «RS». По окончании оба объекта закрываются. 362
Automation Client/Server (OLE) (D Как из одной базы 1С:Предприятие 8.0 интерактивно заполнить документ в другой базе, используя Automation Client/Server (OLE)? Необходимо реализовать механизм, позволяющий пользователям одной базы данных заполнять документы другой базы данных. V8 = Новый СОМОбъскп 'VN.Application"}; Попытка Открытие = V8.ConnccU'Hkr=”'" + Путь + "“";Usrw”“Usrl"";"); Исключение Предупреждение* "Бвза данных не открыта!!!"); Возврат; КонецПольггкн, МеиеджерДокумента = УвДокумекты-РеалнзашиТоввров: Документ = Мсне,1жсрДокумеита<'о1Дат1.ДокументО: ФормаДокумснта — Документ.По.тучитьФорму (); Фирм^Док) мента.От крыт». Модальной); В переменной «Путь» записан полный путь к открываемой по OLE базе данных. Открываемая база функционирует в файловом режиме. В ней определен пользователь «Usrl», у которого нет пароля на вход. В приведенном примере форма документа открывается модально, это останавливает процесс выполнения модуля до тех пор, пока пользователь не закончит работу с данной формой. Если необходимо открывать формы объектов не в модальном режиме (по OLE) необходимо позаботиться о времени жизни соответствующих переменных. 363
Интеграция Как из таблицы Excel загрузить список номенклатуры в 1С:Предприятиес возможностью редактирования? Например, в файле Excel хранится список номенклатуры, который нужно загрузить в 1 С: Предприятие, причем, поскольку в 1С:Предприятии уже имеются некоторые номенклатурные позиции, а в таблице Excel указаны не все реквизиты номенклатуры, существующие в справочнике номенклатуры 1С:Предприятия, требуется дополнительное ручное редактирование каждого вновь создаваемого элемента номенклатуры: 364
Automation Client/Server (OLE) Для решения этой задачи в таблице Excel можно создать макрос (Сервис | Макрос | Макросы...), который будет запускать требуемую информационную базу 1С:Предприятия, используя технологию Automation, переносить в нее данные и открывать формы созданных элементов справочника номенклатуры для редактирования вручную: Sub knd() Dini trxnie As Object Dim ( правочникНомснклатуры As Object Dun I руппаНоменклатуры As Object Dim Элемент As Object Dim Форма As Object Set trade = CreateObject<’’V8. Application") trade.Conncct (’*Hlc=""C:\DcmoTrd4,”’:t,sr^‘,'*0ejopoB t администратор)*”;”) Set С пpaвочннкНоменклатуры = trade .Справочники. Номенклатура Set I рунпаНоменклагуры = С||равочн11кНоменклзтуры.С(ИдагьГ pymiyO Г руппаНомснк-штуры.Наименование Экспорт из Excel ГруппаНоменк-ягпуры.Записать N = 4 Количество загружаемых элементов справочника Ни Count = 2 То 5 Set Элемент = Справочник! 1оменклагуры.СоздатьЭлемсн1() Элемент.Код = Application.Cclls(Count. I).Value Элемент.Артикул = Application.СеИчСош»!. 2).Value Эдеме! t г Наименование = Application.Cells! Count. 3). Value Элемент! 1анмснованис11олнос = Application.CellstCouni. 4). Vai нс Элемен [.Родитель = ГруппаНоменклатуры. Ссылка Set Форма = Элеменг.1 (олучиз ьФормуО Форма. ОгкрыгьМодалыю Next Count End Sub Этот пример представлен на языке MS Visual Basic. Сначала выполняется создание и запуск приложения ЮПредприятие, в справочнике «Номенклатура» создается новая группа ****** Экспорт из Excel ******>>, в которую будут помещаться создаваемые элементы. Далее, в цикле обхода таблицы Excel для каждой строки создается новый элемент справочника «Номенклатура», заполняются его свойства, и форма элемента открывается модально для того, чтобы пользователь мог внести дополнительные изменения, записать новый элемент справочника или отказаться от сохранения этого элемента. 365
Обмен данными ф Как организовать работу удаленных складов? В компании существует несколько территориально удаленных складов. Необходимо организовать работу всех подразделений компании в распределенной базе данных. При определении состава обмениваемых данных было принято решение о том, что на каждый склад необходимо выгружать только документы «Реализация товаров» (и все «сопутствующие» объекты). На каждый из складов необходимо выгружать только «свои» документы. При возникновении коллизий (одновременное изменение документа и на складе и в центральном офисе), принимаются изменения, произведенные в складской базе. Для реализации данного механизма используем возможность создания распределенных информационных баз. Для создания распределенной И Б можно воспользоваться объектом конфигурации ПланОбмена. Создадим план обмена «НаСклады». Определим у него реквизит «Склад» (тип СправочникСсылка.СкладыКомпании). С помощью данного реквизита будем «отмечать» принадлежность узла плана обмена к складу компании. 366
Обмен данным’ На закладке «Прочие» плана обмена, нажав на кнопку «Состав», включим регистрацию изменений для документа «Реализация товаров». Далее, используя контекстное меню, подберем все связанные объекты. Остается включить флаг «Распределенная база данных», расположенный на закладке «Основные» плана обмена. Теперь нужно определить ряд обработчиков событий в модуле плана обмена. Процедура ПриОгправкеДанныхПолчинснномуОлемептДаниых. ОгарикаЭлемента» Если ТипЗнч(ЭлсментДаи»ых) Тип(" Докумеп Юбъект. Реали миияТоваротГ) Тогда Если ЭлемеитДаииых Склад о Склад Тогда = ОгпрввкаЭлементаДанных Удалить: КоиецЕсли; КоиеиПрсшедуры_______________________________________________________ Событие При отправке данных подчиненному вызывается при отправке объекта данных (включении его в файл обмена) подчиненной базе. Если отправляемый объект является документом «Реализация товаров» проверяется совпадение реквизита документа «Склад» и одноименного реквизита плана обмена (документ предназначен именно для данного удаленного склада, представленного текущим планом обмена). Если значения реквизитов не совпадают, отправка документа не производится. 367
Интеграция Следующие обработчики событий предназначены для переопределения стандартного механизма разрешения коллизий. Необходимо реализовать механизм, когда при одновременном изменении на складе и в центральном офисе принимаются изменения, произведенные в складской информационной базе. 11роисдура 11ри11а1учени1|Да1111ых(>тПодч1шенно< d Элемент Данных, Получен не Элемента, Огпранк дНазад) Если Тип341ч(Элемс1пДан11Ь1Х) - ТипСДокументОбъе1ГТ.Рс& 1ичацняТоварон') Тогда Получен иеЭлсмсн та = ПолучснисЭлсмснт^Тянных. Принять; КонецЕслн; Конец! 1роцсдуры Данный обработчик гарантирует, что если из подчиненной базы (складской) приходит измененный документ «Реализация товаров», то эти изменения безоговорочно принимаются. I (роцедура Прн11а.тучснннДаннь1х(>тГ'л1ВН<)го(ЭлсмснтДанных, Получение Элемента. О (правка! 1азад) Если Тип Знч(Элсмс1П Данных > = Тип<"Документ!Хтъскт.Рса. (нтацияТЬяаров**i Тогда Если ПлиныОбмсн» . И тмснсннсЗарсгист|>ировано< Ссылка, Эл с мент Данных) Тогда ПолучснмсЭлеменга ПолучсннсЭлсмс1паДанных.Игнорировать; КонецЕслн КонецЕслн; Кинси Процедуры В вышеописанном обработчике события (он выполняется при приеме данных в подчиненной базе) перед приемом измененного документа «Реализация товаров» делается проверка на наличие зарегистрированного изменения в текущей базе. Если принимаемый документ также изменялся в текущей (складской) базе, то принимаемые изменения игнорируются. При обратной отправке в файл обмена будет включены изменения, зарегистрированные именно в складской базе. 368
Обмен данным! Остается в пользовательском режиме определить состав баз (складов), в которые будут выгружаться данные. Предопределенный узел соответствует «текущей» базе, добавляя узлы (с указанием склада) определяем состав распределенной базы данных. Следует отметить, что распределенная база не обязательно может иметь два уровня иерархии, их может быть намного больше. Но каждая из информационных баз, входящих в распределенную информационную базу, «знает» только свою главную базу и свои «подчиненные». Т.е. при большом количестве уровней в распределенной базе данных нет базы, в которой видна вся ее топология. После определения узлов можно используя контекстное меню создать начальный образ подчиненной базы и производить с ней обмен данными. Как при создании начального образа управлять тем, какие виды объектов перегружаются, а какие нет? В ряде случаев при использовании распределенной информационной базы, возникает необходимость создания начального образа подчиненной базы, но при этом нужно, чтобы в этот образ выгружались данные не по всем видам объектов, определенных в плане обмена. Для реализации подобной возможности можно предусмотреть следующий механизм: Определите у плана обмена реквизит «Не выгружать объекты» (тип Булево) и разместите его в форме узла. 369
Интеграция Поместите в модуль плана обмена следующий обработчик события: 11 р<»| iv д v pa 11 рнОтправксДан i1 ыхПодч и пенному! ЭлементДан ных, Огнравка Элемента) Если НсВыг ружатьОбъекты Тогда // Проверить «ненужные типы*, условие может содержать проверку // на несколько типов Если ТипЗичОлемснтДанных) = Тити «ДокумешОбъект.РсатизацияТоварив») Тогда ОгправкаЭлсменга - Отнравка'ЭлемсигаДинных.Удалить; КоиецЕсли; КоиецЕсли; КонецПроцедуры Перед формированием начального образа для узла необходимо в его форме отметить флаг «Не выгружать объекты» и записать данный объект. При формировании начального образа для каждого объекта, выгружаемого в периферийную базу, будет отрабатываться обработчик события При отправке данных подчиненному. При установленном флаге «Не выгружать объекты» все элементы данных указанных типов удаляются из отправки. 370
Обмен данными Как просмотреть объекты, для которых зарегистрированы изменения? Необходимо просмотреть перечень объектов помеченных в нужном плане обмена как измененные. Сделать это можно, используя следующий фрагмент кода: ЗаткьХМЬ Н<Л1ЫЙ ЗапнсьХМЕО: ЗзлисьХМЬ.УстэновитьСтроку!); Узел = 1 кшныОбмена.НаС клады.11айтн ПоКолу (' С1’>; ЗалСооб! пения = ПланыОбмена.СоздлзьЗаписьС^обшенняО; ЗапСообщення. I 1ичап>Запись(Зш1нсьХМк, Узел): Выборка = ПланыОбмсна ВыбразъНзмененияСУзел, ЗапСсюбшення.Номере>ообшсния • Пока Выборка.СлелующийС) Цикл Данные = Выборка.Получни.О; Сообщи гь( Дан н ые); КонецЦикла: ЗапСообшсння 11рсрватьЗапись( 1; Стр = ЗалнсьХМк.ЗакрьгпЛ); Так как одним из параметров метода НачатьЗапись() является значение типа ЗаписьХМЦ соответствующий объект приходится создавать. Для того, чтобы не «связываться» с файлом используем метод УстановитьСтроку(). Этим определяем, что результирующий XML- документ будет выводиться в строку при выполнении метода Закрыть(). В процедуре выполняем всю («почти») последовательность по записи сообщения, с той лишь разницей, что обход завершается вызовом метода ПрерватьЗапись() (в этом случае считается, что сообщение не сформировано). Этот момент важен, поскольку если вместо метода ПрерватьЗапись() будет выполнен метод ЗакончитьЗапись(), инфраструктура сообщений выполнит регистрацию очередного номера сообщения в базе данных и сформированное таким образом сообщение необходимо будет передавать узлу-получателю. 371
Интеграция Как организовать обмен данными между произвольными конфигурациями 1С:Предприятие 8.0? Требуется организовать возможность регулярной выгрузки документа «Реализация товаров» с загрузкой в базе-приемнике документа «Поступление товаров». Для простоты будем считать, что структура «связанных» справочников и других объектов полностью совпадает. В базах данных участников обмена используются «единые» справочники. Базу, из которой производится выгрузка «Реализации товаров», назовем «Оптовик». Базу, в которую производится загрузка «Поступления товаров», назовем «Розничная точка». При одновременном изменении выгруженного ранее документа Реализация товаров (возникновении коллизии), в обоих базах должны приниматься изменения, произведенные в базе розничной точки. При возникновении коллизий по другим видам объектов принимаются изменения сделанные в оптовой базе данных. В обеих конфигурациях создадим по плану обмена «Поставка». В оптовой базе у созданного плана обмена отметим регистрацию для документа «Реализация товаров» и подберем все связанные объекты. В розничной базе определим регистрацию изменений для документа «Поступление товаров» и также подберем все связанные. В плане обмена оптовой базы у предопределенного узла запишем код «Опт», и создадим узел с кодом «Marl». В розничной базе определим все наоборот. 372
Обмен данными Для выгрузки данных из оптовой конфигурации можно создать обработку. В модуле основной формы необходимо разместить следующий программный код: npoi ;едура Вытру акаОлемеит) Путь ~ "c:V; //реальный пуп. к каталогу', в котором создаются файлы ЗаписьХМЬ = Новый ЗапнсьХМ!.(); ЗанисьХМЕ.ОгкрыгьФайл(Пу|ъ + "вы|рузка..мп1"); Узел = ПланыОбмена.Поставка.НайтиПоКолуС'Маг!*); ЗацСообщения = ПланыОбмена-СоздатьЗапш'ьСообтснияО; ЗанС'ообщения.НачагьЗанисьГЗаписьХ.МЕ. Учел); Выборка = ПланыОбмена ВыбратьИзменения|Узсл, ЗапСообшсния.НомсрСообшсння); Пока Выборка.СледуюшийО Цикл Данные = Выборка. Получить)); Если ТипЗнчСДанные) = Тип! "ДокумснтОбъскт.РсализацияТоваров") Тогда Вы1рузкаРеалнтации(ЗагтисьХМЪ. Данные); Иначе И все остальные объекты ЗаписальХМЦЗаписьХML, Данные); КонецЕслн. КоиецЦикла. ЗаиСооб1иения.ЗакончнтьЗап1кы); ЗапнсьХМЕ.Закрыть)); КоиецПроцедуры 373
Интеграция Выгрузка осуществляется в узел с кодом «Marl» (правильнее говорить, что будем выгружать данные, отмеченные как измененные для данного узла). Далее по тексту процедуры: получаем выборку объектов, обходим ее. При обходе проверяем тип значения (считается, что все объекты, которые могут попасть в выгрузку, имеют одинаковую структуру) и если объект это документ «Реализация товаров», то для его выгрузки вызывается процедура «Выгрузка реализации». В противном случае используется метод ЗаписатъХМ1_0 (метод платформы, позволяющий выгружать «сложные» с точки зрения сериализации значения в XML-документ). Для выгрузки документа понадобилась отдельная процедура ввиду того, что загрузка будет вестись в документ «Поступление товаров». Процедура ВыгрузкаРса.1изацни(ЗапнсьХМЬ. Документ) ЗаинсьХМЬЗаиисать! 1ачалоЭлемен1 ai" DocuineniObject.l1ерсдачаТовара ); Заласа п»ХМ1.(ЗалисьХ ML, Доку мент. Ссылка. У пикал ьныйГ1дснтнфнкатор( >, "Ret*. ИазначениеТипаХМЕ.Явное); ЗалнсатъХМТдЗалнсьХМк, Документ. ПомсткаУлалсния, "DeletionMark. . НазнячениеТнпаХМк. Явное), За i 1 иса I ьХМL( 3ai imc i>X ML, Доку Mei 11. ВалютаДоку мента. 'ВалкугаДокумснта’’, ПазначенисТипаХМ! .Явное); // Остальные свойства документа. //Табличная часть ЗаписьХМк.ЗапнсатьНачалоЭлсмснтаСI 'овары*); Для Каждого ТекСтрока Из Документ.Товары Цикл ЗапнсьХМи.ЗаписатъНачалоЭлсментаСКот*’’); ЗалисатьХМиЗанисьХМЬ. ТекСгрока.Номспк urrypa, "Номенклатура". 11атначснисТипаХМи.Я ЗапнсатъХМССЗалисьХМЪ. ТекСтрока-Количество. ’’Количество*. Назначение! unaXML.Ян» с реквизиты табличной ча ЗанисьХМЕ.Запнса! ьКоненЭлементтЦ); КонецЦикла; ЗашкьХМЕ.Записи i 1>КонецЭлемента<): ЗаттмсьХМ1..3аписатьКонепЭлсмснта(); КонеиПроцед) 374
Обмен данными Процедура «ВыгрузкаРеализации» выгружает документ «Реализация товаров» по определенному в ней алгоритму. Следует отметить, что для упрощения примера выгружаются не все реквизиты, табличные части, реквизиты табличных частей, а только часть из них. Особенностью данной процедуры является выгрузка ссылки. Она выгружается не как «ДокументСсылка.РеализацияТоваров», а как «Уникальный идентификатор». Эго даст нам возможность при загрузке определить «такую же» ссылку у документа «Поступление товаров». Следующие процедуры содержаться в модуле формы обработки по загрузке данных в розничную конфигурацию. Процедура ЗагрузкаО.темент) Пу и» = ’с‘Л*; //реальный путь к каталогу, в котором создаются файлы ЧтсннсХМЕ = Новый ЧтснисХМЦ); ЧтсннсХМЕ.ОгкрыгьФайл<11утъ "выгрузка.xml*); ЧтСообшения > ПланыОбмена.СозджьЧхениеСообшеиняи; ЧтСообп ie и мя. НачатьЧ те н ие( 4iei । ие X М L), ПлэныОбмсна-УдалитьНсгистрашноИ змснениЙ( ЧтСооб|ЦСН!1Я.(>гпршштсль, ЧтСообшсния.1 к>мерСообшения); Пока ВозможнсхлъЧтенияДанныхтЧтгниеХМЕ) Цикл Данные = Пройти 1ан>Данные<Ч|ениеХМк1. Если РазрсшснисКохги1ий(Данные) Тогда Данные. О6ме;1Данными. (>i правитель я ЧтСообшения Отправитель; Данные.ОбменДанными.Загрузка » Истина; Данные. ЗаписятМ); КонсцЕслн; КонецЦикла; Ч1С оиоикн ня. Закончи 1ъЧтеннс(г. ЧтснисХМ1-.Закрыть(); Koilcul )р|-»нслуры 375
Интеграция Данная процедура запускает процесс загрузки данных из файла обмена. Перед чтением очередного узла XML-документа проверяется возможность чтения значения из данного узла (функция «ВозможностьЧтения Данных»). Для чтения используется функция «ПрочитатьДанные». Перед записью проверяется необходимость этой записи (поведение комплекса в случае возникновения коллизий). Функция Вснможнсм:гьЧтенняДан11Ых(Ч1С1!11сХМ1.) ТипХМЕ = ПолучнтьХМ1.Тип(ЧтениеХМЕ); Ест ThhXML « Неон редел ено Тогда Возврат Ложь: Конец Если; Если ThhXML ИмяТниа = "tXxurneniObject.Передача Товара И ТипХМЬА•К1Г1ространстваИмен = Тогда Возврат Истина; КонецЕслн: Возврат Возможное! ьЧ гения XML( ЧтениеХМЕ): КонсцФу нкцни Функция проверяет возможность чтения значения из XML- документа. Функция ПрочигатьДанные(ЧтсннсХМЕ) ThhXML « ПолучитьХМ! ТнгнЧтсннсХМЕг. Edit ThhXML.ИмяТипа = *DucurncniObjeei.ПередачаТовара" И ThhXML.LRII 1росгранстваИмсн = "и Тогда Во гвра т Ч1 с и не Реал изацнн( Ч ген кеХМL); КонецЕслн; Возврат ПрочиитьХМЕГЧгеннеХМЕ): В этой функции производиться проверка на тип считываемых данных, если это «Document Object. ПередачаТовара», то для чтения значения используется функция «ЧтениеРеализацииО», в противном 376
Обмен данным! случае (остальные значения) для чтения используется метод платформы ПрочитатьХМЦ). Функция ЧтснисРсализании! ЧтсниеХМЬ) ЧтеииеХМЬ.Прочитать! к // Работа со ссылкой документа. ПолученнаяСсылка = Про**итагьХМ1лЧтсниеХМЕг. Док = Дока менты.ПостутьтснисТоварон .Полу чнтьСсылку(1 1овын Уникальный! 1дснтифи кагор! 11олученная(’сылкаН; Документ = Док. Полу читьОбъскт!); Если Документ « Неонределсно Тогда Доку мент = Докумен i ы. ПоступлениеТоваров.СотдатьДоку мент! ); Документ Установи гьСсылку Hoboi о(Док): Документ .Дата = ТскущаяДата; Документ .Установить! 1овый! 1омср(); Конец Если: Доку мент. 11омет ка Удаления = 11рочи татьХМ! 4 ЧтсннеХМ!. К Документ. ВалютаДикумента = ПрочнпгтьХ.МЕ(ЧтеиисХМЕ): // Табличная часть Товары // Построчное чтение. ЧтениеХМЕ.Прочитать! h Документ .Товары .Очистить!); Пока ЧтеннеХМЕ.Имя = "Row" Цикл // Поти н ион мр у емся на угле с номенклатурой. ЧгениеХМЕ Прочи1агь(); НокаяС'трока = Документ. Товары .Добавить^): ПоваяСтрокз.Номенклатура - Прочи1агьХМиЧтеннсХМ1.); ПоваяСтрока.Количество - ПрочнгагьХМ1-(ЧгеииеХМ1.); // Читаем конец yxia Row. ЧтениеХМТ Прочи1В1ь(): КонецЦикла; // Читаем конец табличной части. ЧгенисХ ML Г!рочи ia гъ(); //Читаем конец документа. Ч тснисХМ1..Прочи ian»(); Во зяра п Документ I: КонсцФ\ НК11ИИ 377
Интеграция Данная функция записывает данные в документ «Поступление товаров». Особенностью данной процедуры является чтение значения уникального идентификатора и запись этого значения в качестве значения ссылки вновь созданного документа. Данный подход является наилучшим способом синхронизировать документ «Реализация товаров» оптовой базы и «Поступления товаров» розничной. Функция Разреи1еннеКоллнгий(Данные) Если ТилЗнчС Данные) = Тип(мДокумснтОбъскт.Поступлен1>еТошфов*) Tot да Если Не Данные.ЭтоНоиый<) Тогда Ссылка НаУзел = Планы()бмсна. Поставка. НантиПоКодуС "Опт*); Если ПлаиыОбмена .ИзмененнеЗарегисфиройансиСсылкаНаУлел. Данные) Тогда Возврат! Ложь): КонецЕслн; КонецЕслн; КонецЕслн, Возврат! Истина): КонецФумкции Данная функция позволяет записывать документ «Поступление товара» либо если он новый, или если он не изменялся в розничной базе данных. Следует отметить, что для решения поставленной задачи необходимо организовать обратный обмен (из розничной базы в оптовую). Сделать это можно по аналогии с приведенным примером. 378
Обмен данными Как принудительно зарегистрировать изменения объектов? Необходимо ряд объектов (либо все) принудительно поместить в таблицу регистрации изменений плана обмена. Для размещения всех объектов, у которых ведется регистрация изменений, но только для одного узла плана обмена можно использовать следующие строки: Ссылка! !аУэел ’ ПланыОбмена НаСклады1|айги11о1<оду('С1“); ПзаныОбмс'на.ЗарсгистрироватъИзмснснимСсылкаНаУ'гел, Нсопрелелсно); Считается что существует узел плана обмена «НаСклады» с кодом «С1». Если необходимо разместить объекты только определенного вида (например, все элементы справочника «Номенклатура») СсылкаНаУзсл = 11.ланы(_>6мс11и.НаСклады.11айлиНоКоду(’С1и); ПланыОбмена .ЗарепктриромтьИзменения(СсылкаЙаУэел, Метаданные С(|рано'1|1им«.Н.лменк.латура); Если необходимо разместить только один объект, например экземпляр документа «Реализация товаров» (следует помнить, что для объекта данного вида должна быть включена регистрация изменений в данном плане обмена). Ссылка! 1аУдел = ПланыОбмена. НаСклады. ПайгиПоКодуч 'С 1"); ДокСсы. чка = Докумекчы PcaaiuauiiaToi>apo« Ний1н11оНомер\(НомерДок. ДатаПериода): Если Не ДокСсылка.Пустаяч) Тогда ПланыОбмена.Зарет члсч рнролчатьИэмененняССсылкаНаУэел, ДокСсылка): КоненЕсли; Фактически все из приведенных примеров отличаются только значением второго параметра метода ЗарегистрироватьИзменения(). 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
Интеграция Как открыть список расходных накладных с отбором, установленным по определенному складу? В этом примере будем исходить из того, что отбор должен устанавливаться по складу, который назначен складом по умолчанию для текущего пользователя информационной базы. Предполагается, что в модуле внешнего соединения определена глобальная экспортная переменная «глТекущийПользователь», в которой хранится элемент справочника «Пользователи», соответствующий текущему пользователю, работающему с информационной базой. Кроме этого, в модуле внешнего соединения следует определить экспортную функцию, которая будет возвращать значение по умолчанию указанной настройки элемента справочника «Пользователи». Например: Функция ПолучигьЗначеииеПоУмолчаникчПольюватель. Свойство) Экспорт Отбор я Новый Структура; Отбор. Вставила"Пользователь", Пользователь); Отбор.Вставитм 'Настройка", ПланыВндонХарактеристик .11зсгроГисн! 1олыоватслсй Пай г и По11а>1менованик>1 < *войст во)). Результат - Pei истрыС ведений. НасгройкиПольтова! елей. Получить(Огбор); Возврат Результат.Значение; Конецфункиин 384
WEB-расширение Тогда в обработчике события Page Load страницы, являющейся списком расходных накладных, необходимо разместить следующий код: if (IIsPostBackt Title Text = LtMDalaSoutvc.Tabtefnfo.Presentatkm: И Добавляемым код. LislOataSource.Connei'tion.Openl t; try I ObjeetRef currt.'ser = (Object Ref I V8.Gctl I.istDataSource.Connection, l.istlJata.Source.Connection.Connection. "глТекушийПольмшггель”): ObjeetRef inainWH ж(OhjcctReriV8.Callil.islDutaSouree.Connection. I istlfataSnnrce.t onnection.t 'onnectinn. " Пол учигьЗначеннеПоУ молчанию", currl’ser. ’’ОсповпойС K.ia.i"); if (hnainWH.IsEmplyt I) V8Hlter filter ж I istl)ataSource.Filter(”C'K.iaj"|; filter.Chceked = true: filter.Condition = V8FilterConditlon.Equal; filter. VahieTypel = I.istDataSource. Metadata .Tvpcslnfoj V8.Ty peNameFromValuetrnainWHl]; filter.Vuluel = tiuiinWH: filter.Presentation I = mainWII.Presentation! I istDataSnnrce.Connection); I I firuilb ( I .ist OataSotirce.Connection.Close!); I 385
Интеграция При необходимости, следует добавить использование пространства имен lC.V8.Data: using System; using System Collections, using Systcm.ComponcntModel; using System Data. using System Drawing; using Systcm.Wcb; using System.Web.SessionState; using System.Web.l'l: using System.Wcb.Ul.WebControls; using System.Web.UI.HtmlContrvls; using _lC.V8,WchContro)s; using lC.V8.Dnta; Сначала открывается подключение к информационной базе (ListDataSource.Connection.Open()). Затем методом Get() объекта V8 выполняется получение значения свойства «глТекущийПользователь» COM-соединения. Само СОМ-соединение передается вторым параметром (ListDataSource.Connection.Connection), а имя нужного свойства - третьим ("глТекущийПользователь"). После этого методом Са11() объекта V8 выполняется вызов метода «ПолучитьЗначениеПоУ молчанию» COM-соединения. Само СОМ- соединение передается вторым параметром (ListDataSource.Connection.Connection), имя метода передается третьим параметром ("ПолучитьЗначениеПоУмолчанию"). За ним следует перечисление параметров вызываемого метода. В результате в переменную «mainWH» будет возвращено значение склада по умолчанию для текущего пользователя. После этого, если полученное значение не является пустой ссылкой, выполняется установка фильтра с именем «Склад» для объекта V8LJStDataSource: задается признак использования, условие сравнения, тип значения, само значение и представление значения фильтра. После выполнения перечисленных действий, подключение к информационной базе закрывается. 386
WEB-расширение В результате, при открытии списка расходных накладных, в списке будут отображены только те расходные накладные, значение свойства «Склад» которых совпадает со значением склада по умолчанию, установленным в настройках текущего пользователя: 387
Интеграция Как добавить кнопку для ввода документа на основании? Например, в командную панель списка приходных накладных требуется добавить кнопку, при нажатии на которую выполнялся бы ввод расходной накладной на основании приходной. Для этого в коллекцию кнопок командной панели нужно добавить новую кнопку и задать для нее следующие свойства: But ion Text - Ввод на основании; ComandTypc Custom; Seri pt Text V8Gri<l < m Input On 'grid', document, get Element Hyldt grid Selcetcdltetn').valiie. 'Документ. Приходная Накладная' ) где «grid» - это имя объекта V8Grid, с которым связана командная панель: В результате, при нажатии на кнопку будет вызван ввод новой расходной накладной на основании текущей приходной накладной, отработает процедура Обработка заполнения (если она определена в модуле объекта ДокументОбъект.РасходнаяНакладная) и форма новой расходной накладной будет открыта для редактирования. 388
Указатель 9 ?(), 56 [ ВыборкаИзРезультатаЗапроса, 95 ДокументыМенеджер, 174, 196 Массив, 33, 37, 39, 41 СерииДиаграммы, 288 Соответствие, 59 СтрокаТаблицыЗначений, 71,73, 187 Структура, 52 ТаблицаЗначений, 20 ТочкиДиаграммы, 287 А AddAuthenticationO - метод IV8ServerConnection, 320 С Checked - свойство V8Filter, 381 Connect!) - метод V8.Application, 363 V8.COMConnector, 351 Connect Server!) - метод V8.COMConnector, 320 CreatelnfoBaselnfo!) - метод IV8 ServerConnection, 320 D Disconnect' ) - метод rV8ServerConnection, 320 389
Указатель G GetIBConnectionsO - метод IV8ServerConnection, 320 1 ItemCommand - событие V8CommandPanel, 381 ItemDataBound - событие V8Grid, 382 N Name - свойство IlnfoBaselnfo, 320 P Pow(), 31 R RefreshO - метод V8Grid, 381 u иШПространстваИмен - свойство ТипДанныхХМЬ, 376 A АвтоМаксимальноеЗначение - свойство Диаграмма, 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 КоллекцияКолонокТаблицыЗначений, 7 3 Соответствие, 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 ЗаписыТ РФайла, 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 ECTbNULL Язык запросов, 96, 133, 157, 242, 246 ECTbNULL() Язык запросов, 231 3 Заголовок - свойство ДиалогВыбораФайла, 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 ЗаппсаТЬХМБО - метод 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 ИТОГИ КОЛИЧЕСТВОО Язык запросов, 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 4ТеННе7Нлапна, 338 ЧтениеТекста, 323 Л Лево - свойство 401
Указатель РисунокТабличногоДокумента, 280 ЛЕВОЕ СОЕДИНЕНИЕ Язык запросов, 157, 227, 233, 242, 247, 251 м Макет - свойство ПостроительОтчета, 262, 265, 272, 274 ПостроительОтчетаАнализаДанных, 254 МакетОформления - свойство ПостроительОтчета, Т16 СводнаяТаблица, 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 КоллекцияКолонокТ аблицыЗначений, 7 2 Массив, 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 ОформитьМакет() - метод ПостроительОтчета, Т16 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 РежимОбработкиПодкаталогоВ71Р, 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