Есть несколько вариантов вывода информации перед основным отчетом,какой лучше?! - зависит от задачи:
Допустим нам нужно вывести дату и время формирования отчета и свою шапку отчета, например так:
Варианты решения:
1. Использование группировки и макета заголовка:
1. Создаем в схеме новую группировку (без поля) и установим имя группировке Шапка отчета.
2. Удалим у данной группировки из выбранных полей автополе
В других настройках выберем макет оформления "Без оформления" (иначе на наш макет будет накладываться стандартный макет и вокруг всех ячеек будет рамка)
На вкладке макеты добавляем макет заголовка группировки (при добавлении указываем наше имя группировки (Шапка отчета) и указываем область с нашими данными), справа в табличном документе пишем необходимый текст и параметр
Сохраняем, формируем и видим результат как выше
2. Программное изменение текста заголовка
Код нужно установить в процедуре модуля отчета ПриКомпоновкеРезультата()
еще пример:
3. Вывод табличного макета с параметром перед формированием отчета
Создаем макет ВыводСформирован, в нем создаем параметр Сформирован и назначаем имя области Заголовок
В 1С предполагается, что СообщениеПользователю выводятся для того, чтобы сообщить пользователю об ошибках.
А для информирования о выполняемом действии рекомендуется использовать метод встроенного языка ПоказатьОповещениеПользователя().
СообщениеПользователю выводит сообщение пользователю (после окончания обработки) или сохраняет его в очередь, если сообщение невозможно вывести прямо сейчас.
Пример вывода сообщения на клиенте:
При обработке на сервере:
Необходимо зарегистрировать в системе соответствие объекта и имени реквизита формы. Для этого в глобальном контексте реализована функция УстановитьСоответствиеОбъектаИРеквизитаФормы(). Сделать это можно следующим образом:
В данном фрагменте выполняется преобразование объекта из данных формы в реальный объект и устанавливается его соответствие с реквизитом формы по имени "Объект".
Если в дальнейшем требуется создать сообщение, можно сделать это следующим образом:
В этом фрагменте создается новый объект СообщениеПользователю, в котором запоминается Текст сообщения и указывается Поле объекта, ошибка в данных которого вызвала необходимость вывода сообщения. Информация о том, как объект расположен в форме берется из предварительно запомненной пары "Объект/ИмяРеквизитаФормы". В дальнейшем сообщение будет выведено в окно сообщений формы и привязано к соответствующему элементу управления.
Примеры заполнения свойства Поле объекта СообщениеПользователю
ТипШаблонПример
Реквизит
ИмяРеквизита
Контрагент
Табличная часть
ИмяТабличнойЧасти
Скидки
Реквизит табличной части
ИмяТабличнойЧасти[ИндексСтроки].ИмяРеквизита
Номенклатура[10].Количество
Реквизит набора записей
[ИндексСтроки].ИмяРеквизита
[10].Курс
Еще примеры:
ПоказатьОповещениеПользователя - оповещение возникает в правом нижнем углу приложения и сообщает о совершенном действии. В течение нескольких секунд оно постепенно гаснет и пропадает. При этом, если навести на оповещение курсор мышки, оно не гаснет, и есть возможность внимательно его прочитать:
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов (например, определенных видов документов или справочников). Сами критерии поиска могут варьироваться в довольно широком диапазоне. То есть найти нужные данные можно, даже не помня точно, где они хранятся в конфигурации и как именно записаны.
Полнотекстовый поиск предоставляет следующие возможности:
Есть поддержка транслитерации (написание русских слов символами латиницы в соответствии с ГОСТ 7.79-2000). Пример: "русская фраза" = "russkaya fraza".
Есть поддержка замещения (написание части символов в русских словах одноклавишными латинскими символами). Пример: "руссrfz фраpf" (окончания каждого слова набраны латиницей, допустим, в результате ошибки оператора).
Есть возможность нечеткого поиска (буквы в найденных словах могут отличаться) с указанием порога нечеткости. Пример: указав в строке поиска слово "привет" и нечеткость 17 %, найдем все аналогичные слова с ошибками и без: "привет", "превет", "привед".
Есть возможность указать область выполнения поиска по выбранным объектам метаданных.
Полнотекстовое индексирование названий стандартных полей ("Код", "Наименование" и т. д.) производится на всех языках конфигурации.
Поиск выполняется с учетом синонимов русского, английского и украинского языков.
Морфологический словарь русского языка содержит ряд специфических слов, относящихся к областям деятельности, автоматизируемым с помощью системы программ "1С:Предприятие".
Стандартно в состав поставляемых словарей включены словарные базы и словари тезауруса и синонимов русского, украинского и английского языков, которые предоставлены компанией "Информатик".
Поиск можно осуществлять с использованием подстановочных символов ("*"), а также с указанием поисковых операторов ("И", "ИЛИ", "НЕ", "РЯДОМ") и спецсимволов.
Полнотекстовый поиск можно осуществлять в любой конфигурации на платформе 1С:Предприятие 8
Для того чтобы открыть окно управления полнотекстовым поиском необходимо выполнить следующее:
Обычное приложение - пункт меню Операции - Управление полнотекстовым поиском.
Управляемое приложение - пункт меню Главное меню - Все функции - Стандартные - Управление полнотекстовым поиском.
Обновить индекс – Создание индекса/Обновление индекса;
Очистить индекс – обнуление индекса(рекомендуется после обновления всех данных);
пункт Разрешить слияние индексов – отвечает за слияние основного и дополнительного индекса.
Полнотекстовый поиск осуществляется при помощи полнотекстового индекса. При отсутствии индекса полнотекстовый поиск как таковой не возможен. Для того чтобы поиск имел результат, все необходимые данные должны быть включены в полнотекстовый индекс. Если пользователем введены в базу новые данные, их следует включить в рассматриваемый индекс, иначе они не будут участвовать в поиске. Чтобы этого избежать, необходимо обновлять полнотекстовый индекс. При обновлении система анализирует только определенные типы данных: Строка, Данные ссылочного типа (ссылки на документы, справочники),Число, Дата, ХранилищеЗначения. Если пользователь не имеет прав доступа к определенной информации, то он не сможет увидеть ее в результатах поиска. Следует также помнить и о том, что в свойствах объектов, по которым будет происходить поиск должно быть установлено значение Полнотекстовый Поиск – Использовать, которое задано по умолчанию.
Как вы можете заметить свойство Использовать установлено для всего справочника Контрагенты, но сделать это можно и для каждого его реквизита соответствующего типа.
Рассмотрим более подробно полнотекстовый индекс, который состоит из двух частей (индексов): основного индекса и дополнительного. Высокая скорость поиска данных обеспечивается за счет основного индекса, но обновление его происходит относительно медленно, в зависимости от объема данных. Дополнительный индекс ему противоположен. Данные добавляются в него намного быстрее, но поиск осуществляется медленнее. Система осуществляет поиск одновременно в обоих индексах. Большая часть данных находится в основном индексе, а данные добавляемые в систему попадают в дополнительный индекс. Пока объем данных в дополнительном индексе небольшой, поиск по нему происходит относительно быстро. В тот момент, когда нагрузка на систему невелика, происходит операция слияния индексов, в результате чего дополнительный индекс очищается, а все данные помещаются в основной индекс. Слияние индексов предпочтительнее выполнять в тот момент времени, когда нагрузка на систему минимальна. С этой целью можно создавать регламентированные задания и задания по расписанию.
Специальные операторы, допустимые при задании поискового выражения
Механизм полнотекстового поиска допускает написание части символов русского слова одноклавишными латинскими символами. Результат поиска при этом не измениться.
Два оператора РЯДОМ
упрощенный. На расстоянии 8 слов друг от друга
РЯДОМ/[+/-]n – поиск данных в одном реквизите на расстоянии n-1 слов между ними.
Знак указывает в каком направлении от первого слова будет поиск второго. (+ - после, - до)
Групповой символ «*» может использоваться только в качестве замены конца слова
Оператор нечеткости «#». Если неизвестно точное написание названия, имени.
Программными средствами и средствами 1с: программирование.
Оператор синонимов «!». Позволяет найти слово и его синонимы
Как программно обновить индекс полнотекстового поиска?
Пример полнотекстового поиска данных
Определение переменной СписокПоиска
Кроме этого в процедуре обработки события ПриОткрыии формы определим, что эта переменная будет содержать список полнотекстового поиска, с помощью которого мы и будем осуществлять поиск в данных
Теперь для события нажатия на кнопку Найти напишем код, который позволит нам выполнять поиск в соответствии с тем выражением, которое задано в поле ПоисковоеВыражение
Сначала в этой процедуре мы устанавливаем поисковое выражение, введенное пользователем, в качестве строки поиска для полнотекстового поиска. Затем выполняем метод ПерваяЧасть(), который собственно запускает полнотекстовый поиск и возвращает первую порцию результатов. По умолчанию порция содержит 20 элементов. После этого мы анализируем количество элементов в списке поиска. Если он не содержит ни одного элемента, то мы выводим в форму соответствующее сообщение. В противном случае вызывается процедура ВывестиРезультатПоиска(), которая отображает полученные результаты пользователю.
Создадим в модуле формы процедуру с таким именем и напишем в ней код,
Действия, выполняемые в этой процедуре, просты. Сначала мы формируем сообщение о том, какие элементы отображены и сколько всего элементов найдено. Затем получаем результат полнотекстового поиска в виде HTML-текста и выводим этот текст в поле HTML-документа, расположенное в форме.
В заключение передаем управление в процедуру ДоступностьКнопок() для того, чтобы сделать доступными или, наоборот, запретить доступ к кнопкам Предыдущая порция и Следующая порция (в зависимости от того, какая порция полученных результатов отображена). Текст этой процедуры представлен в Коде
Теперь необходимо создать обработчики событий нажатия на кнопки ПредыдущаяПорция() и СледующаяПорция().
Заключительным «штрихом» будет создание обработчика события onclick поля HTML-документа, расположенного в форме. Дело в том, что результат полнотекстового поиска, представленный в виде HTML-текста, содержит гиперссылки на номера элементов списка поиска. И нам хотелось бы, чтобы при переходе пользователя на эту ссылку система открывала бы форму того объекта, который содержится в этом элементе списка. Для этого мы будем перехватывать событие onclick HTML-документа, содержащегося в поле HTML-документа, получать номер элемента списка из гиперссылки и открывать форму соответствующего объекта. Текст обработчика события onclick поля HTML-документа представлен в коде
Добрый день. Прошу помочь. надо вывести вопрос пользователю, при попытке изменить содержимое поля ввода. В синтакс-помощнике есть примерно такой вариант решения. Пробую при нажатии кнопки "отмена" или "нет"
все равно открывается справочник для выбора пользователя, нужно отменить это, а "Отказ", "Возврат" почему то не работают.........
Доброго дня! Вопрос простой. Или с виду простой. Хочу вывести сообщение в поле надписи на форме. Чтоб при вводе неверных данных появлялась соответствующая надпись. Как мне это сделать?
пробую так:
а = "неверный пин";
ЭтаФорма.ЭлементыФормы.СообщитьНеверныйВвод = а;
ругается:
{ОбщаяФорма.ФормаАвторизации.Форма(80)}: Поле объекта недоступно для записи (сообщить) ЭтаФорма.ЭлементыФормы.СообщитьНеверныйВвод = а;
если так напямую ошибки нет, но и на форме ничего нет
Ниже приведено несколько полезных шаблонов кода по работе с табличным документом:
Для того, чтобы появилась возможность использовать свойство "Значение", необходимо явно присвоить свойству ячейки "СодержитЗначение" значение Истина или установить флажок "Содержит значение" в палитре свойств.
Для ячейки, у которой установлен признак "СодержитЗначение", можно задать тип значения, размещаемого в ячейке.
Следующий фрагмент демонстрирует, как можно управлять этими свойствами из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"
Для ячейки табличного документа можно задавать формат вывода данных. Для этого используется свойство "Формат", которое содержит форматную строку. Приемы работы с форматной строкой полностью совпадают с функцией Формат()
Элемент управления в табличном документе
Для ячейки, у которой установлен признак "СодержитЗначение", можно также задать элемент управления, который будет использоваться для редактирования этого значения.
Элемент управления можно назначить через палитру свойств или из встроенного языка с помощью метода "УстановитьЭлементУправления()". Чтобы проверить в программе, установлен ли элемент управления для конкретной ячейки, можно использовать свойство "ЭлементУправления", которое возвращает элемент управления, назначенный для ячейки.
Элементы управления, встроенные в ячейку, отображаются только при входе в режим редактирования значения. На приведенном ниже рисунке редактируемая ячейка обведена овалом и в ней отображается флажок:
Ниже показан пример установки элемента управления типа "Флажок" из встроенного языка://задаем нужный тип с помощью объекта "ОписаниеТипов"
Для элементов управления, расположенных в табличном документе, расширяется набор свойств, методов и событий:
Разберем самые важные свойства и методы:
Свойство "ВстроенВЯчейку" имеет тип "булево" и говорит о том, что элемент управления встраивается в ячейку или просто привязывается к ней, о чем было рассказано выше.
Свойство "Видимость" позволяет показать или скрыть элемент управления.
Свойство "Значение" предоставляет доступ к значению, которое редактируется в элементе управления. Оно используется только для элементов управления, поддерживающих связь с данными.
Метод "Расположить" позволяет разместить элемент управления в конкретной области ячеек табличного документа. Именно этот метод был использован в вышеприведенном примере.
Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав!
Особенно если настроен RLS
Есть несколько способов как это сделать:
1. Установить привилегированный режим в модуле отчета
Форма отчета должна быть Управляемой, далее в модуле отчета процедура обработчика «При компоновке результата»:
2. Формирование в привилегированном режиме через Общий модуль с галкой Привелигерованный
Создаем общий модуль
так же как в пункте 1 в обработчике «При компоновке результата» пишем:
В общем модуле МЕ_ДляОтчетаСКД_ПривелРежим код:
3. Если включен режим Использовать ограничение на уровне прав доступа - RLS
Часто используется в типовых. Тут в модуле для текущего пользователя можно на время формирования отчету установить параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей в Ложь и RLS не сработает.
После завершения формирования, не забудьте включить rls обратно установив = Истина
4. Если в запросе используется конструкция вида регистратор.дата и это поле не отображается в полях отчета СКД
Допустим Вы сделали запрос по регистру накоплений и через регистратор обратились к дате или сумме документа и при формировании отчета СКД, эти поля недоступны !? как же быть?
Проблема в том - что у регистратором может выступать несколько документов и видимо права чтение/просмотр есть не на все - поэтому через скд эта таблица целиком недоступна, решение:
1. открыть доступ на все регистраторы регистра
2. в запросе четко обозначить тип
В дополнении у пункту 1, код процедуры сформировать отчет(). Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах:
Вопрос: Подскажите пожалуйста, каким образом можно сделать следующее.
У меня есть выводимый в табличный документ результат запроса, к ячейке есть расшифровка.
Я хочу чтобы при двойном клике на ячейку выполнялась процедура которая к примеру запускает отчет по расшифровке ячейки.
Ответ: Расшифровки бывают стандартные и нестандартные.
I) Стандартные:
может использоваться как непосредственно в табличном документе, так и в объекте ПолеТабличногоДокумента (т.е.табличный документ, размещенный не в отдельном окне, а непосредственно на форме).
Чтобы Расшифровка сработала, должны выполняться 3 условия:
1) Для ячейки табличного документа, из которой мы хотим вызвать Расшифровку, должно быть установлено свойство ПараметрРасшифровки. Например, мы хотим, чтобы по двойному щелчку на ячейке с названием контрагента открывалась форма элемента справочника Контрагента, чтобы можно было уточнить какие-то данные, которые в отчет не выводятся. Задаем свойству ПараметрРасшифровки какое-нибудь значение, например, РасшифровкаКонтрагента.
2)В процессе вывода областей макета в результирующий табличный документ нужно ОБЯЗАТЕЛЬНО ПРИСВОИТЬ параметру расшифровки значение нужного типа, например:
3)Должен быть обеспечен запрет редактирования ячейки с расшифровкой, т.е. нужно указать
ТабДок.ТолькоПросмотр = Истина;
иначе, несмотря на многообещающий вид курсура при наведении на ячейку можно щелкать по ней сколько угодно, но ничего происходить не будет.
II) Нестандартные:
по двойному щелчку на ячейке с расшифровкой можно вызвать свою процедуру. Для реализации этого следует выполнить несколько условий:
1)Вывод табличного документа должен осуществляться в объект ПолеТабличногоДокумента;
2)Должно быть присвоено значение свойству ячейки ПараметрРасшифровки, например, РасшифровкаКонтрагента.
3)Параметру расшифровки РасшифровкаКонтрагента присваивается заполненный при формировании табличного документа нужными значениями СписокЗначений или чаще Структура. В частности, может передаваться имя стандартного отчета конфигурации и параметров, которые нужно задать в форме отчета, например, период дат, номер счета и т.д. А потом этот отчет вызывается как процедура.
4)Для объекта ПолеТабличногоДокумента свойство ТолькоПросмотр нужно установить в значение Истина.
5)Код пользовательской процедуры помещается в процедуру
Приведу небольшой пример, открывающий для "щелкнутого" контрагента подчиненный справочник.
Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора ссылки. Для этого необходимо использовать глобальную функцию XMLСтрока в вычисляемых полях в макете схемы компоновки.
Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.
Рассмотрим два случая - вывод в табличный документ и формирование текстового документа.
Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник "КлассификаторБанковРФ", более 4000 элементов.
Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).
По результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для кого-то могут быть полезны.
Итак, начнем. Запрос - это специальный объект в 1С 8.2, который используется для формирования и выполнения запросов к таблицам базы данных в системе. Для выполнения запроса необходимо составить текст запроса, в котором описывается какие таблицы будут использоваться в качестве источников данных запроса, какие нужно выбрать поля, какие применить сортировки и группировки и т.д. Подробнее о запросах можно прочитать в книге "1С 8.2 Руководстве разработчика". Язык запросов 1С 8.2 очень похож синтаксисом на другие SQL языки запросов баз данных, но есть и отличия. Из основных преимуществ встроенного языка запросов стоит отметить разыменование полей, наличие виртуальных таблиц, удобная работа с итогами и нетипизированные поля в запросах. Из недостатков – в качестве выходного поля нельзя использовать запрос, нельзя использовать хранимые процедуры, нельзя преобразовать строку в число.
Приведу сведения и рекомендации по языку запросов по пунктам:
1.Для повышения читабельности запроса и уменьшения количества параметров запроса можно в запросе применять обращение к предопределенным данным конфигурации с помощью литерала ЗНАЧЕНИЕ (ПРЕДСТАВЛЕНИЕЗНАЧЕНИЯ). В качестве представления значений могут использоваться значение перечислений, предопределенные данные справочников, планов видов расчета, планов видов характеристик, планов счетов, пустые ссылки, значения точек маршрута, значения системных перечислений (например, ВидДвиженияНакопления, ВидСчета).
Примеры: ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.Москва) ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка) ГДЕ ТипТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга) ГДЕ ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) ГДЕ ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.Согласование.ТочкаМаршрута.Согласие)
Выражение в скобках всегда начинается со слова в единственном числе (Справочник, Перечисление и т.д.), которое соответствует типу предопределенного значения.
2.Автоупорядочивание в запросе может сильно тормозить процесс. Если сортировка не нужна, лучше вообще ее не использовать. Во многих случаях эффективнее записать сортировку через ключевое слово УПОРЯДОЧИТЬ ПО.
3.Нужно следить, чтобы при использовании псевдонимов не появилось неоднозначное поле. Иначе система не поймет к какому объекту надо обращаться.
Пример запроса с неоднозначным полем: ВЫБРАТЬ Номенклатура.Ссылка, ОстаткиТоваровОстатки.КоличествоОстаток ИЗ Справочник.Номенклатура КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки ПО ОстаткиТоваровОстатки.Номенклатура = Номенклатура.Ссылка
Нужно исправить псевдоним таблицы, например, так: «Справочник.Номенклатура КАК Номенклатура1», а «Номенклатура.Ссылка» соответственно исправить на «Номенклатура1.Ссылка».
4.Иногда полезно получать представление ссылочных полей с помощью ключевого слова ПРЕДСТАВЛЕНИЕ наряду со ссылкой для того, чтобы не было повторного обращения к базе данных. Это бывает полезно при выводе результата запроса в таблицу.
Пример: ВЫБРАТЬ ПРЕДСТАВЛЕНИЕ(Документ.Контрагент) КАК Получатель, ПРЕДСТАВЛЕНИЕ(Документ.Основание) ИЗ Документ.РасходнаяНакладная КАК Документ
5.Использование в запросе ВЫРАЗИТЬ(Поле КАК Тип) позволяет убрать лишние таблицы из соединения с полем составного типа данных. Тем самым ускорить выполнение запроса.
Пример (регистратор - поле с составным типом для физической таблицы регистранакопления ОстаткиТоваров, в запросе выбираются Дата и Номер документов ПоступлениеТоваров, при этом при обращении к реквизитам документа Дата и Номер через Регистратор не происходит множественного соединения таблицы регистра с таблицами документов, являющихся регистраторами для регистра ОстаткиТоваров): ВЫБРАТЬ РАЗЛИЧНЫЕ [b] ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Номер КАК НОМЕРПОСТУПЛЕНИЯ,[/b] [b]ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров).Дата КАК ДАТАПОСТУПЛЕНИЯ[/b] [b]ИЗ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваровГДЕ (ВЫРАЗИТЬ(ОстаткиТоваров.Регистратор КАК Документ.ПоступлениеТоваров) ЕСТЬ НЕ NULL)[/b]
6.Когда в конфигурации 1С есть пользователи, у которых права ограничены на определенные объекты конфигурации, в запросе к таким объектам необходимо использовать ключевое слово РАЗРЕШЕННЫЕ, чтобы запрос выполнился без ошибки (Выбрать Разрешенные ...)
7.При объединении таблиц, содержащих вложенные таблицы (например, Документ с табличной частью) бывает полезно ключевое слово ПУСТАЯТАБЛИЦА, когда, например, в одном из документов нет табличной части.
Пример: ВЫБРАТЬ Ссылка.Номер, ПУСТАЯТАБЛИЦА.(Ном, Тов, Кол) КАК Состав ИЗ Документ.РасходнаяНакладная ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Ссылка.Номер, Состав.(НомерСтроки, Номенклатура, Количество) ИЗ Документ.РасходнаяНакладная
8.При работе с соединениями таблиц, содержащих по одной строке, бывает нужно склеить строки таблиц (при этом в обеих таблицах нет такого поля, по которому их можно было соединить). Этого можно добиться, применив конструкцию «ПОЛНОЕ СОЕДИНЕНИЕ Таблица По ИСТИНА». Если в таблицах больше, чем одна строка, то в результате будет количество строк, равное произведению количества строк обеих таблиц. Если в одной таблице О строк, то в результирующей таблице количество строк будет равно количеству строк второй таблицы. Также для соединения таких таблиц можно применять декартово произведение таблиц , при котором в результирующей таблице будут встречаться все комбинации строк из обеих таблиц. Надо помнить, что если в одной из таблиц 0 строк, тогда и декартово произведение будет 0, поэтому полное соединение будет лучше. Вообще вместо полного соединения ПО ИСТИНА можно использовать и любой другой тип соединения, но в таком случае тоже возможна ситуация, когда в результирующей таблице будет 0 строк, даже если в одной из таблиц будет ненулевое количество строк. В случае полного соединения такая ситуация будет только в одном случае, если количество строк в обеих таблицах равно 0. Если знать, что в таблице есть точно хотя бы одна строка, тогда можно использовать и ЛЕВОЕ СОЕДИНЕНИЕ с другой таблицей с условием ПО ИСТИНА.
Пример (правда надуманный, для Полного соединения): ВЫБРАТЬ Первые 1 Пол.Ссылка, К.Контрагент ИЗ Перечисление.Пол КАК Пол ПОЛНОЕ СОЕДИНЕНИЕ (Выбрать Первые 1 Д.Контрагент ИЗ Документ.РеализацияТоваров КАК Д Упорядочить По Д.МоментВремени ) КАК К ПО (ИСТИНА)
9. Для того чтобы получить уникальные записи по какому-то полю, правильней вместо группировки пользоваться ключевым словом РАЗЛИЧНЫЕ в запросе, потому что такая конструкция намного наглядней и ключевое слово СГРУППИРОВАТЬ ПО имеет более широкое применение и часто используется, если дополнительно надо рассчитать агрегатные функции по группировкам. В некоторых случаях необходимо вывести ограниченное количество строк. Для этого в описании запроса в описании запроса следует указать ключевое слово ПЕРВЫЕ и после него – требуемое количество строк.
Пример для ПЕРВЫЕ: Выбрать Первые 5 Справочник.Номенклатура.Наименование, Справочник.Номенклатура.ЗакупочнаяЦена Упорядочить По Справочник.Номенклатура.ЗакупочнаяЦена Убыв
Пример для РАЗЛИЧНЫЕ: Выбрать Различные Документ.Расходная.Контрагент
10.Агрегатные функции в запросе можно использовать без ключевого слова СГРУППИРОВАТЬ. В таком случае все результаты будут сгруппированы в одну строку.
Пример: Выбрать Сумма(Накладная.Сумма) Как Сумма Из Документ.РасходнаяНакладная.Состав Как Накладная
11.В запросах в полях выборки можно свободно обращаться к реквизитам полей выборки. Эта возможность называется разыменованием полей выборки. Если источник данных - вложенная таблица (табличная часть документа), то в полях выборки можно обращаться также к полям основной таблицы (например, через поле Ссылка обратиться к полю основной таблицы Контрагент)
Пример: ВЫБРАТЬ [b] ПоступлениеТоваровИУслугТовары.Номенклатура, ПоступлениеТоваровИУслугТовары.Номенклатура.Код, ПоступлениеТоваровИУслугТовары.Количество КАК Количество, ПоступлениеТоваровИУслугТовары.Ссылка.КонтрагентИЗ Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТоварыГДЕ ПоступлениеТоваровИУслугТовары.Ссылка = &Ссылка[/b]
Есть одна особенность использования разыменования полей, если в запросе есть группировки. В любых запросах с группировками в списках полей запроса можно свободно обращаться к реквизитам группировочных полей.
Пример: ВЫБРАТЬ ПоступлениеТоваровИУслугТовары.Номенклатура, ПоступлениеТоваровИУслугТовары.Номенклатура.Код, СУММА(ПоступлениеТоваровИУслугТовары.Количество) КАК Количество, ПоступлениеТоваровИУслугТовары.Ссылка.Контрагент, ПоступлениеТоваровИУслугТовары.Ссылка.Дата ИЗ Документ.ПоступлениеТоваровИУслуг.Товары КАК ПоступлениеТоваровИУслугТовары ГДЕ ПоступлениеТоваровИУслугТовары.Ссылка = &Ссылка СГРУППИРОВАТЬ ПО ПоступлениеТоваровИУслугТовары.Номенклатура, ПоступлениеТоваровИУслугТовары.Ссылка
В справке 1С написано, что при наличии группировки, в полях выборки запроса могут участвовать только группировочные поля и агрегатные функции по полям выборки. Есть один исключительный случай, когда агрегатные функции применены к полям вложенной таблицы. В этом случае в списке полей выборки возможны обращения к полям таблицы верхнего уровня, без группировки результатов по этим полям.
Пример: ВЫБРАТЬ ПоступлениеТоваровИУслуг.Товары.(СУММА(Количество),Номенклатура), ПоступлениеТоваровИУслуг.Ссылка, ПоступлениеТоваровИУслуг.Контрагент ИЗ Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг СГРУППИРОВАТЬ ПО ПоступлениеТоваровИУслуг.Товары.(Номенклатура)
12. Иногда вместо указания какого-либо поля в группировке полезно в поля выборки запроса включить параметр: ВЫБРАТЬ ДокТовары.Номенклатура, &Контрагент, &Период, СУММА(ДокТовары.Количество * ДокТовары.К) КАК Количество, СУММА(ДокТовары.Сумма) КАК СуммаИЗ Документ.Приходная.Товары КАК ДокТоварыГДЕ ДокТовары.Ссылка = &Ссылка СГРУППИРОВАТЬ ПО ДокТовары.Номенклатура
А затем установить параметр в тексте запроса: Запрос.УстановитьПараметр(«&Контрагент», ВыбКонтрагент); Запрос.УстановитьПараметр(«&Период», Дата);
13. В универсальных запросах параметры можно использовать в описании источников данных запроса, в условиях ГДЕ, в условиях соединения таблиц и параметрах виртуальных таблиц. Существует два приема для создания универсальных запросов:
А) с помощью механизма конкатенации строк, добавляя в текст запроса переменные;
Пример1: ТипУпорядочивания = ?(НЕКАЯПЕРЕМЕННАЯ,"","УБЫВ"); Запрос.Текст= "Выбрать ... Упорядочить ПО Поле1 " + ТипУпорядочивания + "...";
Пример2: Запрос.Текст = "Выбрать Поле1..."; Если НЕКАЯПЕРЕМЕННАЯ = 1 Тогда Запрос.Текст = Запрос.Текст + ",Поле2 ..."; КонецЕсли;
Б)использовать параметры в различных частях запроса (например, в секции источников данных запроса), а затем метод встроенного языка - СТРЗАМЕНИТЬ(). При проектировании универсальных запросов полезно обращение к свойству объектов МЕТАДАННЫЕ(), с помощью которого можно определить название таблицы для какой-то ссылки (например, для документа будет примерно так - Ссылка.МЕТАДАННЫЕ().ИМЯ), переданной через параметр в некую универсальную процедуру.
Пример: Выбрать ДокТЧ.Номенклатура, ... ИЗ &НекийДокТЧ КАК ДокТЧ
А затем установить параметр в тексте запроса Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НекийДокТЧ", "Документ."+Ссылка.Метаданные().Имя+".Товары");
Параметры можно использовать в условиях запроса, чтобы включить опциональное условие &Параметр ИЛИ НЕ КакоеТоСвойство: Запрос.УстановитьПараметр(“&Параметр”, “Контрагент.Наименование=””Иванов”””);
С помощью литерала ИСТИНА можно убирать определенные фильтры в запросе Запрос.УстановитьПараметр(«&Параметр»,Истина);
14.Очень полезными в конструкторе запросов является команда контекстного меню таблицы - "Переименовать таблицу...", с помощью которого можно придумать некоторое обобщенное имя для источника данных. Для создания запросов к однотипным таблицам, похожим по структуре, бывает полезным для второй таблицы скопировать текст запроса первой таблицы, зайти в окно конструктора запросов и в контекстном меню таблицы выбрать пункт - Заменить таблицу... и выбрать вторую талицу.
15.При работе с созданием вложенных запросов в секциях условий или параметров виртуальных таблиц конструктора запросов используется прием выделения пробела в скобках, тогда появляется в контекстном меню пункт «Конструктор запроса», а при редактировании вложенного запроса в условии выделяют весь запрос в скобках .
Пример вложенного запроса: Товар В ( Выбрать Номенклатура ...)
16. При проектировании отчетов СКД в запросах к регистрам остатков - в качестве параметра Период удобнее и правильнее использовать выражение ДобавитьКДате(КонецПериода(Период,ДЕНЬ),СЕКУДА,1), так как остатки в виртуальных получаются на начало периода, не включая последнюю секунду. Прием +1 секунда не может быть применен с документами: по новой методике проведения документов остатки по регистру надо получать на Период, заданный объектом Граница с моментом времени документа включая (а не на дату документа +1 секунда!), а по старой методике проведения - на момент времени документа (а не на дату документа !). При анализе оборотов или данных за период удобно добавлять параметр с типом СтандартныйПериод (в этом случае не надо приводить последнюю дату интервала на конец дня). У стандартного поля «НачалоПериода» в поле «Выражение» надо прописать «&Период.ДатаНачала». А у стандартного поля «КонецПериода» в поле «Выражение» прописать «&Период.ДатаОкончания». Очень много полезной информации по языку запросов можно найти не в синтакс-помощнике, а в полной справке конфигуратора 1С 8.2 (кнопка F1)
17.Функция запроса ЕстьNull (удобнее писать англоязычный вариант IsNull) обычно используется для избавления от значений типа Null для числовых полей запроса. В ряде случаев, например полного соединения двух таблиц функция IsNull (Параметр1,Параметр2) может с успехом заменить конструкцию ВЫБОР КОГДА ... ТОГДА ..ИНАЧЕ ….КОНЕЦ, когда для какого-либо поля значения NULL могут быть как в первой таблице, так и во второй (такая конструкция позволяет получать не Null значение для поля). Но надо помнить, что в отличие от условного оператора ВЫБОР функция ЕстьNull приводит тип второго аргумента к типу первого аргумента, что нужно учитывать, если типы аргументов отличаются!
Пример: IsNull(Рег.Остаток,0) IsNull(Док.Товар,Док1.Номенклатура)
18. У условной конструкции ВЫБОР есть альтернативный синтаксис для простого случая проверки равенства определенному значению, но, правда, он недокументированный: Выбор Выражение Когда 1 Тогда «Высший» Когда 2 Тогда «Средний» Иначе «Низший» Конец
19.Оператор проверки значения на NULL Eсть Null (Можно рекомендовать использовать англоязычный вариант Is Null). Такая конструкция появилась потому, что любая операция сравнения двух величин, хотя бы одно из которых Null, всегда ложь. Написать Где Наименование = Null неправильно. Интересна также форма отрицания данного оператора Не Есть Null - неправильно, а правильно Есть Не Null или форма Не (Поле1 Есть Null) - это существенное отличие от всех операторов, использующихся совместно с оператором Не.
20. Иногда полезна форма оператора В для проверки совпадения с одним из перечисленных значений.
Пример: ...Где Товар.Наименование В ("Бытовая техника","Компьютеры")
Для справочников может быть полезна форма оператора В проверки принадлежности по иерархии.
Пример: ...Где Номенклатура В ИЕРАРХИИ (&Группа)
Оператор В часто используется для проверки вхождения значения в результат вложенного запроса.
Пример: ...Где Номенклатура.Ссылка В (Выбрать Номенклатура.Ссылка ...).
Во вложенном запросе можно обращаться к полям внешнего запроса в условии.
Пример: // Выбрать названия товаров, которые присутствовали // в расходных накладных ВЫБРАТЬ Товары.Наименование ИЗ Справочник.Номенклатура КАК Товары ГДЕ Товары.Ссылка В (ВЫБРАТЬ РасходнаяНакладнаяСостав.Номенклатура ИЗ Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав ГДЕ РасходнаяНакладнаяСостав.Номенклатура = Товары.Ссылка)
Операция В может использоваться с массивами, списками значений, таблицами значений, вложенными запросами. При этом возможно сокращение условий
Синтаксис для вложенного запроса (выражение1, выражение2,...,выражениеN) В (Выбрать выражение1, выражение2,...,выражениеN ...)
Синтаксис для таблицы значений (выражение1, выражение2,...,выражениеN) В (&ТЗ), где в таблице значений ТЗ используются N первых колонок
20. В интернете есть шутка по поводу того, как конструктор запроса постоянно делает ЛЕВОЕ соединение таблиц (и меняет их местами), как бы мы не указывали ПРАВОЕ: 1С:Предприятие любит «налево».
21. Сложные запросы удобно отлаживать в консоли запросов. Существует их в интернете много. После отладки запроса его можно скопировать и в конструкторе запроса есть замечательная кнопка «Запрос», куда можно вставить его в том же виде и сохранить (раньше была только возможность скопировать в конфигураторе и сделать форматирование запроса посредством символа переноса строки). В окне, которое открывается при нажатии кнопки «Запрос», можно редактировать запрос и смотреть результат выполнения, что довольно удобно.
22.При проектировании отчетов СКД нужно помнить, что если нужно обеспечить фильтрацию по некоторому полю, необязательно добавлять параметр в текст запроса. У конструктора запросов есть вкладка «Компоновка данных», где можно добавлять параметры в условия. Кроме того, на уровне отчета СКД есть закладка условия, где можно добавлять произвольные условия и сохранять в быстрых настройках. В таком случае условия будут универсальными (равенство, неравенство, принадлежность, вхождение в список и т.д.).
23. При работе с документами бывает нужно добавить сортировку по виртуальному полю таблицы МОМЕНТВРЕМЕНИ, но вот незадача - во вложенных запросах сортировка по этому полю правильно не работает. Помогают танцы с бубнами: сортировка по виртуальному полю МОМЕНТВРЕМЕНИ заменяется на две сортировки: по дате и по ссылке. Также решить проблему можно через временную таблицу переносом вложенного запроса в отдельный запрос. На протяжении уже многих релизов данная фича или баг не исправлена.
Пример неправильно работающего запроса, получающего последний проведенный документ по указанному контрагенту (вернее, табличную часть документа): ВЫБРАТЬ РасходнаяТовары.Ссылка, РасходнаяТовары.НомерСтроки, РасходнаяТовары.Товар, РасходнаяТовары.Количество, РасходнаяТовары.Цена, РасходнаяТовары.Сумма ИЗ Документ.Расходная.Товары КАК РасходнаяТовары ГДЕ РасходнаяТовары.Ссылка В (ВЫБРАТЬ ПЕРВЫЕ 1 Д.Ссылка ИЗ Документ.Расходная КАК Д ГДЕ Д.Ссылка.Проведен И Д.Контрагент = &Контрагент УПОРЯДОЧИТЬ ПО Д.Ссылка.МоментВремени УБЫВ)
Возможные решения:
A) Заменить на УПОРЯДОЧИТЬ ПО на УПОРЯДОЧИТЬ ПО Д.Дата УБЫВ УПОРЯДОЧИТЬ ПО Д.Ссылка УБЫВ
Б) Можно перенести вложенный запрос во временную таблицу: ВЫБРАТЬ ПЕРВЫЕ 1 Д.Ссылка ПОМЕСТИТЬ ТЗСсылка ИЗ Документ.Расходная КАК Д ГДЕ Д.Ссылка.Проведен И Д.Контрагент = &Контрагент УПОРЯДОЧИТЬ ПО Д.Ссылка.МоментВремени УБЫВ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РасходнаяТовары.Ссылка, РасходнаяТовары.НомерСтроки, РасходнаяТовары.Товар, РасходнаяТовары.Количество, РасходнаяТовары.Цена, РасходнаяТовары.Сумма ИЗ Документ.Расходная.Товары КАК РасходнаяТовары ГДЕ РасходнаяТовары.Ссылка В (ВЫБРАТЬ Т.Ссылка ИЗ ТЗСсылка КАК Т)
В) Можно обратиться к основной таблице документа, а уже затем к табличной части ВЫБРАТЬ ПЕРВЫЕ 1 Расходная.Ссылка, Расходная.Товары.( Ссылка, НомерСтроки, Товар, Количество, Цена, Сумма ) ИЗ Документ.Расходная КАК Расходная ГДЕ Расходная.Контрагент = &Контрагент И Расходная.Проведен УПОРЯДОЧИТЬ ПО Расходная.МоментВремени УБЫВ
24. При обращении к главной таблице документа(справочника) можно в условии обратиться к данным подчиненной таблицы (табличной части). Такая возможность называется разыменование полей табличной части. В качестве примера задачи можно привести задачу поиска документов, содержащих в табличной части определенный товар.
Пример: Выбрать Приходная.Ссылка ИЗ Документ.Приходная Где Приходная.Товары.Номенклатура = &Номенклатура.
Преимущество этого запроса перед запросом ко вложенной таблице Приходная.Товары в том, что если есть дубли в документах , результат запроса вернет только уникальные документы без использования ключевого слова РАЗЛИЧНЫЕ.
Сравните: Выбрать Различные Товары.Ссылка ИЗ Документ.Приходная.Товары как Товары Где Товары.Номенклатура = &Номенклатура.
На этом месте, пожалуй, всё. Понятно, что в языке запросов ещё много неосвещенных мной вопросов. Для написания статьи была использована информация, полученная мной после прохождения базового курса 1С 8.2 spec8.ru, а также из книги «1С 8.2 Руководство разработчика» и просторов интернета.
Всем спасибо!
Автор: fpat
Обработка демонстрирует возможности интеграции 1С с картографическими сервисами, в ней поддерживается работа трех поставщиков услуг / карт — Яндекс, Google. Рамблер.
Автор: Діма Головаченко - http://smaylukk.com.ua
но так вот сама обработка + еще 2 : Скачивать файлы может только зарегистрированный пользователь!
В данной статье рассматривается способ программного формирования HTML документа, содержащего ссылки на объекты базы данных 1С, такие как справочники, документы и т.д. Показан пример построения обработчика события OnClick ПоляHTMLДокумента, для обработки клика на html-ссылке.
Предисловие
Однажды, дописывая обработку, создающую и модифицирующую, не суть важно какие документы, я подумал, что неплохо было бы вывести для пользователя некое резюме:
“Создан документ такой-то”
“Изменен документ такой-то” и т.д.
От обычного, в таких случаях, вывода информации в окно сообщений я сразу отказался, так как не удобно это, сначала читать в окне сообщений “Создан документ … ” а потом запоминать его номер, открывать соответствующий журнал (или форму списка) и искать там этот документ. А если документов много и пользователь хочет посмотреть все документы?(или выборочно) Насколько это неудобно я убедился при отладке обработки …
То, что в форме есть элемент управления именуемый ПолеHTMLДокумента я конечно знал, но вот представилась возможность познакомиться с ним поближе. Было решено реестр обработанных документов выводить в виде html документа содержащего ссылки на эти самые документы, а по клику на ссылке открывать форму соответствующего документа. Здесь мне многие могут возразить: “А почему бы для этих целей не использовать обычный макет, выводимый в табличный документ, а для открытия документов использовать расшифровку? И чем Ваш способ лучше?” Отвечаю: Конечно можно использовать, и мой способ ничем не лучше. Он просто другой. Ведь у хорошего программиста для решения одной задачи должно быть в арсенале несколько инструментов.
Итак, перейдем от слов к делу, в рамках данной статьи рассмотрим следующую задачу: Сформировать html-документ, содержащий ссылки на элементы справочника номенклатура, по клику требуется открывать форму соответствующего элемента. Создаем новый отчет, его форму, на форме размещаем элемент управления ПолеHTMLДокумента.
Текст модуля формы:
Ну вот html мы сформировали, теперь чтобы ссылки “ожили” надо написать обработчик события OnClick элемента управления ПолеHTMLДокумента.
Всё можно пробовать!
Заключение
Обратите внимание что ссылку я формировал следующим образом:
<ИмяОбъектаМетаданных>-<УникальныйИдентификатор> это сделано для того, чтобы в обработчике onclick можно было определить к какому объекту метаданных относится данный УникальныйИдентификатор, потому что имея ТОЛЬКО УникальныйИдентификатор невозможно определить к какому объекту метаданных он относиться. Точнее возможно, но уж слишком долго и неудобно – путем перебора всех метаданных в цикле, для каждого объекта метаданных выполнять попытку <ОбъектМетаданных>.ПолучитьСсылку(Новый УникальныйИдентификатор(НашУникальныйИдентификатор))
Хотя в нашем примере только один справочник, и указывать его вид было необязательно, и так понятно что это УникальныйИдентификатор элемента справочника Номенклатура, но вдруг Вам потребуется работать с несколькими справочниками, вот тут то мой способ задания ссылки Вам и пригодится. Скачивать файлы может только зарегистрированный пользователь!
P.S. Платформа 8.2 имеет встроенный механизм работы со ссылками на объекты БД и данная задача наверняка упростится, но это уже другая тема.
Источник: obrabotki.com