Показаны сообщения с ярлыком 1C-запросы-СКД. Показать все сообщения
Показаны сообщения с ярлыком 1C-запросы-СКД. Показать все сообщения

пятница, 24 января 2020 г.

СКД. Мощный пост


1.
Необходимо в настройках добавить системное поле "Номер по порядку" и для групп тоже (см. пример на картинке). И так для каждой группировки которую необходимо нумеровать. 


























2.

Отображение итогов (по ресурсам) на нужном уровне группировки.

Для этого разворачиваем авто поля и убираем не нужные
 Получаем:
 Снимаем флаг с ресурса


3.

Суммирование значений (или исключение из суммы- как угодно) на различных уровнях группировок.

Если кратко- в Выражении ресурса используем функцию
ВычислитьВыражениеСГруппировкойМассив

В моем отчете Затраты выражение выглядит так:
Сумма(ВычислитьВыражениеСГруппировкойМассив("СуммаОборот","Регистратор"))


Результат- исчезла суммация итогов в нижних уровнях иерархии, что искажало общий итог

О функциях языка выражений СКД подробнее- Руководство разработчика 8.3 (2015) пп. 10.3.4.11 (стр. 645)

понедельник, 29 октября 2018 г.

Перехватить формирование отчета с СКД, изменить параметры печати

Раздел: Компьютер - Windows - 1С - Готовые решения

Ответ 1
Делаешь свою кнопку и вперед.
Запрос=Новый Запрос;
Запрос.Текст="ВЫБРАТЬ
| ОстаткиТоваровОстаткиИОбороты.Склад,
| ОстаткиТоваровОстаткиИОбороты.Номенклатура,
| ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток,
| ОстаткиТоваровОстаткиИОбороты.КоличествоПриход,
| ОстаткиТоваровОстаткиИОбороты.КоличествоРасход,
| ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты КАК ОстаткиТоваровОстаткиИОбороты";
ТЗ=Запрос.Выполнить().Выгрузить();
ВнешнийНабор=Новый Структура("Наборчик",ТЗ);
// схема компановки из реквизита отчета
СКД=ЭтотОбъект.ПолучитьМакет("ЧерезНабор"); // получим схему из макета
// настройка из схемы по умолчанию
НастройкаСКД=ЭтотОбъект.КомпоновщикНастроек.Настройки; // текущие настройки
// компоновщик макета из схемы и настроек порождает макет
КомпоновщикМакетаКомпоновкиДанных=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакетаКомпоновкиДанных.Выполнить(СКД, НастройкаСКД) ;
// процессор из макета делает себя самого
ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешнийНабор);
// прцессор вывода порождает ТД
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ЭлементыФормы.Результат.Очистить();
ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.УстановитьДокумент(ЭлементыФормы.Результат);
ТД=ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.Вывести(ПроцессорКомпоновкиДанных);
ТД.Показать();

//*********************************
//А еще можно через ЭлементыФормы. Пример из "Отчета по кассе" переменные не совпадают с приведенными в примере
//*********************************

ЭлементыФормы.Результат.Очистить(); ВнешниеНаборыДанных=Новый Структура; ВнешниеНаборыДанных.Вставить("ОстаткиПоКассам",ОстаткиПоКассам); КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных; Настройки=КомпоновщикНастроек.ПолучитьНастройки(); МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки); ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,ДанныеРасшифровки); ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат); ПроцессорВывода.НачатьВывод(); Пока Истина Цикл ЭлементРезультата=ПроцессорКомпоновки.Следующий(); Если ЭлементРезультата=Неопределено Тогда Прервать; Иначе ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); КонецЕсли; КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); ////Установим параметры страницы. Или сохраним настройки //ЭлементыФормы.Результат.ОриентацияСтраницы=ОриентацияСтраницы.Ландшафт; //ЭлементыФормы.Результат.АвтоМасштаб=Истина; ЭлементыФормы.Результат.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Ж1"; // ЭлементыФормы.Результат.Показать();

Ответ 2
ПриКомпоновкеРезультата() ("живёт" в модуле объекта) для этого предназначена, и форму можно не делать.
Но вызывается она только СТАНДАРТНОЙ кнопкой
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;

ДокументРезультат.ОриентацияСтраницы=ОриентацияСтраницы.Ландшафт; ДокументРезультат.АвтоМасштаб=Истина; ДокументРезультат.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_МО";
Настройки = КомпоновщикНастроек.Настройки;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры


пятница, 2 марта 2018 г.

Четыре типа соединения таблиц в языке запросов 1С

!!!!! Соединение служит УМЕНЬШЕНИЮ ОБЪЕМА ВХОДЯЩЕЙ (ЛИШНЕЙ) ИНФОРМАЦИИ! Что выбирать- это условия и т.п..
Синтаксис соединений:
СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора>

Отсюда
Спецификации "ВНУТРЕННЕЕ" и "ВНЕШНЕЕ" ни на что не влияют (их ввели только для красоты).
А так есть четыре типа соединения : 
ВНУТРЕННЕЕ СОЕДИНЕНИЕ- берем только записи удовлетворяющие условию (ни одного флага Все в конструкторе).

ЛЕВОЕ СОЕДИНЕНИЕ- берем весь источник 
указанный слева от слова СОЕДИНЕНИЕ и присоединяем правый по условию (флаг справа от основной таблицы) 

ПОЛНОЕ СОЕДИНЕНИЕ- берем оба источника и заполняем по условию (установлены оба флага Все)

ПРАВОЕ СОЕДИНЕНИЕ (берем весь правый источник и присоединяем левый по условию)
Внимание! При создании запроса с Правым соединением при помощи конструктора или СКД, создается Левое соединение и меняется расположение таблиц (перемена мест слагаемых!).

Тип соединения в Конструкторе запроса определяется установкой флага Все справа от соединяемых таблиц (видимо Правое соединение не создается конструктором для устранения путаницы?). Справа от какой таблицы установлен флаг Все к той таблице и присоединяется другая. Если выбраны оба- ПОЛНОЕ СОЕДИНЕНИЕ, если ни одного- ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
 Условия соединения описывается в следующей секции- Условие связи.

четверг, 26 октября 2017 г.

Параметры (в т.ч. "необязательные"!) в СКД

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

После выбора необходимого поля следует войти в его редактирование и приравнять его параметру ххх = &ххх

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

понедельник, 28 августа 2017 г.

Ограничение, одним видом документов, запроса из регистра

ВЫБРАТЬ
    ТоварыОрганизаций.Номенклатура,
    ТоварыОрганизаций.СерияНоменклатуры,
    ТоварыОрганизаций.Склад,
    ТоварыОрганизаций.Количество,
    ТоварыОрганизаций.Организация,
    ТоварыОрганизаций.Регистратор
ИЗ
    РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций
ГДЕ
    ТоварыОрганизаций.Регистратор ССЫЛКА Документ.ТребованиеНакладная

среда, 24 августа 2016 г.

ДатаНач и ДатаКон – это границы периодов

 Т.е. дата + указание включения или исключения пограничного значения
Использование дат (СКД)- с. 390 "Разработка сложных отчетов" Хрусталева

понедельник, 8 августа 2016 г.

Простейший пример использования Временных Таблиц и Пакетных Запросов 1С (работает в УТ 10.3)

ВТ
 //Передаем сведения о номенклатуре в ВТ
МВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления
|ПОМЕСТИТЬ ВТНом
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить();

//Основной запрос- обращается к ВТ, а не к БД
 //Выводим номенклатуру помеченную на удаление
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ВТНом.Ссылка,
| ВТНом.ПометкаУдаления
|ИЗ
| ВТНом КАК ВТНом
|ГДЕ
| ВТНом.ПометкаУдаления = ИСТИНА";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Результат.Ссылка);
КонецЦикла;
//Не помешает(?)
Запрос.МенеджерВременныхТаблиц.Закрыть();

ПЗ
Главное. ПЗ не заменяет механизма ВТ, а совершенствует его, в первую очередь позволяя записать все запросы в одном блоке не вызывая МенеджерВременныхТаблиц.
"ВЫБРАТЬ
|    Номенклатура.Ссылка,
|    Номенклатура.ПометкаУдаления
|ПОМЕСТИТЬ ВТНом
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|;
|
|//
|ВЫБРАТЬ
|    ВТНом.Ссылка,
|    ВТНом.ПометкаУдаления
|ИЗ
|    ВТНом КАК ВТНом
|ГДЕ
|    ВТНом.ПометкаУдаления = ИСТИНА";

У меня ПЗ использует внешняя печатная форма ПакетныйЗапрос_Заказ (в папке Примеры и Инфостарт). В ВТ каждой номенклатуре присваивается числовое значение % НДС (актуально т.к. СтавкиНДС это перечисление).

вторник, 24 мая 2016 г.

Срез последних регистра сведений на каждую дату (для СКД)


На основе данного кода можно сразу создавать отчет в УТ 10.3 (к примеру ПродажиНижеВыбраннойЦены) !!

ВЫБРАТЬ
Продажи.ДокументПродажи КАК ДокументПродажи,
Продажи.Период,
Продажи.Контрагент,
Продажи.Номенклатура,
Продажи.КоличествоОборот КАК Количество,
Продажи.СтоимостьОборот КАК Стоимость,
ЕСТЬNULL(ВЫБОР
КОГДА Продажи.КоличествоОборот > 0
ТОГДА Продажи.СтоимостьОборот / Продажи.КоличествоОборот
ИНАЧЕ 0
КОНЕЦ, 0) КАК ЦенаДок,
ЦеныНоменклатуры.Цена
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
И (ЦеныНоменклатуры.Период В
(ВЫБРАТЬ
МАКСИМУМ(Цены.Период)
ИЗ
РегистрСведений.ЦеныНоменклатуры КАК Цены
ГДЕ
Цены.Период <= Продажи.Период
И Цены.Номенклатура = Продажи.Номенклатура
И Цены.ТипЦен = &ТипЦен))
ГДЕ
Продажи.Номенклатура.Услуга = ЛОЖЬ

УПОРЯДОЧИТЬ ПО
ДокументПродажи

ЕСТЬNULL и Если (ВЫБОР...КОНЕЦ) в запросах 1С

Функция языка запросов ЕСТЬNULL имеет два параметра- первый (выражение любого типа) и 
второй (выражение любого типа).
 Функция предназначена для замены (и возврата) значения первого параметра (если он содержит NULL) на значение второго параметра (второй параметр будет преобразован к типу первого в том случае, если тип первого параметра является строкой или числом).
Если первый параметр не содержит значение NULL- возвращается он.

ЕСТЬNULL (ВыражениеЛюбогоТипа, Результат Если ВыражениеЛюбогоТипа=NULL)
Пример:

ЕСТЬNULL(ПеремещениеТоваровТовары.ЕдиницаИзмеренияПартий.Коэффициент, 1)

Является свернутым ВЫБОР…КОНЕЦ (но для исключения null предпочтительнее)

ВЫБОР 
 КОГДА ВыражениеЛюбогоТипа ЕСТЬ NULL <Условие с результатом типа Булево>
 ТОГДА РезультатЕслиВыражениеЛюбогоТипа=NULL  <Результат в случае если Истина> ИНАЧЕ ВыражениеЛюбогоТипа <Результат в случае если Ложь>
КОНЕЦ 

ВЫБОР КОГДА 
  ТОГДА 
  ИНАЧЕ 
КОНЕЦ

четверг, 24 декабря 2015 г.

Основы синтаксиса 1С Конвертация данных

Частные.
Задача. Перенос номенклатуры из БП2.0 в УТ10.3
Проблема. В БП2.0 нет справочника ВидыНоменклатуры (и вообще такого реквизита в справочнике Номенклатура)
Решение.

В ПКО Номенклатура создаем ПКС ВидНоменклатуры

"999999999"- это код элемента "Товары", справочника ВидыНоменклатуры.
Для сопоставления строке "999999999" данных ссылочного типа (СправочникСсылка.ВидыНоменклатуры) мы создаем ПКО ВидыНоменклатуры.
В нем уже будет указан тип объекта-приемника и надо снять флаг Искать объект...
В ПКО ВидыНоменклатуры создадим ПКС Код
Не забыть установить флаг- Поиск объекта при загрузке по свойству


Общие.
В момент обработки выгрузки/ загрузки данных прикладным решением 1С правила "трансформируются" в процедуры со своими параметрами.
В первую очередь этими параметрами (не путать с Параметрами самой конвертации!) и нужно оперировать в обработчиках событий.

ПКО
1. Перед выгрузкой
Отказ=Истина;

7. При загрузке
ПКО_ПриЗагрузке_ИмяПравила(ФайлОбмена, ОбъектНайден, Объект, НеЗамещатьОбъект, ОбъектМодифицирован)
Пример: Объект.ВедениеВзаиморасчетов= Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом;

8.После загрузки
ПКО_ПослеЗагрузки_ИмяПравила(ФайлОбмена, Отказ, Ссылка, Объект, ПараметрыОбъекта, ОбъектМодифицирован, ИмяТипаОбъекта, ОбъектНайден, НаборЗаписей)

среда, 16 сентября 2015 г.

Описание конструктора запросов СКД

Отсюда.

Конструктор запроса состоит из следующих закладок:

1. «Таблицы и поля» - на закладке три иерархических списка:
a. «База данных» - перечислены все доступные объекта, к которым можно сделать за-прос. Также кнопка «Отображать таблицы изменений» , с помощью которой можно получить доступ к таблицам изменений объектов ИБ, если они регистрируются для какого либо плана обмена.
b. «Таблицы» - список выбранных таблиц, к которым будет выполнен запрос. Также в этом окне можно удалить таблицу, переименовать или заменить таблицу, а также добавить внутренний запрос.

Для виртуальных таблиц можно назначать параметры, нажав на кнопку «Параметры виртуальных таблиц»:

Рекомендуется активно использовать параметры виртуальных таблиц для отборов по тем или иным измерениям, поскольку при этом увеличивается скорость выполнения запроса. В параметрах можно использовать внешние переменные, название которых предваряется знаком «&».
c. «Поля» - список полей, которые выбираются из таблиц. Также можно добавить вычисляемые поля, для этого при нажатии кнопки «Добавить» открывается конструктор произвольного выражения:

Слева окно с доступными в выражении полями. Справа подсказку используемых функций. Внизу конструируемое произвольное выражение. В выражениях можно использовать внешние параметры, для их обозначения используется знак «&», например: &Период, &ДатаНач
Нужно быть внимательным, если в окне будет набрано длинное и сложное выражение, в котором будет небольшая синтаксическая ошибка, то после нажатия кнопки «ОК» система выдаст предупреждение и закроет окно. Весь набранный код будет потерян, поэтому рекомендую, если нет уверены в правильности выражения, то перед закрытием конструктора всегда сохраняйте содержимое в буфер обмена (Ctrl-C).

2. «Связи» - на закладке указываются связи между таблицами.

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

3. «Группировка» - на закладке указываются, какие поля группируются, а какие агрегируются (суммируются).
 

4. Закладка «Условия» - перечисляются условия которые накладываются на запрос.
В условиях тоже можно писать сложные выражения с помощью конструктора простых выражения и использованием внешних переменных:
 

5. «Дополнительно»
Дополнительные параметры, накладываемые на запрос
 

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

7. «Порядок»
В каком порядке будут выводиться получаться результаты запроса



8. «Компоновка данных»
Закладка, в которой определятся служебные поля для СКД. Играет примерно такую же роль, что и закладка «Построитель отчета» в обычном конструкторе отчетов.
 
a. На закладке «Таблицы» - перечислены таблицы, используемые в запросе, можно указать обязательность включения таблицы в запрос, галочкой «Обязательная». Т.е. если никакие поля в выборку не попадают, то данная таблица в запросе вообще не участвует. Также можно указать параметры для таблиц.
 
В процессе настройки СКД, мы задаем, какие либо отборы, то все значения отборов будут подставлены в параметры виртуальных таблиц, что снова нам поможет оптимизировать и ускорить запрос.
b. На закладке «Поля» - перечислены поля и их псевдонимы, которые будут добавляться в список полей СКД.
c. «Условия» - в случае указания отборов в настройках СКД, все значения отборов будут добавляться как дополнительные условия, в условия можно также добавлять сложные выражения.

9. «Характеристики»
Закладка, не имеющая аналога в обычном конструкторе выходной формы.

Данная закладка обеспечивает расширение работы запросов с характеристиками. Таблица на закладке состоит из нескольких полей:
a. «Тип значения» - тип для которого будут выбираться характеристики. Например если указать «СправочникСсылка.Номенклатура», то в запросе будут выбираться все характеристики для номенклатуры.
b. «Источник» - источник для свойств видов характеристик, может быть запрос или таблица. В данном поле мы можем написать запрос выборки только тех свойств, которые нам нужны.
c. «Список характеристик» - поле в котором указывается источник для свойств характеристик. Чаще всего это план видов характеристик или запрос. Также нужно указать поля, которые отвечают за «Идентификатор», «Имя» и «Тип» свойства.
d. «Источник» - следующее поле, в котором указываем источник значений характеристик, тоже может быть или таблица или запрос.
e. «Значение характеристик» - таблица или запрос, которые получает значения характеристик.

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

{} в запросе 1с - это расширение языка запросов для ПостроительОтчетов и СКД

В фигурных скобках {} описываются директивы объекта ПостроительОтчетов и директивы СКД (задаются на закладке «Компоновка данных» конструктора запросов).
В "обычном" запросе (не использующем Построитель и СКД) параметры заключенные в них игнорируются!

среда, 12 февраля 2014 г.

ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ

1. Конструкции ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ позволяют объединить несколько запросов. Каждый запрос собирает данные самостоятельно, а упорядочивание результатов и расчет итогов выполняются над результатом объединения.

2. Конструкция ОБЪЕДИНИТЬ соединяет два результата и группирует повторяющие строки, в отличии от ОБЪЕДИНИТЬ ВСЕ которая не группирует автоматически строки результата.

3. Настоятельно рекомендуется использовать ОБЪЕДИНИТЬ ВСЕ в запросах, где заведомо невозможно получения одинаковых строк. Это существенно повышает производительность – система не пытается группировать строки.

4. Объединяемые запросы должны иметь одинаковое количество полей в списке полей выборки. В случае отсутствия соответствующего поля у одного из запросов ставится 0 (числовое поле) или Null (конструктор запросов расставляет Null автоматически).

понедельник, 10 февраля 2014 г.

"Получить" Регистратор в таблице ОстаткиИОбороты...

РегистрНакопления.Партии.ОстаткиИОбороты(&ДатаКон, &ДатаКон, Регистратор, , )
или в Конструкторе запроса- Параметры виртуальной таблицы- Периодичность- Регистратор!

"Физические" и "виртуальные" таблицы регистров накопления

Самое важное отличие- "физическая"-





хранит сами записи движений (приход- 1500 кг, расход- 1100 кг и тп.).
"Виртуальные" таблицы хранят (точнее получают в момент запроса) ИТОГИ.

Т.о. если нам нужны Остатки по РН ТоварыНаСкладах то из физической таблицы мы их не получим! Мы можем только сгруппировать их по нужному нам признаку (к примеру ВидДвижения) и применить агрегирование (функцию)!

Сложности написания + выборка ВСЕХ записей регистра и лишь затем фильтрация, суммация и пр. (см. ниже материал с ныне недоступного сайта 1cexpo.ru).

Параметры виртуальных таблиц

При организации выборок в реальных задачах в подавляющем большинстве случаев организуется отбор данных в соответствии с некоторыми критериями.
В случае, когда выборка делается из реальной таблицы, никаких сложностей не возникает. Данные обрабатываются абсолютно тривиально:
В том случае, когда источником в запросе выступает виртуальная таблица, ситуация становится несколько сложнее.
Язык запросов позволяет наложить условие на выборку из виртуальных таблиц двумя способами: в предложении ГДЕ и с помощью параметров виртуальных таблиц. Оба способа приведут к одному результату (за исключением некоторых специфических случаев), но, тем не менее, они далеко не эквиваленты.
Мы уже знаем, что виртуальные таблицы потому и называются виртуальными, что в базе их на самом деле нет. Формируются они только в тот момент, когда к ним обращается запрос. Несмотря на это, нам (то есть, тем, кто составляет запрос) удобно рассматривать виртуальные таблицы именно как реально существующие. Что же произойдёт в системе 1С Предприятие 8, когда составленный нами запрос всё-таки обратится к виртуальной таблице?
На первом шаге, система построит виртуальную таблицу. На втором шаге из полученной таблицы будут выбраны записи, удовлетворяющие условию, заданному в предложении ГДЕ:
Хорошо видно, что в итоговую выборку попадут не все записи из виртуальной таблицы (а, следовательно, и из базы данных), а только те, которые удовлетворяют заданному условию. А остальные записи просто будут исключены из результата.
Таким образом, система проделает не просто бесполезную, а двойную бесполезную работу! Сначала будут затрачены ресурсы на построение виртуальной таблицы на основе лишних данных (на рисунке они помечены как «области данных А и Б»), а потом ещё будет проделана работа по фильтрации этих данных из окончательного результата.
Нельзя ли сразу, на этапе построения виртуальной таблицы, отказаться от использования ненужных данных? Оказывается, можно. Именно для этого и предназначены параметры виртуальных таблиц:
Параметризируя виртуальную таблицу, мы сразу ограничиваем объём данных, который будет обрабатываться запросом.

Активность записей

В реальных таблицах регистров 1С Предприятия есть весьма специфическое поле Активность. При работе с реальными таблицами, оно не отличается от любого другого поля, его можно записывать, читать и изменять. Его особенности проявляются при работе с виртуальными таблицами.
Механизм запросов 1С Предприятия устроен так, что при построении виртуальных таблиц в них включаются только записи, у которых поле Активность равно Истина. Для чего это нужно?
Самое главное, такое поведение системы очень удобно использовать в конфигурациях бухгалтерского учёта. Допустим, нужно сделать так, что бы у нас была возможность у какого-то документа «выключить проводки», То есть, нужно, что бы при необходимости этот документ не попадал в отчёты.
Конечно, можно просто отменять проведение документа. Но такой путь не удобен по двум причинам. При проведении документа, как правило, выполняются довольно громоздкие расчёты. И, значит, на то, что бы выключить/включить проводки у нас уйдёт некоторое (иногда, весьма значительное) время. Но с этим ещё можно с грехом пополам смириться. Гораздо хуже другое.
Как правило, в бухгалтерских конфигурациях существует документ для ввода ручных проводок (к примеру, он может называться «Ручная операция»). Этот документ устроен весьма незатейливо: у него нет своих табличных частей, а вместо этого пользователю предоставляется возможность вносить (корректировать, удалять) записи непосредственно в регистр. В то время, как обычные документы формируют движения при проведении, документ ручного ввода, естественно, работает иначе. Он не может формировать и удалять движения по регистру стандартным образом, потому что в его случае эти записи делаются вручную. Если мы удалим движения такого ручного документа, то восстановить их потом не сможем в принципе!
Что бы разрешить эту проблему, как раз и можно использовать поле Активность. Как мы уже говорили, с этим полем можно работать как с любым другим. А значит, для того, что бы движения документа не попадали в отчёты, достаточно записать Ложь в поле Активность во всех записях, относящихся к данному регистратору.

четверг, 13 июня 2013 г.

Группировка (Сгруппировать) и Итоги в запросе

Вроде и нет ничего проще,а с четким определением проблема.
Итак.

  Сгруппировать(группировка)- свернуть записи в группу по групповым полям (полям с одинаковым значением).
  Пример. Нам необходимо узнать общее количество товаров на определенном складе (...всего 999 тонн..). В регистр записывается каждое движение и даже элементарный запрос из двух полей (Склад и Количество) сформирует выборку из множества записей с одинаковым значением поля Склад и разными значениями поля Количество.
Свернуть (сгруппировать) остатки по полю Склад- это получить общее количество товара на этом складе.
  Отсюда вытекает необходимость (для нашего примера, но вообщем не обязательно) вычисления агрегатных функций (производят одиночное значение для определенной группы полей таблицы) по групповому полю (в терминах конструктора запросов- Суммируемое поле).
  В нашем примере- групповое поле Склад, а агрегатную функцию вычислим по полю Количество- получим ОБЩЕЕ КОЛИЧЕСТВО всех товаров на складе.
  Т.к. настолько простые запросы очень редки, то во всех иных случаях при применении Группировки, группироваться будут все поля запроса (за исключением Суммируемых) и  выборка будет сокращаться (сворачиваться) только на те записи, у которых все групповые поля одинаковы (одинаковый склад, одинаковый товар, одинаковый размер товара- эти записи свернуться, если хоть что-то разное- нет).

Итоги (т.н. общие)- дополнительные строки в результате запроса, содержащие итоги  по заданным полям и группировкам (т.н. промежуточные итоги).
Общие итоги- строка в результате запроса со значением итогов по всем записям.

Итоги по группировкам- значения агрегатных функций по групповым полям(полям с одинаковым значением).

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

Во втором- итоги и исходные записи. Причина- в определении (итоги не "сворачивают" данные, а добавляют строки)!В примере групповое поле- номенклатура:





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

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

Итоги по иерархии. Если групповое (группировочное) поле является ссылкой на справочник, то для расчета итогов по группам справочника (или родительским элементам, если справочник без групп) необходимо указать ключевое слово ИЕРАРХИЯ. В этом случае в результат будут добавлены записи с итогами для уровней иерархии справочника.

Важно! В языке запросов допускается совместное использование различных итогов в одном запросе (общих, по группировкам и иерархических).

Синтаксис работы с итогами в выборке из результата запроса

Метод ТипЗаписи()
Пример:
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда

         Продолжить;
КонецЕсли;



Описание:
Получает тип текущей записи выборки.

Возвращаемое значение:
Тип: ТипЗаписиЗапроса

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

Значения
ДетальнаяЗапись
Детальная (конечная) запись результата запроса.
ИтогПоГруппировке
Итоговая запись по группировке запроса.
ИтогПоИерархии
Итоговая запись по иерархии запроса.
ОбщийИтог
Общая итоговая запись запроса.

Применение.
В примере- если очередная строка выборки запроса имеет тип ИтогПоГруппировке то передать управление в начало цикла (пропустить эту строку).

понедельник, 3 июня 2013 г.

Поиск дублей в табличном поле (таблице значений)

Суть отсюда (из комментария 19). Отличный код! Причем вполне универсальный (меняем только сам источник и ссылки на него, а изменение данных очень просто!), вопреки утверждению автора!

Мой вариант (небольшая адаптация+ комментарии).

"ВЫБРАТЬ
//Основной запрос пакета- выбираем нужные данные,
//и помещаем их во временную таблицу- Таблица.
//Здесь (до ключевого слова ПОМЕСТИТЬ) добавляем/меняем необходимые нам данные.
//В принципе сюда можно выбрать ВСЕ данные исходной таблицы
| УстановкаМестХраненияНоменклатурыТовары.Номенклатура,
| УстановкаМестХраненияНоменклатурыТовары.Партия,
| УстановкаМестХраненияНоменклатурыТовары.Приоритет,
| УстановкаМестХраненияНоменклатурыТовары.НомерСтроки
|ПОМЕСТИТЬ Таблица
|ИЗ
| Документ.УстановкаМестХраненияНоменклатуры.Товары КАК УстановкаМестХраненияНоменклатурыТовары
|ГДЕ
| УстановкаМестХраненияНоменклатурыТовары.Ссылка = &Ссылка
| И УстановкаМестХраненияНоменклатурыТовары.Номенклатура <> ЗНАЧЕНИЕ(Справочник.МестаХранения.ПустаяСсылка)
| И УстановкаМестХраненияНоменклатурыТовары.Номенклатура.Услуга = ЛОЖЬ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
//Данные по которым нужно произвести сравнение выносим сюда.
//Результатом этого запроса явится "сбор"  элементов с одинаковыми полями 
//( в соответствии с условием  
//КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Таблица.НомерСтроки) > 1, т.е. 
//ТЕ ПОЛЯ (РАЗЛИЧАЮЩИЕСЯ НомеромСтроки) которых >1) 
| Таблица.Номенклатура,
| Таблица.Партия,
| Таблица.Приоритет
|ПОМЕСТИТЬ Дубли
|ИЗ
| Таблица КАК Таблица
|
|СГРУППИРОВАТЬ ПО
| Таблица.Номенклатура,
| Таблица.Партия,
| Таблица.Приоритет
|
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Таблица.НомерСтроки) > 1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
//Здесь укажем данные, нужные нам в выборке из запроса (к примеру в сообщении)
//и установим связи м.у. нашими таблицами
| Таблица.Номенклатура,
| Таблица.Партия,
| Таблица.Приоритет,
 | Таблица.НомерСтроки
 |ИЗ
 | Дубли КАК Дубли
 |  ЛЕВОЕ СОЕДИНЕНИЕ Таблица КАК Таблица
 |  ПО Дубли.Номенклатура = Таблица.Номенклатура
 |  И Дубли.Партия = Таблица.Партия
 |  И Дубли.Приоритет = Таблица.Приоритет";

Суть. Мы сравниваем строки ТЧ Товары документа УстановкаМестХраненияНоменклатуры по полям: Номенклатура, Партия, Приоритет.
Если существуют (две и более) строки где эти поля равны друг-другу- они попадут в выборку из запроса!