d9e5a92d

Если пользователь указал несколько дат в поле календаря - как их перебрать?

Если элемент управления ПолеКалендаря имеет режим выделения даты Множественный, пользователь может выделить несколько дат на календаре:

Если пользователь указал несколько дат в поле календаря - как их перебрать?


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

КоллскцияДат — ЭлсмснтыФормы.ПолсКалендаря.ВыделеннысДаты

Для каждого ДатаКалендаря из КоллекцияДат Цикл Сообщить; Дата Календаря):

КонецЦикла:

Как видите, свойство поля календаря ВыделенНЫвДаты содержит коллекцию указанных пользователем дат.

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



Элемені мФормы.ПолеКалсмларя.Режим Выделения = РежимВыделенияДаты

.Множественный;

В данном случае значение свойству было назначено из системного перечисления РежимВыделенияДаты.

® Как организовать работу с индикатором?

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

Индикатор.

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

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

Например, так:

Выборка = РезультатЗапроса.Выбрать();

Индикатор = ЭлементыФормы.ИндикаторПеребора: Мндикатор.МаксиматьноеЗначенне = Выборка. Количество;); Индикатор.Значенне = О;

Пока Выборка.Следующий() Цикл Индикатор.Значение = Индикатор.Значенне + 1;

КонецЦикла:

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

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

Выборка = РезультатЗапроса.ВыбратьО;

Индикатор = ЭлементыФормы.ИндикаторПеребора; Индикатор.МаксимальноеЗначение = Выборка.Количество(); Индикатор.Значение = 0;

Иидикатор.ОтображатьПроценты = Истина;

Индикатор.С'тильОтображсния - РежимСглаживанияИн.ти кагора. Прерывистый Индикатор.Ориентация = Ориентация.Вертикально;

Индикатор.Шаг = 0.1;

Пока Выборка.СледующийО Цикл Индикатор.Значение = Индикатор.Значение + I;

КонецЦикла;

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

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

Предположим, что существует форма, у которой есть два реквизита:

СписокКонтрагентов

СправочникСписок.Контрагенты);
(тип
Спис окНоменклатуры

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

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

Процедура КнопкаВыполмнтьНажатие(Элемент)

ЭлементыФормы.ТП.Данные = "СписокКонтрагентов" ЭлементыФормы.ТП.СоздатьКолонкиО;

КонецПроцедуры_

Следующая процедура «переключит» табличное поле в «режим» работы со справочником «Номенклатура».

Процедура Номенклатура! Кнопка)

ЭлементыФормы.ТП.Данные = “СписокНоменклатуры"; ЭлементыФормы.ТП.СоздатьКолонкиО;

КонецПроцедуры

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

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

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

Если пользователь указал несколько дат в поле календаря - как их перебрать?


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

Если пользователь указал несколько дат в поле календаря - как их перебрать?


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

Если пользователь указал несколько дат в поле календаря - как их перебрать?


Аналогичного результата можно добиться программным способом:
ЭлементыФормы.ПолеВводаІ. Формат = ”ДП='01.01.0001'";
// Или

ЭлементыФормы.ПолеВводаІ.Формат = "ДП='00:00:00"’:
// Или
ЭлементыФормы.ПолеВводаІ.Формат = "ДП='01.01.0001 00:00:00"';

ф Как вывести текст в поле картинки в том случае, если картинка не выбрана?

Для этого следует использовать свойство

ТекстНевыбраннойКартинки элемента управления ПолеКартинки.

Его можно задать при конфигурировании:

Если пользователь указал несколько дат в поле календаря - как их перебрать?


или программно:

Элементы Формы.ОсиовііоеИіображение.ТекстНевыбраннойКартинки = _"фотография номенклатуры отсутствует

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

Если пользователь указал несколько дат в поле календаря - как их перебрать?


ф Как открыть пользователю стандартный диалог выбора цвета?

Для работы со стандартным диалогом выбора цвета предназначен объект ДиалогВыбора Цвета. Организовать выбор цвета пользователем можно с помощью следующего кода:

Диалог = Новый Диалоі ВыбораЦвста:

Если Диалог.ВыбратьО Тогда ВыбранныйЦвет = Диалог.Цвет; КонсцЕслн;

Аналогичным образом организуется и выбор шрифта при помощи стандартного диалога (используется объект ДиалогВыбораШрифта):

Диалог = Новый ДиалогВыбораШрифта:

Если Диалог.ВыбратьО Тогда ВыбранныйШрифт = Диалог.Шрифт; КонецЕсли;

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

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

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

Запрос = Новый ЗапросС |ВЫ БРАТЬ

I Номенклатура.Сеылка КАК Значение,

I Номенклатура.Представление КАК Представление.

I ИСТИНА КАК Пометка |ИЗ

I Сиравочннк.Номенклатура КАК Номенклатура |ГДЕ

I Номенклатура.ОсновнойПоставщик = &ОсновнойПоставщик”);

Запрос.УстановитьПараметрІ "ОсновнойПоставщик", ПолеПоставшнк);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.СледуюшийО Цикл

ЗаполнитьЗначенияСвойств(ПолеСписка.Добавить(). Выборка): КонецЦикла;

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

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

Схема = Новый ГрафическаяСхсмаО; CxeMa.npo4HTaTb(''D:/MyScheme,grs");

ЭлементыФормы.СтруктурнаяСхема.УстановитьСхему(Схеча):

Интерфейсы, стили

CD Как задать различные стили 1С:Предприятиядля различных категорий пользователей?

Для этого следует воспользоваться свойством глобального контекста

ГлавныйСгиль:

ОсновнойИнтерфейс = ПольтователиИнформанионнойБазы .ТекуіцийПользовательІ) .ОсновнойИнтерфейс .Имя;

Если ОсновнойИнтерфейс = "ИнтерфейсКассира" Тогда ГлавныйСтиль = БиблиотекаСтилей.СтильКассира;

ИначеЕсли ОсновнойИнтерфейс = "Планирование" Тогда

ГлавныйСтиль = БиблиотекаСтилей.СтильПланирования;

Иначе

ГлавныйСтиль = БиблиотекаСтилей.Основной; КонецЕсли;

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

события приложения Перед началом работы системы).

Есть список имен интерфейсов с пометками. Как сделать помеченные интерфейсы видимыми?

СтрокаИменИнтерфейсов =

Для Каждого ИмяИнтерфейса ич СписокИнтерфесов Цикл Если ИмяИнтерфейса.Пометка Тогда

СтрокаИменИнтерфейсов = СтрокаИменИнтерфейсов + ИмяИнтерфейса + КонецЕсли:

КонецЦикла;

ГлавныйНн юрфейс.І ІсрсключитьИнтсрфсйс(СтрокаИ мен Интерфейсов):

Создаем строковую переменную «СтрокаИменИнтерфейсов» для указания через запятую имен помеченных интерфейсов.

В цикле перебора списка заполняем ее.

Посредством свойства глобального контекста Главный Интерфейс требуем снять видимость всех интерфейсов и включить видимость только тех, чьи имена перечислены в строковой переменной «СтрокаИменИнтерфейсов».

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

Как из формы обработки отключить глобальный обработчик ожиданий?

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

Например, подключение:

11роцсдура ГІрнІІача іеРаботыСистемы() ПодключитьОбработчикОжішаішяСПронеркаОпроса", 60);

КонецПроцедуры

Отключение - в процедуре модуля приложения:

Процедура ОткачОтОпросаО Экспорт ОтключитьОбработчикОжиданияС'ПроиеркаОпроса’'); КонецПроцедуры

А в форме обработки - вызов процедуры:

ОткатОтОпросаі >

Поскольку процедура «ОтказОтОпроса» в модуле приложения написана с указанием ключевого слова Экспорт - управление будет передано на нее, и в результате - добьемся желаемого.

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

Запросы

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

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

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

ВЫБРАТЬ РАЗЛИЧНЫЕ

РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ

Документ.РсализацияТоваровУ слуг .Товары КАК РеализацияТоваровУслугТовары

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

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

Кроме того, поскольку одна и та же товарная позиция, естественно, могла присутствовать и не один раз в документах - применяем РАЗЛИЧНЫЕ для получения только различных строк в выходной таблице запроса.

В результате получим таблицу вида:

_Номенклатура_

Женские ботфорты коричневые_

Ботинки женские демисезонные_

Ботинки женские натуральная кожа_

Женские босоножки_

Комбайн кухонный B1NATONE FP 67_

Кофеварка BRAUN KF22R_

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

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

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

ВЫБРАТЬ РАЗЛИЧНЫЕ

РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ИТОГИ ПО

Номенклатура ТОЛЬКО ИЕРАРХИЯ_

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

Выходным полем объявляем поле «Номенклатура», входящее в состав таблицы источника, применяем РАЗЛИЧНЫЕ для получения только различных значений в выходной таблице запроса.

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

Если иерархию результата запроса отображать при помощи отступов, получится следующее:

Если пользователь указал несколько дат в поле календаря - как их перебрать?


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

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

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

При решении данной задачи опять же необходимо иметь в виду, что один и тот же товар мог встречаться в документах не один раз. Однако если и на этот раз применить РАЗЛИЧНЫЕ, то получим в результате только различные строки. То есть один и тот же товар может встречаться в комбинациях с разным количеством:

Номенклатура Количество
Женские ботфорты коричневые 1,000
Женские ботфорты коричневые 3,000
Женские ботфорты коричневые 10,000
Ботинки женские демисезонные 1,000
Ботинки женские демисезонные 2,000
Ботинки женские натуральная кожа 1,000
Ботинки женские натуральная кожа 2,000
Поэтому для решения нашей задачи необходимо воспользоваться операцией СГРУППИРОВАТЬ ПО с вычислением агрегатной функцией СУММА() по полю «Количество»:

ВЫБРАТЬ

РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура. СУММА(РеалнзацияТоваровУслугТовары.Количество) КАК Количество ИЗ

Доку мент. Реал изацияТоваровУ слуг.Товары КАК РеализацияТоваровУслугТовары

СГРУППИРОВАТЬ ПО РеализацияТоваровУслугТовары. Номенклатура

Групповым полем указано поле «Номенклатура». В результате получим таблицу вида:

Номенклатура Количество
Женские ботфорты коричневые 49
Ботинки женские демисезонные 6
Ботинки женские натуральная кожа 6
Женские босоножки 19
Комбайн кухонный BINATONE FP 67 13
Кофеварка BRAUN KF22R 6
Замечание: при помощи СГРУППИРОВАТЬ ПО результат запроса сворачивается (сжимается) «вокруг» групповых полей. Просто говоря -записей будет меньше, нежели без применения данного предложения.

Кроме того, для правильного применения СГРУППИРОВАТЬ ПО все выходные поля должны быть или групповыми, или результатами вычисления агрегатных функций.

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

Если к вышеприведенному примеру (Как из табличной части «Товары» документов «РеализацияТоваровУслуг» получить все номенклатурные позиции с суммированием количества?) добавить еще условие выводить только те записи, где просуммированное количество больше 10, тогда текст запроса выглядел бы так:

ВЫБРАТЬ

РеашпацияТоваровУслугТовары.Номенклатура КАК Номенклатура,

СУ ММ АСРеализацняТоваровУслутТовары. Количество) КАК Количество ИЗ

Документ. Реал изацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

СГРУППИРОВАТЬ по РеализацияТоваровУслугТовары. Номенклатура ИМЕЮЩИЕ

СУММА(РеализацияТоваровУелугТовары.Количество) > 10

Для реализации условия отбора на значения агрегатных функция применяется предложение ИМЕЮЩИЕ. В результате получим таблицу вида:

Номенклатура Количество
Женские ботфорты коричневые 49
Женские босоножки 19
Комбайн кухонный BINATONE FP 67 13
Замечание: не путайте с условием ГДЕ. Это условие налагается на исходные записи. В результате, если бы не было ни одного из документов, где количество товара в строке больше 10 - результатом запроса была бы пустая таблица.

Как ограничить выборку из виртуальной таблицы?

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

ВЫБРАТЬ

ПродажиОбороты.Номенклатура КАК Номенклатура ИЗ

РегистрНакопления.Продажи.Оборотыі&ДатаНач, &ДатаКон) КАК ПродажиОбороты

В качестве источника выбираем таблицу

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

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

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

Например, требуется получить информацию о продажах товаров с подведением итогов по объемам продаж подразделениями:

Подразд. Номенклатура Кол-во

Оборот
Стоимость

Оборот
Отдел оптовой пр одажи 58 167,12
Отдел оптовой пр одажи Женские ботфорты кор

ичневые
49,000 4 430,39
Отдел оптовой пр одажи Ботинки женские деми

сезонные
6,000 246,69
Отдел оптовой пр одажи Ботинки женские натур

альная кожа
6,000 320,44
Отдел оптовой пр одажи Женские босоножки 19,000 1 028,23
Отдел оптовой пр одажи Комбайн кухонный BI 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
Поскольку в оборотном регистре «Продажи» есть измерения «Номенклатура» и «Подразделение», решить задачу можно посредством следующего запроса:

ВЫБРАТЬ
ПродажиОбороты.Подразделение КАК Подразделение. ПродажнОбороты.Номенклатура КАК Номенклатура. ПродажиОбороты.КоличествоОборот,
ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот
ИЗ
Реі исгрНакопления.Продажи.Оборогы((&ДатаНач, &Да га Кон)
КАК ПродажиОбороты
ИТОГИ СУММА(СтоимостъОборот) НО
Подразделение
В качестве источника используем виртуальную таблицу регистра с указанием временных параметров для ограничения интервала сбора оборотов продаж.

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

Для того, чтобы добавить промежуточные итоги по полю «Подразделение» используем ИТОГИ ПО. Причем для итоговых записей применяем агрегатную функцию СУММА() для поля «СтоимостьОборот».

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

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

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

ВЫБРАТЬ

ПродажиОбороты.Подразделение КАК Подразделение.

ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.КоличествоОборот.

ПродажиОбороты.СтоимостьОборот КАК СтонмостьОборот ИЗ

РегистрНакоиления.Продажи.Обороты(&ДатаНач.

&ДатаКон,,

Подразделение = &Подразделение)

КАК ПродажиОбороты

ГДЕ

ПродажиОбороты.КоличествоОборот > &Порог_

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

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

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

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

Поскольку справочник «Договора» явл5*ется подчиненным справочнику «Контрагенты», то по сути дела идет речь о получении данных в разрезе владельцев договоров, попавших в данные регистра.

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

ВЫБРАТЬ

ПродажиОбороты .ДоговорКонтратента.Владелец. ПродажиОбороты.КолнчествоОборот.

ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот ИЗ

РегистрНакопления. Продажи. Обороты(&ДатаНач, ДДатаКон) КАК ПродажиОбороты

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

ВЫБРАТЬ

ПродажиОбороты .ДоговорКонтрагента. Владелец,

СУММА(ПродажнОбороты.КоличествоОборот) КАК КоличествоОборот. СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот ИЗ

РегистрНакопления.Продажи.ОборотыК&ДатаНач, &ДатаКон)

КАК ПродажиОбороты

СГРУППИРОВАТЬ НО

ПродажиОбороты.ДоговорКонтрагента.Владелец

Как объединить результаты нескольких запросов?

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

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

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

ВЫБРАТЬ РАЗЛИЧНЫЕ

РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ

Документ.РеализацняТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ

РеализацияТоваровУслугВозвратнаяТара. Номенклатура ИЗ

Документ. Реал изацияТоваровУ слуг. ВозвратнаяТ ара КАК РеализацияТоваровУслугВозвратнаяТара

ОБЪЕДИНИТЬ ВЫБРАТЬ РАЗЛИЧНЫЕ Реал изацияТоваровУ слугУслуги.Номенклатура ИЗ

Докумснт.РеализацияТоваровУслуг.Услуги КАК РеализаиняТоваровУслугУслуги

Получаем по табличной части «Товары» документа записи с различными значениями поля «Номенклатура», далее объединяем их с аналогично полученными записями по остальным табличным частям. Из-за того, что применили ОБЪЕДИНИТЬ Е СЕ в

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

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

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

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

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

Данные о товарах, заказанных покупателями, хранятся в регистре остатков « Заказы П оку пате л ей ».

Данные о товарах, заказанных поставщикам, хранятся в регистре остатков «ЗаказыПоставщикам».

Необходимо получить таблицу вида:

Номенклатура Заказано

Покупателями
Заказано

Поставщикам
Ботинки женские демисезонные 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
Поскольку речь идет о получении данных по товарным позициям, находящихся в остатках и одной и другой таблицы - решить задачу можно за счет применения внутреннего соединения таблиц источников:

ВЫБРАТЬ

ЗаказыПокупателейОстатки.Номенклатура.

ЗаказыПокупатслейОстатки.КоличествоОстаток КАК ЗаказаноПокупатслями, ЗаказыПоставщикамОстатки.КолнчествоОстаток КАК ЗаказамоПоставщикам ИЗ

РегистрНакоплен ия. Заказы! Іокупателей.Остатки(&Дата(>тч)

КАК ЗаказыПокупателейОстатки ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакоплення .Заказы Поставщикам .Остаткн(&ДагаОтч)

КАК ЗаказыПоставщикамОстатки ПО

ЗаказыПокупателейОстатки.Номенклатура =

ЗаказыПоставщикамОстатки.Номенклатура

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

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

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

Например, требуется получить количественные данные о товарах, заказанных покупателями, с информацией о том, в каком количестве они заказаны поставщикам (и заказаны ли вообще).

Данные о товарах, заказанных покупателями, хранятся в регистре остатков «ЗаказыПокупателей».

Данные о товарах, заказанных поставщикам, хранятся в регистре остатков «ЗаказыПоставщикам».

Необходимо получить таблицу вида:

Номенклатура Заказано

Покупателями
Заказано

Поставщикам
Женские ботфорты коричневые 9,000
Ботинки женские демисезонные 20,000 180,000
Ботинки женские натуральная кожа 12,000 120,000
Женские босоножки 13,000 140,000
Комбайн кухонный BINATONE FP 67 1,000 150,000
Кофеварка BRAUN KF22R 4,000 150,000
Вентилятор оконный 13,000
Вентилятор OPBHTA,STERLING,Hn. 6,000
Данную задачу можно решить за счет применения левого внешнего соединения данных источников в запросе:

ВЫБРАТЬ

ЗаказыПокупателейОстатки.Помснклатура,

ЗаказыПокупателейОстаткн.КоличествоОстаток КАК ЗаказаноПокупателями. ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставшикам ИЗ

РепістрНакопления.ЗаказыПокупателей.Остатки(&ДатаОтч)

КАК ЗаказыПокупателейОстагки ЛЕВОЕ СОЕДИНЕНИЕ

РегистрНакоіілеиия.ЗаказыПоставщикам.Остатки(&Да гаОтч)

КАК ЗаказыІ ІосгавшикамОстатки ПО

ЗаказыПокупателейОстатки Номенклатура =

ЗаказыІІоставщикамОстатки.Номенклатура

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

Как объединить данные из двух таблиц по определенному условию?

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

Данные о товарах, заказанных покупателями, хранятся в регистре остатков «ЗаказыПокупателей».

Данные о товарах, заказанных поставщикам, хранятся в регистре остатков «ЗаказыПоставщикам».

Необходимо получить таблицу вида:

Номенклатура Заказано

Покупателями
Заказано

Поставщикам
Женские ботфорты коричневые 9,000
Ботинки женские демисезонные 20,000 180,000
Ботинки женские натуральная кожа 12,000 120,000
Женские босоножки 13,000 140,000
Комбайн кухонный BINATONE FP 67 1,000 150,000
Кофеварка BRAUN KF22R 4,000 150,000
Вентилятор оконный 13,000
Вентилятор OPBHTA,STERLING,Hn. 6,000
Кроссовки мужские, кожа 10,000 100,000
Кофеварка JACOBS (Австрия) 150,000
Полусапожки на шнурках 100,000

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

ВЫБРАТЬ

ВЫБОР

КОГДА (ЗаказыПокупателейОстатки.Номенклатура) ЕСТЬ NULL ТОГДА ЗаказыПоставщикамОстатки.Номенклатура ИНАЧЕ

ЗаказыПокупателейОстатки.Номенклатура КОНЕЦ КАК Номенклатура.

ЗаказыПокупателейОстатки.КоличествоОстаток КАК ЗаказаноПокупателями. ЗаказыПоставщикамОстатки.КоличествоОстаток КАК ЗаказаноПоставщикач ИЗ

РетистрНакопления.ЗаказыПокуиателей.Остатки(&ДатаОтч)

КАК ЗаказыПокупателейОстатки ПОЛНОЕ СОЕДИНЕНИЕ

РегистрНакопления.ЗаказыПоставшикам.Остатки(&ДатаОтч)

КАК ЗаказыПоставщикамОстатки ПО

ЗаказыПокупателейОстатки. Номенклатура =

ЗаказыПоставщикамОстатки.Номенклатура

Обратите внимание, пришлось поле «Номенклатура» формировать данными другой таблицы-источника для случаев, когда товар только заказывался поставщику, но не заказывался покупателями.

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

ВЫБРАТЬ
ВложенныйЗапрос. Номенклатура,

СУММ А(ВложенныйЗапрос.ЗаказаноПокупателями) КАК
ЗаказаноПокупателями,
СУММАфложеннынЗапрос.ЗаказаноПоставщикам) КАК ИЗ ЗаказаноПосгавщикам
(ВЫБРАТЬ
ЗаказыПокунателейОстаткн. Номенклатура КАК Номенклатура. ЗаказыГІокупателейОстаі ки.КолнчествоОстаток КАК ЗаказаноПокупателями,
0 КАК ЗаказаноПоставщикам

ИЗ
РепістрН акоплен ии. Заказы Покупателей.Остатки* ЛДатаОтч,)
КАК ЗаказыПокупателейОстатки

ОБЪЕДИНИТЬ

ВЫБРАТЬ

ЗаказыПоставщикамОстатки.Номенклатура,

0,

ЗаказыПоставщикамОстатки.КоличествоОстаток

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

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

Чтобы свернуть эту таблицу - делаем запрос по таблице вложенного запроса и выполняем СГРУППИРОВАТЬ ПО по полю «Номенклатура», суммируя данные числовых колонок.

Как вывести некоторое значение вместо NULL взапросе?

Для этого можно использовать функцию языка запросов ECTbNULLQ, которая возвращает значение своего первого параметра в случае, если он не равен NULL, и значение второго параметра в противном случае:

ВЫВРАТЬ

ЕСТЫМ1ЛХ(Справочник. Номенклатура. Артикул, "—") КАК Артикул, Сііравочник.Номенклатура.Представление КАК Номенклатура

Артикул Номенклатура
hH-150003 Ботинки мужские
П-130002 Полусапожки на шнурках
18009 Петр!
Арт-88888 Сахарный песок
Арт-4444 Юбилейное (печенье)
Арт-8ЭЭЭЭ Крупа манная
Арт-89000 Крупа гречневая
Инвентарь
Вилы
Услуги
Расходы на рекламу
Расходы на ремонт
Молочные

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

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

Номенклатура Сумма

продаж
Процентная

доля
Яблоки 500 50
Груши 350 35
Бананы 100 10
Манго-манго 50 5
Причем строки таблицы должны быть отсортированы по убыванию процентной доли.

Решение данной задачи может быть таким:

ВЫБРАТЬ
ПролажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.СуммаОборот КАК СучмаПродаж.
ПродажиОбороты.СуммаОборот / СовокунныеОбороты.СуммаОборот * 100
КАК ПроцентнаяДоля
ИЗ
РегиетрНакоплсння.Продажи.Обороты(&ДатаНач, &ДатаКон)
КАК ПродажиОбороты

ВНУТРЕННЕЕ СОЕДИНЕНИЕ
РегистрНакопления.Иродажн.Обороты(&ДатаНач. &ДагаКон)
КАК СовокупныеОбороты
ПО ИСТИНА
УПОРЯДОЧИТЬ по
ПроцентнаяДоля УБЫВ
Сами данные получаем из виртуальных таблиц «РегистрНакопления.Продажи.Обороты». При построении запроса сложностью является получение в каждой записи сразу и значения «СтоимостьОборот» конкретной номенклатурной позиции, и совокупного значения «СтоимостьОборот» по всем номенклатурным позициям.

Эта проблема решается посредством внутреннего соединения двух виртуальных таблиц «РегистрНакопления.Продажи.Обороты».

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

Поле «ПроцентнаяДоля» каждой записи заполняется по формуле:

Процентная доля = СуммаПродаж/СовокупныйОборот * 100.

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

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

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

Номенклатура Остатки на складе (шт)
КОЛГОТКИ 1120
Sanpellegrino 420
Артикул 123456 (черные) 120
Артикул 123457 (капучино) 300
Sonata+ 700
Артикул 773456 (черные) 700
Артикул 774321 (черные)
Требуется получить данные в виде таблицы следующего вида:

Оптимально по скорости данное действие выполняется при помощи запроса. Например, со следующим текстом:

ВЫБРАТЬ

ТоварыГруппы.Ссылка КАК Номенклатура,

ТоварыНаСкладахОстатки.КоличествоОстаток КАК КолнчествоОстаток ИЗ

(ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка ИЗ

Справочник.Номенклатура КАК Номенклатура ГДЕ

Номенклатура.Родитель В ИЕРАРХИИ(&Группа)

И

(Номенклатура.ЭтоГруппа = ЛОЖЬ)

) КАК ТоварыГруппы

ЛЕВОЕ СОЕДИНЕНИЕ

РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментПолучения,

Номенклатура В ИЕРАРХИИ (&Группа))

КАК ТоварыНаСкладахОстатки

ПО ТоварыГ руппы.Ссылка = ТоварыНаСкладахОстатки.Номенклатура

ИТОГИ СУММА(КоличествоОстаток) ПО Номенклатура ТОЛЬКО ИЕРАРХИЯ_

В данном запросе выполняется левое внешнее соединение двух таблиц.

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

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

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

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

Как по состоянию на заданную дату по регистру «ОстаткиНаСкладе» найти последний документ «ПоступлениеТоваровУслуг», по которому приходила номенклатура?

Сложность решения состоит в том, что из-за возможностей работать неоперативно, пользователь может формировать

«ПоступлениеТоваровУслуг» задним числом - это раз. Кроме того, в общем случае платформа позволяет формировать записи регистра с периодом, не совпадающим с датой документа..

Поэтому решать задачу следует ступенчато.

Сначала нужно найти по каждой номенклатурной позиции записи, сделанные документами «ПоступлениеТоваровУслуг» с максимальным на дату формирования отчета периодом.

Потом нужно будет найти регистраторы, породившие эти записи.

ВЫБРАТЬ

ВложснныйЗапрос. Номенклатура,

МАКСИМУМ(ТоварыМаСкладах.Регистратор) КАК Регистратор ИЗ

(ВЫБРАТЬ

ТоварыНаСкладах.Номенклатура КАК Номенклатура. МАКСИМУМ(ТоварыНаСкладах.Период) КАК Период ИЗ

РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ГДЕ

ТоварыНаСкладах.Период <= «ЬДатаОтнета И

(ТоварыНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг)

СГРУППИРОВАТЬ ПО ТоварыНаСкладах.Номенклатура ) КАК ВложенныйЗапрос

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах ПО

ВложенныйЗапрос.Номенклатура = ТоварыНаСкладах.Номенклатура И

ВложенныйЗапрос. Период = ТоварыНаСкладах.Период ГДЕ

(ТоварыНаСклатах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг;

СГРУППИРОВАТЬ по ВложеннынЗапрос. Номенклатура

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

Источник - таблица записей регистра, выходные поля — «Номенклатура» и «Период». Применяем отбор по виду регистратора (посредством операнда ССЫЛКА будем брать только те записи, где регистратор входит в таблицу «Документ.ПоступлениеТоваровУслуг») и по периоду, не превышающему «ДатаОтчета». Потом применяем группирование по полю «Номенклатура» с определением максимально из значений поля «Период».

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

Поскольку существует вероятность наличия двух или более документов «ПоступлениеТоваровУслуг» сделавших движения в одном и том же периоде - то выбираем более поздний из них для каждой номенклатурной позиции за счет СГРУППИРОВАТЬ ПО (в общем -«...в живых должен остаться только один»).

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

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

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

Например, нужно построить счетчик элементов справочника «Контрагенты» по реквизиту «ОсновнойМенеджерПокупателя» и отсортировать его по убыванию.

У элементов справочника «Контрагенты» есть реквизит «ОсновнойМенеджерПокупателя» (тип значения

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

Основной Количество
менеджер закрепленных
покупателя покупателей
Иванов 33
Батов 17
Семашко 10
Лучше всего запросом:

ВЫБРАТЬ

Контрагенты.ОсновнойМенеджерПокупателя,

КОЛИЧЕСТВО(Контраі енты.Ссылка) КАК Количествозакрепленных ИЗ

Справочник.Контрагенты КАК Контрагенты ГДЕ

(Контрагенты.^ЗгоГруппа = ЛОЖЬ)

И

(Коитрагенты.ОсновнойМенеджсрПокупателя о &НсЗаполненМснеджер)

СГРУППИРОВАТЬ ПО Контрасенты.ОсновнойМенеджерПокупателя

УПОРЯДОЧИТЬ ПО Количествозакрепленных УБЫВ

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

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

Справочники. Пользователи. ПустаяСсылкаО

Поскольку самих контрагентов показывать не нужно - применяем СГРУППИРОВАТЬ ПО. Групповым полем будет

« Контрагенты. ОсновнойМенеджерПокупателя», суммируемым

«Контрагенты.Ссылка», функция КОЛИЧЕСТВО.

В результате получим уже свернутую (сжатую) по менеджерам таблицу.

Упорядочиваем ее записи по убыванию.

Как в итоговых записях вывести количество различных записей?

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

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

Менеджер Покупатель Количество
Иванов 3
Иванов ООО «Лабан и Ко» 1
Иванов ЗАО «Шустер и сыновья» 1
Иванов Энигма Инк. 1
Батов 1
Батов Краски и Лаки 1
Таблицу можно получить запросом с использованием ИТОГИ ПО.

ВЫБРАТЬ

Контратенты.ОсновнойМенеджерПокупателя.Представление КАК ОсновнойМенеджерПокупателя, Контрагенты.Прсдставление,

1 КАК КоличествоЗакрспленных ИЗ

Справочник.Контрагенты КАК Контрагенты ГДЕ

(Контрагенты.ЭтоГруппа = ЛОЖЬ)

УПОРЯДОЧИТЬ ПО КоличествоЗакрепленных УБЫВ

ИТОГИ КОЛИЧЕСТВО) КоличествоЗакрепленных) ПО ОсновнойМенеджерПокупателя

Источник - таблица «Справочник.Контрагенты». Посредством условия отбора отбрасываем записи групп справочника.

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

Далее вводим промежуточные итоги по полю

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

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

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

Проще всего это сделать посредством выборки результата.

Результат = Запрос.ВыполнитьО;

КолЗаписей - Результат.Выбрать(),Количество():

Метод Количество () возвращает количество записей в выборке.

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

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

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



Содержание раздела