Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранения данных дерева. И при открытии формы получать данные из ТЧ и выводить их в дерево. Далее все манипуляции производить с деревом и при сохранении документа помещать данные в обратно в ТЧ.
Поиск по интернету не дал нужного варианта, пришлось реализовавыть свой механизм, используя информацию которая была на просторах интернета.
Для реализации такого механизма в ТЧ был добавлен реквизит “КлючСвязи” (обязательный реквизит) с типом число, куда помещался “НомерСтроки” (стандартный реквизит ТЧ) родителя (верхний уровень). А самый верхний элемент дерева имеет “КлючСвязи” равный 0.
На картинке ниже видно структуру дерева и структуру ТЧ
Нагрузка на сервер осуществляется при окрытии и при сохранении документа. А с деревом работают уже на клиенте.
На рабочей базе обрабатывается около 200 строк в одном документе.
Открытие и сохранение документа происходит моментально. С большем количеством строк не тестировалось.
Чтобы алгорит правильно работал, у рекизита фомы с типом дерево значений должны быть все реквизиты табличной части, кроме “КлючСвязи” и “НомерСтроки”. Иначе платформа выдаст ошибку. В дерево можо добавлять свои реквизиты отличные от ТЧ, они будут использоваться только в дереве.
Ниже приведен код преобразования дерева в таблицу и обратно.
Медитируя на тему почему нет нормальной “Консоли запросов в управляемом приложении” захотелось покопаться в этих внутренностях 1С.
Как ставить и настраивать вэб-сервис в 1С, я не буду расказывать. Вы это легко найдете.
Идея такая: почему бы нам не создать вэб-сервис, который на строку запроса 1С выдаст web таблицу(с тэгами…). Заморачиваться с XTDO не советую, капризный он. Выдаем ответ сервера в виде строки. Данные в таблице для простоты тоже сделаем текстовыми (html).
Сделаем конфигурацию в которой один вэб-сервис (Прикреплен к статье). И распишем функцию подробно,чтобы ее можно было подключить к любой конфигурации вручную.
Все парамеры в функции строковые
Request1C – текст запроса
TableData – html строка ответа.
Возвращаем истина или ложь;
Публикуем web-сервис c именем testws. Для тестирования уберем из базы всех пользователей, включаем анонимную идентификацию и смотрим чтобы ресурс htp://localhost/testws/ws/testws?wsdl был доступен из браузера. Если показывает в браузере описание вэб-сервиса, значит все нормально.
Это все хорошо, но как все это показать? Сделаем страницу входа для обработки в вашем любимом Web-сервере. Или просто бросьте папку test1C в папку C:\inetpub\wwwroot для MS IIS(Internet Information Server)
Вы не разбираетесь в Web программировании – не беда. Главное усвоить основы. Мы посылаем специально подготовленный post запрос в Web-сервер, он передает его 1С и возращает ответ. И нам в браузере необходимо обработать ответ сервера.
Запрос:
Вырезаем из ответа сервера необходимое и преобразуем назад спец символы < и > на < и >.
Спасибо авторам библиотек jquery.com и tablesorter.com и их лицензиям(GPL, MIT) за их открытость. С помощью jquery не надо писать разный код под разные браузеры(они к сожалению различаются). А tablesorter используем для просоты вывода…
Заходим в браузер http://localhost/test1C и пишем запрос… Правильно написать запрос у меня не получается, я всегда копирую его из консоли запросов.
Нажимаем кнопку. И приходит к нам счастье.
Дополнительно скажу, что для слишком больших результатов запросов данная схема может не работать. У меня где-то начинала не выводить или выводить неправильно к 10000-100000 записям. Скорее всего ответ сервера посто не залезает в один пакет soap. А если отключить сжатие пакетов я думаю будет еще хуже. Так, что будьте осторожны.
При запуске 1С:Предприятия 8.x на раб.станции сначала производится поиск ключа в локальных USB портах, затем ключ ищется в сети. После нахождения в сети менеджера лицензий, у него забирается одна лицензия, и программа запускается. Если свободных лицензий не осталось, то ищется другой менеджер лицензий в сети. Если он не обнаружен или на остальных менеджерах тоже нет свободных лицензий, то появляется сообщение, что ключ не обнаружен.
Если программа завершена аварийно, то лицензия менеджером лицензий не освобождается. Если выход нормальный, то лицензия освобождается. Если повторно запустить завершившуюся аварийно программу, то ей выделяется не новая лицензия, а та, которая была у нее ранее, и которая оставалась не освобожденной.
При запуске второго экземпляра программы новая лицензия не забирается. То есть лицензия выделяется не на экземпляр программы, а на рабочее место.
Но при выделении повторно зависшей лицензии есть одна особенность:
Если в сети несколько менеджеров лицензий, то программа при поиске ключа опрашивает их в определенной последовательности. И если, например, на первом лицензий нет, то второй выдаст ей лицензию. Если потом программа упала, лицензия не освободится. Программу запускают повторно. Но теперь на первом менеджере лицензий, предположим, появились свободные лицензии. Тогда программа не найдет свою неосвобожденную лицензию от второго менеджера, а обратится сначала к первому и получит новую лицензию от первого.
Таким образом, на втором менеджере останется зависшая лицензия, которая освободится через 36 часов. Можно избежать этого, если на компьютерах, на которых запускается 1С:Предприятие, настроить файлы NETHASP.INI таким образом, чтобы на одной части компьютеров 1С:Предприятие обращалось к одному менеджеру лицензий, а на другой части компьютеров - ко второму менеджеру лицензий.
Файл NETHASP.INI, если связь с менеджерами лицензий организуется по TCP/IP, должен иметь примерно такое содержимое [NH_COMMON]
NH_IPX = Disabled
NH_NETBIOS = Disabled
NH_TCPIP = Enabled
[NH_TCPIP]
NH_SERVER_ADDR = 10.1.170.65 ; нужно указать IP-адрес Вашего компьютера, на котором запущен Менеджер лицензий, с которым предполагается взаимодействовать
Также можно дополнить раздел [NH_TCPIP] строками, которые могут ускорить поиск ключа: NH_TCPIP_METHOD=UDP
NH_USE_BROADCAST=Disabled
Файл NetHASP.ini должен находиться в каталоге CONF каталога исполняемого файла 1С:Предприятия 8.x (BIN)
Пример этого файла устанавливается в папке BIN при установке платформы.
Как в 1C из Microsoft Office Word 2007 внести текст?
Код получения текста из файла word:
Рассмотрим приёмы получения статистической информации о документе, его составе и т.д.:
'получить общее количество символов в активном документе
' (буквы, цифры, пробелы, переход на новую строку и т.д)
WordApp.ActiveDocument.Characters.Count
'получить символ по его индексу
WordApp.ActiveDocument.Characters(14).Text
'изменить символ по его индексу
WordApp.ActiveDocument.Characters(14).Text="е" 'можно несколько "еёе"
Только не забывайте, что заменив один символ несколькими, вы измените общее количество символов в документе. Поэтому осторожнее при применении циклов. Это также касается и следующего кода.
'получаем количество слов в документе
'(переход на новую строку считается словом)
DocWord.Words.Count
'получить слово по его индексу
DocWord.Words(2).Text
'изменить слово по его индексу
DocWord.Words(2).Text="текст" 'можно несколько слов "Новый текст"
'получить количество параграфов (абзацев) в документе
WordApp.ActiveDocument.Paragraphs.Count
'получить текст параграфа по его индексу
WordApp.ActiveDocument.Paragraphs(2).Range.Text
'изменить текст параграфа по его индексу
WordApp.ActiveDocument.Paragraphs(2).Range.Text="Много текста. Много " & _
" предложений. И так далее!"
'получить количество предложений в документе
WordApp.ActiveDocument.Sentences.Count
'получить текст предложения по его индексу
WordApp.ActiveDocument.Sentences(1).Text
'получить количество предложений во втором параграфе
WordApp.ActiveDocument.Paragraphs(2).Range.Sentences.Count
'получить текст предложения 1 в параграфе 2
WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Text
'получить текст слова 2, в предложении 1,в параграфе 2
WordApp.ActiveDocument.Paragraphs(2).Range.Sentences(1).Words(2).Text
'добавить новую секцию (раздел)
'создаёт новый раздел на новом листе
DocWord.Sections.Add
'создаёт новый раздел на текущем листе
DocWord.Application.S_election.I_nsertBreak (wdSectionBreakContinuous) '(3)
'получить количество секций в документе
DocWord.Sections.Count
'получить текст слова 2, в предложении 1,в параграфе 2, в секции 1.
DocWord.Sections(1).Range.Paragraphs(1).Range.Sentences(1).Words(2).Text
Используя Встроенные_Свойства_Документа получаем его статистические данные.
'получаем количество страниц (листов) в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyPages) '(14)
'получаем количество строк в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyLines) '(23)
'получаем количество слов в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyWords) '(15)
'получаем количество параграфов (абзацев) в документе
WordApp.ActiveDocument.BuiltInDocumentProperties(wdPropertyParas) '(24)
'и т.д.
Рассмотрим примеры кода для передвижения по документу, а также поиска и замены текста.
Метод .GoTo (перейти к) позволяет вам переместиться на нужную позицию в документе. Он при прямом вызове возвращает новую позицию курсора.
'переход на лист с именем "1"
'если не указать в конце .S_elect, то код просто выдаст положение курсора
DocWord.Application.S_election.GoTo(wdGoToPage, , , "1").S_elect
wdGoToSection (0) - перейти к секции ; wdGoToPage (1) - перейти к листу ;
wdGoToTable (2) - перейти к таблице ; wdGoToLine (3) - перейти к строке ;
wdGoToFootnote (4) - перейти к сноске ; wdGoToEndnote (5) - к примечанию ;
wdGoToComment (6) - к комментарию ; wdGoToField (7) - к полю ;
wdGoToHeading (11) - к заголовку ;
wdGoToSpellingError (13) - к орфографической ошибке ;
wdGoToGrammaticalError (14) - к грамматической ошибке.
'переход на лист с индексом 1
DocWord.Application.S_election.GoTo(3, , 1, "").S_elect
'переход в начало строки с индексом 1
DocWord.Application.S_election.GoTo(3, , 1, "").S_elect
'переход в начало следующей строки (аналогично текущий_индекс+1)
DocWord.Application.S_election.GoTo(3, wdGoToNext, 1, "").S_elect
wdGoToNext (2) - на следующий ; wdGoToPrevious (3) - на предыдущий.
Поиск и замена:
'находим первое вхождение текста и выделяем его
WordApp.Application.S_election.Find.Text = "строка"
WordApp.Application.S_election.Find.Execute
'находим первое вхождение текста
WordApp.Application.S_election.Find.Text = "строка"
' и заменяем только его
WordApp.Application.S_election.Find.Replacement.Text = "1 строчка"
WordApp.Application.S_election.Find.Wrap = wdFindContinue
WordApp.Application.S_election.Find.Execute Replace:= wdReplaceOne '(1)
'или тоже самое, но другим способом (при повторном выполнении кода, заменится следующее слово)
WordApp.ActiveDocument.Content.Find.Execute _
FindText:="текста", ReplaceWith:="hello", Replace:= wdReplaceOne '(1)
Для замены всех вхождений текста применяйте wdReplaceAll (2).
Когда требуется более тонкая настройка доступа, на помощь приходит механизм RLS - Record Level Security.
Конфигурации системы «1С:Предприятие» 8 изначально позиционировалась как программа для многофирменного учета, и один из первых возникающих вопросов – как бы сделать так, что бы пользователь видел только те данные, которые ему положено видеть, и никакие другие? Конечно, есть роли, с помощью которых можно разрешить или запретить то или иное действие над объектом конфигурации, есть интерфейсы, позволяющие минимизировать пункты меню. Но как быть в случае, когда к одному и тому же объекту конфигурации нужно организовать «интеллектуальный» доступ, скрывающий только определенный записи? Ярким примером служит справочник «Организации»: учет в базе ведется по нескольким фирмам, справочник физически один, документы по фирмам ведутся одни и те же. Понятно, что в этом случае в назначенных ролях пользователя нельзя просто убрать права на чтение и просмотр, нужна более детальная настройка - RLS.
Ограничения RLS можно задавать для следующих действий над объектами базы данных:
- Чтение – получение записей из таблицы базы данных;
- Добавление – добавление новых записей без изменения существующих;
- Изменение – изменение существующих записей;
- Удаление – удаление некоторых записей без внесения изменений в другие.
Ограничение доступа задаётся подмножеству, определяемому условием выборки, заданному с помощью языка запросов. Если результат выполнения запроса ИСТИНА, то доступ на определенное действие будет предоставлен, в противном случае доступ будет запрещен.
Пример запроса:
В качестве переменных в запросах RLS используются специальные объекты конфигурации – параметры сеанса. Кроме привычных типов объектов, тип параметра может быть такжеNULL, УникальныйИдентификатор, ФиксированныйМассив, ВидДвиженияНакопления и др. Особо хочется отметить тип ХранилищеЗначений, позволяющий хранить разнородные данные в одном параметре (например, ОбщиеЗначения). Значения параметров сеанса обычно задается в процедуре ПриНачалеРаботыСистемы.
Так, при выводе списка номенклатуры можно отображать только некоторые группы справочника, при выборе контрагента в документ можно показывать не всех контрагентов, а только тех, к которым позволено работать пользователю, при формировании отчета скрывать данные по определенному подразделению. Вариантов применения RLS масса, нужды бизнеса иногда диктуют порой умопомрачительные требования, например разграничения доступа к проектам и спецификациям.
Заданные ограниченияRLS добавляются системой к каждому запросу, каждому действию с базой данных. Поэтому необходимо помнить, что злоупотребление механизмом RLS чревато снижением быстродействия системы.
В типовых конфигурациях возможность настройки прав доступа на уровне записей организована только для групп пользователей. Т.е. каждый пользователь системы включается в одну или несколько групп, для которых настраивается правило доступа к объекту или множеству элементов. Чем в большее количество групп входит пользователь, тем ниже будет производительность системы.
Платформа 1С в явном виде не предоставляет возможность отладки работы механизма RLS, но тем ни менее сделать это вполне реально. Для этого можно воспользоваться универсальной консолью отчетов (версия не ниже 2.6.9.2), на закладке «Данные» у которой есть функция «Выполнить от имени». Обработка создаст COM-соединение с помощью указанного имени пользователя и пароля, и выдаст результат выполнения запроса в консоль.
Используя имеющиеся в конфигурациях шаблоны ограничений, или создавая свой собственный запрос с помощью конструктора ограничений доступа к данным, можно настроить работу базы данных до мельчайших деталей, расписав кому что видно, доступно и дозволено. Единственным минусом является снижение производительности базы данных, но, как говорится, всё хорошее должно быть в меру.
Регулярные выражения (Regular Expressions) являются известным и мощным средством для поиска, тестирования и замены подстрок. Эта технология доступна и в 1С - через объект VBScript.RegExp. Нужный объект уже встроен в современные версии Windows (начиная с Windows 98), и устанавливать дополнительно ничего не нужно.
Приведенные ниже примеры были протестированы в 1С:Предприятие 7.7; для 1С:Предприятие 8.x изменяется способ создания объекта:
Кроме того, там уже есть логические константы Истина и Ложь - объявлять их не нужно.
Более подробное описание самой технологии RegExp (что означают те или иные значки или скобочки, или какие шаблоны поиска или замены можно использовать в типичных ситуациях) можно найти в специальной литературе (например Бен Форта "Освой самостоятельно регулярные выражения (regexp) за 10 минут") или на сайтах в сети Internet.
Более продвинутый пример разбора HTML использует подвыражения (SubMatches) и позволяет находить как сами теги, так и текст между ними.
Часто регулярные выражения используются для тестирования строк, например пользовательского ввода.
Этот пример позволяет узнать, является ли строка целым числом.
Регулярные выражения поддерживают не только поиск, но и замену текста. При этом найденные подвыражения (в круглых скобках) могут быть представлены в строке замены как $1, $2 и т. д.
(знак доллара используется в VBScript.RegExp; в других средах программирования, например в JavaScript, используемый для этой цели символ может отличаться).
Временные таблицы - хранятся на сервере и позволяют писать более простые запросы.
Временные таблицы хранятся в объекте типа МенеджерВременныхТаблиц. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Чтобы создать временную таблицу, используется ключевое слово "ПОМЕСТИТЬ В", например:
Временная таблица создается при выполнении запроса, если повторно выполнить запрос, то выдастся ошибка, что таблица уже существует.
Описания временных таблиц хранятся в свойстве запроса МенеджерВременныхТаблиц. К сожалению, нельзя получить список временных таблиц, которые хранятся в запросе.
Пример 1: Как можно выгрузить временную таблицу в таблицу значений и как использовать менеджер временных таблиц:
Вместо перечисления списка полей можно использовать "ВЫБРАТЬ * ".
Если есть ТЗ, в каждой колонке которой значения всего одного типа, для типизации колонок, можно воспользоваться функцией:
Пример 2: Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой:
В процессе работы пользователей, зачастую возникает необходимость создать задачу другому пользователю ИБ и проконтролировать ее выполнение.
К примеру, существует следующая задача:
Автоматизируемая компания занимается торговлей оборудованием. Специфика отгрузки оборудования заключается в том, что в основном она сопровождается оказанием услуг по монтажу закупленного оборудования. Исходя из этого, при оформлении заказа покупателя необходимо кроме ответственного за данный заказ указывать ответственного сотрудника по монтажу (в случае если это услуга не предусмотрена, реквизит не виден).
Если услуга по монтажу оборудования предусмотрена, то автоматически должно сформироваться два напоминания (события):
- Для ответственного менеджера на дату и время напоминания
- Для сотрудника ответственного за монтаж за сутки до напоминания ответственному менеджеру.
Когда срабатывает напоминание у ответственного менеджера, он должен видеть отработано ли напоминание сотрудника по монтажу оборудования.
Сформировать отчет, показывающий состояние согласования (когда сотрудник, ответственный за монтаж отработал напоминание) по незакрытым заказам покупателей (в случае оказание услуги по монтажу).
Решим ее следующим способом:
Создаем три реквизита документа Заказ покупателя: М_Монтаж (булево), М_Монтажник (Справочник пользователи) и М_ДатаМонтажа. Размещаем их на форме. Для того что бы сами реквизиты и их надписи были не видимы добавим процедуру:
При открытии формы документа тоже надо проверять можно ли отображать на форме новые реквизиты. Процедура УстановитьВидимость() вызывается из процедуры ПриОткрытии(). Именно здесь продублируем код процедуры М_МонтажПриИзменении(Элемент). Существуют, конечно, варианты. Например, можно управление видимостью организовать только в процедуре УстановитьВидимость() а в МонтажПриИзменении() обращаться к ней, или в процедуре УстановитьВидимость() вызывать МонтажПриИзменении(), однако, в первом варианте при каждом изменении значения реквизита «М_Монтаж» будет происходить установка видимости всех реквизитов в форме, что негативно скажется на производительности. Второй вариант не совсем корректен с точки зрения логики расположения программного кода, по этому сделаем наш код слегка избыточным, но зато логичным и не замедляющим работу программы.
При проведении документа следует создавать Задачу пользователя с взведенным флагом «Напоминание» и установленной датой напоминания. Лучше всего располагать создание задач после проверки на корректность заполнения всех полей документов (ведь документ может не провестись, а задачи создадутся)
Создавать задачи лучше с помощью немного доработанной процедуры РаботаСДиалогами.ПроверитьЗадачиПоОбъекту(Ссылка);
Во-первых, она проверит, есть ли введенные на основании этого документа задачи, и если обнаружит их, выдаст диалоговое окно пользователю с предложением не создавать новые. Этим мы исключим вероятность создания большого числа напоминаний при перепроведении документа. В самой функции ПроверитьЗадачиПоОбъекту() напишем:
Обратите внимание на реквизит «Инициатор» двух создаваемых нами задач. В форме списка задач существует возможность переключаться в режим просмотра заданий выданных текущим пользователем. Именно с помощью такого определения инициатора выполняется условие задачи: «В окошке напоминания менеджера должно быть видно, отработано ли событие монтажником»
Отчет в задании совсем не сложный, правда, могут возникнуть сомнения какой заказ считать закрытым. Как известно, заказ покупателя делает два движения. Одно по регистру «Заказы покупателя» где в разрезе номенклатуры, ведется учет по отгруженным товарам, второе по регистру «Расчеты с контрагентами» и здесь контролируется оплата по заказу. Думаю, что закрытым можно считать заказ, которого нет в остатках ни по одному, ни по второму регистру. Соединив их полным соединением, а так же присоединив таблицу Задач пользователя, получим отчет по незакрытым заказам пользователя. Автор: Максим Нечистяк
Для защиты от несанкционированного использования системы 1С:Предприятия 8 в случае многопользовательской лицензии используется сетевая система защиты HASP4 Net. Особенностью данной системы защиты является то, что с помощью одного аппаратного ключа защиты HASP4 Net может разрешаться одновременная работа 1С:Предприятия 8 на нескольких компьютерах в рамках локальной сети. Использование системы 1С:Предприятие 8 в этом случае регламентируется дополнительной многопользовательской лицензией. При использовании нескольких ключей защиты HASP4 Net, в локальной сети должно быть соответствующее количество компьютеров с запущенным HASP License Manager. Количество компьютеров, на которых запущены HASP License Manager, должно соответствовать количеству ключей HASP4 Net, используемых для защиты 1С:Предприятия 8. В этом случае, количество рабочих мест, на которых может быть запущено 1С:Предприятие 8 определяется как сумма "возможностей" каждого из отдельно взятых аппаратных ключей.
Проблема:
Количество пользователей, одновременно работающих с 1С:Предприятием 8, оказывается меньше, чем сумма лицензий каждого из отдельно взятых аппаратных ключей. Подключение новых пользователей становится невозможным, несмотря на достаточное количество лицензий. Проблема проявляется после неоднократного аварийного завершении сеанса работы 1С:Предприятия 8 и последующими попытками повторного подключения. После перезагрузки всех HASP License Manager, проблема исчезает.
Причина:
Проблема с нехваткой лицензий обусловлена тем, что при повторном запуске 1С:Предприятия 8 после аварийного завершения, оно может подключиться к другому HASP License Manager, который выдаст новую лицензию. Предыдущая, при этом, останется занятой еще 36 часов. Этого не произойдет, если при повторном запуске 1С:Предприятие подключится к тому же HASP License Manager.
Решение:
При работе с несколькими сетевыми ключами, с помощью файла конфигурации HASP.INI, можно "прикрепить" пользователей к конкретному HASP License Manager. Количество "прикрепленных" пользователей должно соответствовать количеству лицензий ключа, обслуживаемого данным HASP License Manager. В этом случае одному и тому же пользователю(рабочей станции) не будет выдаваться несколько лицензий, независимо от того, сколько раз он подключился. Параметры файла конфигурации HASP.INI описаны в документации - "Руководство по установке и запуску".
Например:
Основная идея настройки в данном случае – назначить каждому менеджеру лицензий свое имя и сообщить каждой копии защищенной программы эти имена. Задать имя менеджеру лицензий можно через файл nhsrv.ini, он должен находиться в одном каталоге с менеджером лицензий. Если менеджер лицензий установлен как сервис, то в каталоге Windows\System32. Имя менеджера лицензий должно состоять из алфавитно-цифровых символов (только английские буквы!), и не должно быть длиннее 7 символов.
Пример настройки:
Сообщить защищенной программе имена менеджеров можно через файл nethasp.ini, который должен находится в одной директории с защищенным приложением.
Пример:
Адреса даны для примера, следует указывать реальные IP-адреса компьютеров, где установлены соответствующие менеджеры лицензий.
Конструктор запроса состоит из следующих закладок:
1. «Таблицы и поля» - на закладке три иерархических списка:
a. «База данных» - перечислены все доступные объекта, к которым можно сделать за-прос. Также кнопка «Отображать таблицы изменений» , с помощью которой можно получить доступ к таблицам изменений объектов ИБ, если они регистрируются для какого либо плана обмена.
b. «Таблицы» - список выбранных таблиц, к которым будет выполнен запрос. Также в этом окне можно удалить таблицу, переименовать или заменить таблицу, а также добавить внутренний запрос.
Для виртуальных таблиц можно назначать параметры, нажав на кнопку «Параметры виртуальных таблиц»:
Рекомендуется активно использовать параметры виртуальных таблиц для отборов по тем или иным измерениям, поскольку при этом увеличивается скорость выполнения запроса. В параметрах можно использовать внешние переменные, название которых предваряется знаком «&».
c. «Поля» - список полей, которые выбираются из таблиц. Также можно добавить вычисляемые поля, для этого при нажатии кнопки «Добавить» открывается конструктор произвольного выражения:
Слева окно с доступными в выражении полями. Справа подсказку используемых функций. Внизу конструируемое произвольное выражение. В выражениях можно использовать внешние параметры, для их обозначения используется знак «&», например: &Период, &ДатаНач Нужно быть внимательным, если в окне будет набрано длинное и сложное выра-жение, в котором будет небольшая синтаксическая ошибка, то после нажатия кноп-ки «ОК» система выдаст предупреждение и закроет окно. Весь набранный код бу-дет потерян, поэтому рекомендую, если нет уверены в правильности выражения, то перед закрытием конструктора всегда сохраняйте содержимое в буфер обмена (Ctrl-C).
2. «Связи» - на закладке указываются связи между таблицами.
В таблице указываются связываемые таблицы, отношение между связываемыми таблицами и усло-вие связи. Если условие связи сложно, то можно указать некое вычисляемое выражение, при этом откроется конструктор произвольного поля.
3. «Группировка» - на закладке указываются, какие поля группируются, а какие агрегируются (суммируются).
4. Закладка «Условия» - перечисляются условия которые накладываются на запрос.
В условиях тоже можно писать сложные выражения с помощью конструктора простых выражения и ис-пользованием внешних переменных:
5. «Дополнительно»
Дополнительные параметры, накладываемые на запрос
6. «Объединения и псевдонимы»
На этой закладке можно назначать псевдонимы для полей , а также управлять запросами которые соединяется через конструкции «ОБЪЕДИНИТЬ» или «ОБЪЕДИНИТЬ ВСЕ»
7. «Порядок»
В каком порядке будут выводиться получаться результаты запроса
Внимание! В низу закладки можно видеть галочку «Автоупорядочивание» - в текущей версии 1С 8.1 в СКД она бесполезна, более того при установленной галочке при записи СКД выдает ошибку, так что ею пользоваться не стоит.
8. «Компоновка данных»
Закладка, в которой определятся служебные поля для СКД. Играет примерно такую же роль, что и закладка «Построитель отчета» в обычном конструкторе отчетов.
a. На закладке «Таблицы» - перечислены таблицы, используемые в запросе, можно указать обязательность включения таблицы в запрос, галочкой «Обязательная». Т.е. если никакие поля в выборку не попадают, то данная таблица в запросе вообще не участвует. Также можно указать параметры для таблиц.
В процессе настройки СКД, мы задаем, какие либо отборы, то все значения отборов будут подставлены в параметры виртуальных таблиц, что снова нам поможет оптимизировать и ускорить запрос.
b. На закладке «Поля» - перечислены поля и их псевдонимы, которые будут добавляться в список полей СКД.
c. «Условия» - в случае указания отборов в настройках СКД, все значения отборов будут добавляться как дополнительные условия, в условия можно также добавлять сложные выражения.
9. «Характеристики»
Закладка, не имеющая аналога в обычном конструкторе выходной фор-мы.
Даная закладка обеспечивает расширение работы запросов с характеристиками. Таблица на закладке состоит из нескольких полей:
a. «Тип значения» - тип для которого будут выбираться характеристики. Например если указать «СправочникСсылка.Номенклатура», то в запросе будут выбираться все характеристики для номенклатуры.
b. «Источник» - источник для свойств видов характеристик, может быть запрос или таблица. В данном поле мы можем написать запрос выборки только тех свойств, которые нам нужны.
c. «Список характеристик» - поле в котором указывается источник для свойств характери-стик. Чаще всего это план видов характеристик или запрос. Также нужно указать поля, которые отвечают за «Идентификатор», «Имя» и «Тип» свойства.
d. «Источник» - следующее поле, в котором указываем источник значений характеристик, тоже может быть или таблица или запрос.
e. «Значение характеристик» - таблица или запрос, которые получает значения характери-стик. Например, таблицей значений характеристик может служить регистр сведений «ЗначенияСвойствОбъектов». Мы также должны указать те поля из таблицы (или запро-са), что отвечают за «Объект», «Свойство» и «Значение» характеристики.
После редактирования запроса, текст запроса можно видеть в окне под список полей. Ниже галочкой «Автозаполнение» мы можем регулировать заполнение дополнительных параметров для полей определенных в запросе. Следует обратить внимание, что состав полей определяется только в самом запросе.
Программа rundll32.exe входит в стандартную поставку всех операционных систем семейства Windows и позволяет выполнять различные функции, описанные в библиотеках, драйверах или ActiveX-объектах, как будто они выполняются из программы. Также эта программа входит в состав новой операционной системы Windows Vista, поэтому обзор новой операционной системы, предназначенный для опытных пользователей, никак нельзя назвать законченным, если он не будет содержать описание команд rundll32.exe, доступных в Windows Vista.
Синтаксис использования программы rundll32.exe следующий: rundll32.exe «библиотека», «функция» «параметры». При этом очень важно понимать, что название функции, хранящейся в библиотеке, зависит от регистра, которым вы ее написали. То есть, например, функции MessageBox и messageBox, в понимании программы rundll32.exe, являются различными функциями, поэтому если в названии функции вы напишете вместо прописной буквы строчную, программа rundll32.exe выдаст ошибку. Название же самой программы rundll32.exe и название библиотеки можно указывать как строчными, так и прописными символами.
Пример:
Приведу список наиболее значимых команд (в котором найдете ОЧЕНЬ интересные команды, ну а как их использовать, думайте сами!):
* rundll32 shell32.dll,Control_RunDLL hotplug.dll - диалоговое окно Отключение или извлечение аппаратного устройства
* rundll32 diskcopy,DiskCopyRunDll - вызов диалога "Копирование диска".
* rundll32 keyboard,disable - отключение клавиатуры, действует до следующей перезагрузки.
* rundll32 mouse,disable - отключение мыши вплоть до перезагрузки.
* rundll32 krnl386.exe,exitkernel - выгрузить ядро системы, выход из Windows.
* rundll32 mshtml.dll,PrintHTML "HtmlFileNameAndPath" - распечатать документ HTML, где "HtmlFileNameAndPath" - путь к файлу и его имя.
* rundll32 мсprint2.dll,RUNDLL_PrintTestPage - распечатать тестовую страницу на принтере.
* rundll32 netplwiz.dll,AddNetPlaceRunDll - вызов мастера подключения нового сетевого ресурса "Добавление в сетевое окружение".
* rundll32 rnaui.dll,RnaWizard - вызов мастера "Удаленный доступ к сети".
* rundll32 rnaui.dll,RnaWizard /1 - вызов мастера "Удаленный доступ к сети" без отображения начального окна.
* rundll32 shell,ShellExecute - открыть Проводник (папка "Рабочий стол").
* rundll32 shell32,Control_RunDLL - открыть в Проводнике папку "Панель управления".
* rundll32 shell32,Control_RunDLL appwiz.cpl,,n - вызов диалогового окна "Установка и удаление программ", в котором будет открыта вкладка с номером "n" (от 1 до 3).
* rundll32 shell32,Control_RunDLL main.cpl @0 - открыть диалог "Свойства мыши".
* rundll32 shell32,Control_RunDLL main.cpl @1 - открыть диалог "Свойства клавиатуры".
* rundll32 shell32,Control_RunDLL main.cpl @2 - открыть папку "Принтеры".
* rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintersFolder - открыть папку "Принтеры" (другой способ).
* rundll32 shell32,Control_RunDLL main.cpl @3 - открыть папку "Шрифты".
* rundll32 SHELL32,SHHelpShortcuts_RunDLL FontsFolder - открыть папку "Шрифты" (другой способ).
* rundll32 SHELL32,Control_RunDLL modem.cpl, add - открыть диалог "Свойства модема".
* rundll32 shell32,Control_RunDLL timedate.cpl - открыть диалог "Дата и время".
* rundll32 shell32,OpenAs_RunDLL - вызвать диалог "Открыть с помощью...".
* rundll32 shell32,ShellAboutA WINHOWTO.RU - информация о версии Windows.
* rundll32 shell32,SHExitWindowsEx 0 - закрыть все программы, перегрузить оболочку.
* rundll32 shell32, SHExitWindowsEx 1 - выключить ПК.
* rundll32 SHELL32, SHExitWindowsEx -1 - перегрузить оболочку Windows.
* rundll32 shell32, SHExitWindowsEx 2 - перегрузить ПК.
* rundll32 shell32,SHExitWindowsEx 4 - принудительно закрыть все программы.
* rundll32 shell32,SHExitWindowsEx 8 - выход из Windows и выключение ATX-совместимого ПК.
* rundll32 shell32,SHFormatDrive - вызов диалога форматирования диска А:.
* rundll32 SHELL32,SHHelpShortcuts_RunDLL AddPrinter - запуск "Мастера установки принтера".
* rundll32 shell32,SHHelpShortcuts_RunDLL Connect - запуск мастера подключения сетевого диска.
* rundll32 SHELL32,SHHelpShortcuts_RunDLL PrintTestPage - распечатать тестовую страницу.
* rundll32 sysdm.cpl,InstallDevice_Rundll - вызов мастера установки оборудования.
* rundll32 url.dll,FileProtocolHandler %1 - открыть веб-страницу, где %1 - URL сайта (включая http://).
* rundll32 url.dll,MailToProtocolHandler %1 - создать новое письмо, где %1 - e-mail адресата.
* rundll32 user,CASCADECHILDWINDOWS - расположить все окна каскадом.
* rundll32 user,TILECHILDWINDOWS - расположить все окна по экрану.
* rundll32 user,disableoemlayer - сбой системы (!) - выключить все функции ввода-вывода
(клавиатура, дисплей, мышь). В результате будет черный экран с курсором и ни на что не реагирующая система, однако Windows продолжает работать.
* rundll32 user,ExitWindowsExec - быстрая перезагрузка Windows.
* rundll32 user,RepaintScreen - выполнить команду "Обновить".
* rundll32 user,SetCaretBlinkTime n - задать частоту мигания курсора, соответствующую значению параметра n.
* rundll32 user,SetCursorPos - переместить курсор мыши в верхний левый угол экрана.
* rundll32 user,SetDoubleClickTime n - задать скорость двойного нажатия левой кнопки мыши (Double Click), соответствующую параметру n.
* rundll32 user,SwapMouseButton - поменять местами клавиши мыши (обратная смена невозможна).
* rundll32 user,WNetConnectDialog - вызов диалога "Подключение сетевого диска".
* rundll32 user,WNetDisconnectDialog - вызов диалога "Отключение сетевого диска".
* rundll32 AppWiz.Cpl,NewLinkHere %1 - запуск мастера создания нового ярлыка, где %1 - путь к исходному файлу.
* rundll32.exe shell32.dll, SHHelpShortcuts_RunDLL Connect. Вызвать мастер подключения сетевых дисков.
* rundll32.exe shell32.dll, ShellAboutA. Вызвать диалог, отображающий версию операционной системы Windows. Также данный диалог можно отобразить, выполнив команду winver.exe.
* rundll32.exe IEAKENG.dll, BrowseForFileA. Отображает дерево файловой системы жесткого диска компьютера.
* rundll32.exe ndfapi.dll, NdfRunDllHelpTopic «html-страница». Вызвать диалог HELP AND SUPPORT на указанной странице. Например, в качестве html-страницы можно использовать вызов mshelp://Windows/?id=33307acf-0698-41ba-b014-ea0a2eb8d0a8.
* rundll32.exe shell32.dll, OpenAs_RunDLL "путь и имя файла". Вызвать диалог OPEN AS… для открытия данного файла.
* rundll32.exe shell32.dll, Control_RunDLL Cliconfg.dll. Отображает диалог SQL Server Client Network Utility.
* rundll32.exe shell32.dll, Control_RunDLL Hotplug.dll. Отображает диалог удаления съемного устройства.
* rundll32.exe admparse.dll, CheckDuplicateKeysA "путь и имя файла". Переписывает содержимое данного файла.
* rundll32.exe IEAKENG.dll, BToolbar_SaveA "путь к папке". Создает папку. Если данная папка уже существует, тогда все ее содержимое будет удалено.
* rundll32.exe appwiz.cpl, GetProgramsOnline. Запускает браузер Internet Explorer и загружает страницу http://g.msn.com/WMHFUSEN/101724.
* rundll32.exe shell32.dll, ShellExec_RunDLL "команда". Выполняет команду.
* rundll32.exe url.dll, FileProtocolHandler "каталог". Открыть папку. Если вы не укажете папки, тогда будет открыта папка вашего профиля.
* rundll32.exe WININET.dll, RunOnceUrlCache "путь к папке". Удаляет все файлы указанной папки, имеющие атрибут FILEATTRIBUTETAGINFORMATION.
* rundll32.exe xwizards.dll, ProcessXMLFile "путь и имя xml-файла". Выполнить xml-файл.
* rundll32.exe user32.dll, mouse_event. Выполнить нажатие правой клавиши мыши.
* rundll32.exe user32.dll, SetCursorPos. Установить курсор в правый нижний угол экрана.
* rundll32.exe dfshim.dll, KillService. Остановить работу службы фонового обновления dfsvc.exe
* rundll32.exe IERNONCE.dll, RunOnceExProcess. Выполняет команды, описанные в ветви реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx (или в ветви корневого раздела HKCU).