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

Публикация № 77568

Разработка - Практика программирования

295
С задачей получения среза последних на каждую дату рано или поздно сталкиваются все. Безусловно, это задача достаточно просто решается запросом с соединением по максимальной дате из меньших или равных дат. Но эту же задачу можно решить и с помощью компоновки данных. Не будем рассуждать о том, какой из способов более производителен, все может зависеть от конкретной задачи.

Первый набор данных:

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

Создадим набор данных-запрос «ПродажиОбороты»:

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

 

Сейчас наш отчет будет иметь следующий вид:

 

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

Второй набор данных:

Добавим второй набор данных-запрос «Цены», цены будем брать для фиксированного типа цен:

ВЫБРАТЬ
&Дата КАК Дата,
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
{ВЫБРАТЬ
Дата,
Номенклатура.*,
Цена}
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
&Дата,
Номенклатура = &Номенклатура
И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
{ГДЕ
(&Дата),
ЦеныНоменклатурыСрезПоследних.Номенклатура.*,
ЦеныНоменклатурыСрезПоследних.Цена}

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

Соединения наборов:

Приступим к основной «фишке» данного метода – соединениям наборов:

Здесь самое основное правильно настроить параметры. Если указан параметр,то  СКД передает в приемник связи параметры, указанные в соединении. Значениями этих параметров будут значения соответствующих полей источника связи.

Далее добавим поле цена в ресурсы и в выбранные поля.

Результат:

Теперь можно формировать отчет. Проверим правильность работы отчета на примере «Дивана для отдыха».

В запросе:

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

Текст запроса:

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

СГРУППИРОВАТЬ ПО
ПродажиОбороты.Период,
ПродажиОбороты.Контрагент,
ПродажиОбороты.Номенклатура

ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Дата,
Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втБезЦены.Дата КАК Дата,
втБезЦены.Контрагент КАК Контрагент,
втБезЦены.Номенклатура КАК Номенклатура,
втБезЦены.Количество,
втБезЦены.Стоимость,
МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
ПОМЕСТИТЬ втМаксПериод
ИЗ
втБезЦены КАК втБезЦены
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО втБезЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
И втБезЦены.Дата >= ЦеныНоменклатуры.Период

СГРУППИРОВАТЬ ПО
втБезЦены.Дата,
втБезЦены.Контрагент,
втБезЦены.Номенклатура,
втБезЦены.Количество,
втБезЦены.Стоимость

ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Дата,
Контрагент,
Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втМаксПериод.Дата,
втМаксПериод.Контрагент,
втМаксПериод.Номенклатура,
втМаксПериод.Количество,
втМаксПериод.Стоимость,
ЦеныНоменклатуры.Цена
ИЗ
втМаксПериод КАК втМаксПериод
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ПО втМаксПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
И втМаксПериод.Период = ЦеныНоменклатуры.Период
ГДЕ
ЦеныНоменклатуры.ТипЦен = &ТипЦен
АВТОУПОРЯДОЧИВАНИЕ

Данный пакетный запрос содержит три подзапроса. Рассмотрим их подробнее.

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

Во втором запросе пакета мы соединяем временную таблицу с регистром сведений «ЦеныНоменклатуры» при этом из регистра сведений мы выбираем МАКСИМАЛЬНУЮ дату из меньших или равных дат.  Результат этого запроса также помещаем во временную таблицу (втМаксПериод). Посмотрим, какие данные попадают в эту таблицу:

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

Итоговый результат запроса:

Как мы видим результаты вывода цен в обоих случаях (через СКД и через запрос) оказались одинаковы.

295

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Ish_2 1041 02.11.10 06:57 Сейчас в теме
Мелкие замечания.
1. На мой взгляд , лучше говорить "второй запрос в пакете" , а не " второй подзапрос".
2. Как-то надо обозначить опасность применения в запросе соединения по неравенству.
При розничной торговле с гибкой политикой цен пользователь может быть сильно разочарован таким отчетом. "В среднем " более надежно отсечь период до "Даты начала" и вначале использовать соединение с виртуальной таблицей СрезПоследних и получить цены на "дату начала" для каждой номенклатуры. А затем уже делать соединение по неравенству с регистром , используя условие для записей регистра "Где Период >= &ДатаНачала"
2. _also 417 02.11.10 09:18 Сейчас в теме
1. Спасибо, поправил
2. Ну все таки отчет приведенный в статье не имеет более общий характер. Соглашусь с Вашим мнением, но все же это уже относиться к реальным задачам. Статья - просто пример ;)
3. tormozit 5615 02.11.10 13:58 Сейчас в теме
Метод, примененный в СКД очень неэффективен, т.е. будет работать значительно медленнее, чем пакете/запросе.
denis_aka_wolf; Irwin; PhoenixAOD; zqzq; echo77; AllexSoft; Gilev.Vyacheslav; theshadowco; _also; artbear; +10 Ответить
6. _also 417 02.11.10 15:10 Сейчас в теме
(3) в СКД можно добиться некоторых плюсов, если некоторые данные не нужны. У них можно установить флаги ограничений, и СКД не будет их получать. А так согласен в подавляющем большинстве случаев запрос эффективнее.
43. puzakov 07.03.14 10:16 Сейчас в теме
(3) не согласен. В данном конкретном случае пакетный запрос проигрывает по производительности СКД.
44. ildarovich 6756 07.03.14 11:01 Сейчас в теме
(43) Не может такого быть...
45. puzakov 07.03.14 11:15 Сейчас в теме
(44) почему? В данном случае создаются две временные таблицы, а это не самая производительная операция. СКД же обойдется без записи данных на диск.
46. ildarovich 6756 07.03.14 11:44 Сейчас в теме
(45) Мои умозаключения покажутся Вам такими же умозрительными, как и мне сейчас кажутся Ваши. Просто проведите эксперимент. Он, скорее всего, будет в мою пользу и Вам легче будет поверить объяснениям.
47. puzakov 07.03.14 12:05 Сейчас в теме
(46) по поводу производительности я уже экспериментировал, и не однократно. Может когда-то там, в далекие времена 8.1, СКД и была тормозной, сейчас это не так.
Dmitri93; +1 Ответить
4. director04 3582 02.11.10 14:13 Сейчас в теме
Спасибо, очень интересные решения. Кстати, в одной из задач на экзамене по Бух есть именно такая задача по построению отчета.
Находил иные решения на Мисте, но против данных решений - они просто монстры.
Красиво и просто
5. RailMen 02.11.10 14:21 Сейчас в теме
Реализация всевдо среза первых и последних записей на каждый день периода для расчета среднесписочной численности: http://infostart.ru/public/77462/
7. Ivon 638 02.11.10 16:15 Сейчас в теме
Вот тут http://infostart.ru/public/21181/ моя статья по той же теме.
8. I_G_O_R 59 02.11.10 21:40 Сейчас в теме
Запросы это хорошо , обожаю запросы :) , вот вам еще один вариант, может кто сможет еще короче написать:
ВЫБРАТЬ
	Продажи.Период,
	Продажи.Контрагент,
	Продажи.Номенклатура,
	Продажи.КоличествоОборот КАК Количество,
	Продажи.СтоимостьОборот КАК Стоимость,
	ЦеныНоменклатуры.Цена
ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
			И (ЦеныНоменклатуры.Период В
				(ВЫБРАТЬ ПЕРВЫЕ 1
					Цены.Период
				ИЗ
					РегистрСведений.ЦеныНоменклатуры КАК Цены
				ГДЕ
					Цены.Период <= Продажи.Период
					И Цены.Номенклатура = Продажи.Номенклатура
					И Цены.ТипЦен = &ТипЦен
				УПОРЯДОЧИТЬ ПО
					Цены.Период УБЫВ))
Показать

murenysh; zhelezobeton; triviumfan; Sheogorath; reboot; KiLLius; bobah_; zetovich@mail.ru; pm74; Азверин; philya; batman2004; sommid; Flashback1979SE; +14 Ответить
32. ildarovich 6756 21.04.12 18:49 Сейчас в теме
(8) Вот еще короче
ВЫБРАТЬ
	Продажи.Период,
	Продажи.Контрагент,
	Продажи.Номенклатура,
	СУММА(Продажи.КоличествоОборот) КАК Количество,
	СУММА(Продажи.СтоимостьОборот) КАК Стоимость,
	МИНИМУМ(РАЗНОСТЬДАТ(ЦеныНоменклатуры.Период, Продажи.Период, ДЕНЬ) * &Много + ЦеныНоменклатуры.Цена) 
- МИНИМУМ(РАЗНОСТЬДАТ(ЦеныНоменклатуры.Период, Продажи.Период, ДЕНЬ) * &Много) КАК Цена
ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
			И (ЦеныНоменклатуры.Период < = Продажи.Период)

СГРУППИРОВАТЬ ПО
	Продажи.Период,
	Продажи.Контрагент,
	Продажи.Номенклатура
Показать

Здесь вообще один запрос. Идея в том, чтобы вместо поиска периода, на котором начинается актуальная цена, искать саму цену. Для этого подобрана функция, которая "отправляет" цену прошлого периода на свой "эшелон", высота которого зависит от древности цены. Ширина "эшелона" задается параметром "Много" - это величина, гарантированно перекрывающая диапазон изменения цены (1000000, 10000000 и т.п.). После нахождения ближайшей (нижайшей) "летящей" цены, высота соответствующего "эшелона" вычитается и цена "опускается на землю".
Можно подобрать функцию для дат, булевых и строковых значений.
Кроме краткости записи, других достоинств у запроса нет. Минусы - некоторый проигрыш по времени "классическому" запросу из-за большего объема вычислений в группировках, необходимость думать над значением "Много", работа только с простыми типами.
ra9000; RibD; +2 Ответить
38. Поручик 4333 05.11.13 12:21 Сейчас в теме
(32)
Делал отчет по перемещениям товаров на основе материалов статьи. Так как в моей базе данных немного, то отчёт работал нормально. Но клиент прислал замечания.

исходная ситуация № 1
1) товар используется в документе условно 23 10 2013
2) цена на начало месяца 1796

смотрим отчет - всё ок

исходная ситуация № 2
1) товар используется в документе условно 23 10 2013
2) цена на начало месяца 1796
3) установка цен 20 10 2013 меняет цены продажи на 2000

смотрим отчет - всё ок

исходная ситуация № 3
1) товар используется в документе условно 23 10 2013
2) цена на начало месяца 1796
3) установка цен 25 10 2013!!!!!!!!!! меняет цены продажи на 2000 (то есть дата больше документа. Та же проблема если изменить дату документа установки и на ноябрь)

смотрим отчет: цена = 1796 + 2000 = 3796 (сумма цен на начало месяца и цены, установленной после документа отчета)

Времени на изучение ситуации и переделку запроса не было, поэтому взял совет из поста 8.
37. Поручик 4333 05.11.13 11:40 Сейчас в теме
Пришлось воспользоваться советом из поста (8), иначе при некоторых условиях выдавались не совсем верные цифры
61. KNOSSOS 10.07.15 15:25 Сейчас в теме
(8) I_G_O_R,
ВЫБРАТЬ
    Продажи.Период,
    Продажи.Контрагент,
    Продажи.Номенклатура,
    Продажи.КоличествоОборот КАК Количество,
    Продажи.СтоимостьОборот КАК Стоимость,
    ЦеныНоменклатуры.Цена
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
            И (ЦеныНоменклатуры.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    Цены.Период
                ИЗ
                    РегистрСведений.ЦеныНоменклатуры КАК Цены
                ГДЕ
                    Цены.Период <= Продажи.Период
                    И Цены.Номенклатура = Продажи.Номенклатура
                    И Цены.ТипЦен = &ТипЦен
                УПОРЯДОЧИТЬ ПО
                    Цены.Период УБЫВ))
Показать

Вышел на эту тему по поисковику. Предложенный запрос очень лаконичен, но сильно просаживает производительность. Причем на файловом варианте 8.3 на порядок медленнее чем на MS SQL2012.
А вот так будет стрелять везде:
ВЫБРАТЬ
    Продажи.Период,
    Продажи.Контрагент,
    Продажи.Номенклатура,
    Продажи.КоличествоОборот КАК Количество,
    Продажи.СтоимостьОборот КАК Стоимость,
    ЦеныНоменклатуры.Цена
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО Продажи.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
            И (ЦеныНоменклатуры.Период В
                (ВЫБРАТЬ МАКСИМУМ(Цены.Период)
                ИЗ
                    РегистрСведений.ЦеныНоменклатуры КАК Цены
                ГДЕ
                    Цены.Период <= Продажи.Период
                    И Цены.Номенклатура = Продажи.Номенклатура
                    И Цены.ТипЦен = &ТипЦен
))
Показать

igee12; Simonov_NPM; ra9000; zhelezobeton; user1090556; myoker; toxa688; zetovich@mail.ru; dr2c; sergelemon; i_lo; tehas; Ivanovag123; adhocprog; +14 Ответить
62. Поручик 4333 10.07.15 22:16 Сейчас в теме
(61) Вот примерно так я и сделал года два назад в паре своих отчётов.
63. I_G_O_R 59 11.07.15 00:27 Сейчас в теме
(61) Ха! Тема еще жива))
Сам тоже по возможности пользуюсь именно вторым вариантом. Но что еще интересно, сами 1С такие запросы до сих пор не юзают, наверное не на всех СУБД такие запросы нормально работают, но я сейчас пишу только под ms sql, там отлично работают.
73. user1090556 21.02.19 10:21 Сейчас в теме
(63)
Но что еще интересно, сами 1С такие запросы до сих пор не юзают
потому что большинство пользуются конструкторами запросов. А условие
ВЫБРАТЬ МАКСИМУМ(Цены.Период)
                ИЗ
                    РегистрСведений.ЦеныНоменклатуры КАК Цены
                ГДЕ
                    Цены.Период <= Продажи.Период
                    И Цены.Номенклатура = Продажи.Номенклатура
                    И Цены.ТипЦен = &ТипЦен)

В конструкторе будет вызывать ошибку.
9. I_G_O_R 59 02.11.10 22:04 Сейчас в теме
Кстати во втором запросе есть ошибки и недочеты;
1) в первом запросе данные группировать НЕ надо! т.к. данные из виртуальной таблицы уже сгруппированы
2) во втором запросе не учитывается типцен, поэтому он выдаст направильный результат, если есть несколько типов цен
3) в третьем запросе условие на типцен должно быть в соединении а не в условии, поэтому третий запрос вернет только продажи той номенклатуры, для который установлена цена &ТипЦен
11. Ish_2 1041 03.11.10 00:47 Сейчас в теме
(9) ух.. глазастый какой.

Смотри (10).
12. I_G_O_R 59 03.11.10 01:19 Сейчас в теме
(11) сравнивал, но на небольшой базе, использовал модифицированный запрос из (0), убрал АВТОУПОРЯДОЧИВАНИЕ и исправил ошибки, в итоге мой запрос совсем чуть-чуть быстрее, а если добавить АВТОУПОРЯДОЧИВАНИЕ, то мой запрос заметно проигрывает, прямо даже на глаз видно, не знаю с чем это связано. Буду на работе попробую, если будет время, на большой базе. Есть у нас клиент, у которого очень много типов цен, интересно на такой базе проверить. Я думаю, что в такой базе, мой запрос может показать лучшие результаты, из-за того что в запросе из (0) второй запрос по идее должен выполнятся долго, т.к. это та же проблема что и с нарастающими итогами.
13. Ish_2 1041 03.11.10 07:02 Сейчас в теме
(12) Ага. Интересно проверить и сравнить оптимальный, исправленный запрос из (0) и твой. Причем в твоем запросе , та же проблема что и с нарастающими итогами.
Если таблицу регистра цен увеличить в 2 раза то длительность твоего запроса , думаю, увеличится как минимум в 3 раза.
И вот еще что . Как и в (0) нужно , на мой взгляд, отсечь период до "Даты начала" сделав вначале соединение со срезом последних регистра цен.
14. Ish_2 1041 03.11.10 08:18 Сейчас в теме
(12) +13 Ведь твой вложенный запрос в (8) выполнится столько раз - сколько записей в регистре ЦеныНоменклатуры (если продажи анализируются для всей номенклатуры и без ограничения периода). Еще раз повторяю - выглядит симпатично , но нужно проверять.

С другой стороны, если бы поле выборки языка запроса 1с могло быть запросом (как во всех диалектах SQL), то :

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


В этом случае вложенный запрос выполнится столько раз сколько записей в основном запросе.
15. Ish_2 1041 03.11.10 12:38 Сейчас в теме
А вообще, пост (14) об относительности совершенства любого алгоритма.
С точки зрения специалиста 1с - приведенный в (0) алгоритм можно считать образцом.
Cпециалист же знакомый с SQL воскликнет :
"Какое извращение ! Из за ограничений языка запросов 1с ребятам приходится кувыркаться и изобретать велосипед с квадратными колесами (0)"
16. I_G_O_R 59 03.11.10 14:39 Сейчас в теме
(12) насчет среза согласен, но в этом случае я бы делал как в статье, а то мой запрос из красивого и короткого превратится длинный и некрасивый
19. Ish_2 1041 06.11.10 05:49 Сейчас в теме
(12) Так, что , Игорь , поговорили ... и всё ?
В (8) ты привел свой альтернативный вариант запроса. Давай уж выясним до конца :
Быстрее ли он работает , чем вариант приведенный в статье (0) ?
На больших объемах данных. Что скажешь ?
20. I_G_O_R 59 06.11.10 16:45 Сейчас в теме
(19) может быть и не быстрее, зато красиво. С группировками способ все знают, а мой наверное меньше. Я не против проверить, но бызы нет под рукой, могу только на работе. Вообще идея просто сгенерировать базу, в которой будет много номенклатуры(? только сколько)и например каждый день записана цена и каждая номенклатура продавалась каждый день 1 раз. А вообще я ща в гости иду, так что сегодня некогда.
21. Ish_2 1041 06.11.10 16:47 Сейчас в теме
(20) Много не пей. Послезавтра ..проверять запрос.
22. I_G_O_R 59 14.11.10 14:42 Сейчас в теме
(21) уже заждался наверное результатов, а результаты очень прикольные. Тесты проводил на сгенерированной базе: регистры были в точности перенесены из УТ, только удалены измерения, которых нет в запросе, вообщем все свойства этих измерений(индексировать, ведущее) совпадают. В базе 10000 номенклатуры, 500 контрагентов, с начала 2010 года на каждый день для каждой номенклатуры есть запись в регистры ЦеныНоменклатуры, в регистре Продажи есть одна на запись на каждый день одной номенклатуры и случайным образом подобранным контрагентом(т.е за один день 10000 записей а кому она продалась это как повезет). Для замеров использовались запросы:

1) это запрос из статьи с исправлением ошибок и без индексов(без индексов показал лучшие результаты):
ВЫБРАТЬ
	ПродажиОбороты.Период КАК Дата,
	ПродажиОбороты.Контрагент КАК Контрагент,
	ПродажиОбороты.Номенклатура КАК Номенклатура,
	ПродажиОбороты.КоличествоОборот КАК Количество,
	ПродажиОбороты.СтоимостьОборот КАК Стоимость
ПОМЕСТИТЬ втБезЦены
ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, День, ) КАК ПродажиОбороты

;

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

СГРУППИРОВАТЬ ПО
	втБезЦены.Дата,
	втБезЦены.Контрагент,
	втБезЦены.Номенклатура,
	втБезЦены.Количество,
	втБезЦены.Стоимость

;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	втМаксПериод.Дата,
	втМаксПериод.Контрагент,
	втМаксПериод.Номенклатура,
	втМаксПериод.Количество,
	втМаксПериод.Стоимость,
	ЦеныНоменклатуры.Цена
ИЗ
	втМаксПериод КАК втМаксПериод
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
		ПО втМаксПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
			И втМаксПериод.Период = ЦеныНоменклатуры.Период
			И (ЦеныНоменклатуры.ТипЦен = &ТипЦен)
Показать


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


замеры делал за январь, таким образом получилось, что истории цен не было. В файловой базе я вообще не мог дождаться результатов, поэтому результаты для серверной, 1С 82 и MS SQL Express 2008R2, тестировал на своем ноуте. sql сервер каждый перегружал, поэтому первый резльтат для холодного сервера, а второй для горячего
Вот собственно и результаты за январь:
1 запрос: 1 запуск - 90 сек, 2 запуск и последующие 27 сек
2 запрос: 1 запуск - 400 сек, 2 запуск 10 сек

и результаты за октябрь:
1 запрос: 1 запуск - 210 сек, 2 запуск и последующие 155 сек
2 запрос: 1 запуск - 400 сек, 2 запуск 10 сек

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

запрос из статьи необходимо оптимизировать, ограничить выборку цен срезом последних, я этого не делал, но думаю что результаты буду сравнимы с тестом за январь, когда истории цен не было.
myoker; Bold Enough; SamMix; vasyak319; WellMaster; serge_focus; Zircool; SirYozha; +8 Ответить
23. Ish_2 1041 14.11.10 16:39 Сейчас в теме
(22) Знал, что ты ответишь !
Задал ты задачку.
Так что же лучше "в среднем" для обычной работы в УТ ?

Очень похоже , что при отработке твоего запроса при первом запуске sql-сервер создает и грузит в память ВЕСЬ индекс регистра по полю Период. Именно работа по этому индексу съедает 90% времени. При последующих запусках этого не происходит поэтому и время всего 10 сек.
НО.
Если после первого запуска произошли серьезные изменения в регистре цен (пользователи начали работу), то старый индекс в кэше не может быть использован и он должен быть пересоздан. И тогда при следующем запуске твоего отчета - снова тормоза ?
Свою первую статью помнишь ? С тех пор прогнозирую с опаской.
Так что = это всего лишь предположения.
Если они верны , то тогда я бы отдал предпочтение запросу приведенному в статье ( со всеми необходимыми исправлениями и добавлениями)


25. I_G_O_R 59 14.11.10 18:17 Сейчас в теме
(23) а как узнать точно что скл делал всё это время, план выполнения я смотрел и он не меняется
(24) а насчет индексов: с индексами где-то раза в два медленнее выполнялся запрос
26. Ish_2 1041 14.11.10 18:28 Сейчас в теме
(25) Прав я или нет - можно узнать если на горячем сервере после первого запуска твоего отчета в регистр Цены занести 1000 новых записей. И после этого запустить твой отчет .
Если время будет 400 сек - то я прав. Если 10 сек - то я не прав.
27. I_G_O_R 59 14.11.10 22:03 Сейчас в теме
(26) да оказался прав но на 50% )), занес 10000 записей в один день и время запроса составило 175 сек, а потом опять 10. Потом я переписал на временные таблицы свой запрос и добавил в запрос из топика срез последних, в итоге на холодном сервере время выполнения обоих запросов 45-50 сек, на горячем 35-40. Не пойму только почему раньше были более стабильные результаты. Много тестов не делал, той мой запрос выиграет, то из топика, вообщем буду считать что одинаково. В последних запросах теперь мне не нравится, что в регистре Цены номенклатуры куча индексов (в моей базе только по ЦеныНоменклатуры данные - 236 Мб, а индексы 730 Мб), которые почти никак не используются
28. Ish_2 1041 14.11.10 22:31 Сейчас в теме
(27) Сбил с толку. Совсем.
Смутил этими 50 %(175 сек) , малопонятны пока и (45-50),(35-40).
29. I_G_O_R 59 14.11.10 23:06 Сейчас в теме
(28)
малопонятны пока и (45-50),(35-40)

что непонятного , один раз запущу запрос выполнился за 45 сек, другой раз за 50 а третий может быть за 47. т.к. повторов делал мало написал через тире минимальное и максимальное занчение.
30. Ish_2 1041 15.11.10 00:04 Сейчас в теме
(29) Да, нет.
Малопонятен сам такой эффект . Почему так получилось ... такие диапазоны значений.
57. WellMaster 99 10.12.14 18:48 Сейчас в теме
(22) I_G_O_R,
Дополню.
Если подобная конструкция используется в Универсальном отчете (или вообще через ПостроительОтчетов), то может оказаться, что пользователь не задал "Период" как одно из измерений строк. При этом отчет будет ругаться на строчку
Цены.Период <= Продажи.Период

(не будет находить Поле "Период" таблицы "Продажи").

Решением проблемы может стать способ
Цены.Период <= Продажи.ДокументПродажи.Дата


З.Ы. Проверено на себе
58. puzakov 26.12.14 06:19 Сейчас в теме
(57) WellMaster,

Цены.Период <= Продажи.ДокументПродажи.Дата


слишком злобная конструкция. Задачу-то она может и позволит решить, да только в большой базе может сильно ударить по производительности...
59. WellMaster 99 26.12.14 08:32 Сейчас в теме
(58) puzakov, не спорю. Но хоть что-то.
10. Ish_2 1041 03.11.10 00:44 Сейчас в теме
(10) Проверить не могу. Навскидку :
Выглядит симпатично. Могу предположить , что работает быстрее ,чем пример в статье.
И думаю, вот почему : твой запрос не требует создания дополнительных временных индексов , а использует уже существующие индексы регистра. Насколько я понимаю, все выражения в условии соединения составлены так , что не требуют "дополнительных" усилий от оптимизатора запроса. Ну , а сам то ты сравнивал по быстродействию свой запрос и запрос из статьи ?
67. vis_tmp 30 19.02.17 14:55 Сейчас в теме
(10)(22) Спасибо, отлично работает!
17. V_V_V 03.11.10 16:15 Сейчас в теме
Народ, ну вам же не надо объяснять, что "длинный" и "некрасивый" запрос 1С 8 - это НЕ всегда неоптимально и малоэффективно... :D
18. Rabajaba 321 04.11.10 10:32 Сейчас в теме
Тоже долго думал как собрать среднесписочное количество сотрудников, добавил справочник "ПериодыУчета" с 3-мя полями: "ДатаНачала", "ДатаОкончания", "ВидПериода"(День,Месяц,Год). В результате получить по дням можно все что угодно, при этом запрос остается читабельным и компактным. Ну а для регистров накопления конечно лучше использовать параметр виртуальной таблицы "День".
24. Ish_2 1041 14.11.10 17:45 Сейчас в теме
(0) Про команду "Индексировать".
На мой взгляд явно создавать индекс при помощи этой команды нужно только при многократном обращении к таблице . При однократном обращении этого делать не нужно - оптимизатор запроса сам создаст нужный индекс в нужном ему виде.
Казалось бы это замечание малосущественно. Но.
Мало того , что явное создание индекса командой "Индексировать" при однократном обащении не дает выигрыша -
оно еще и даёт очень существенный проигрыш.
На этот эффект мы натолкнулись с Alex-is при тестировании Примера 3 в его "Заметочках...".
sergos3331; +1 Ответить
31. vitaliyua 17.01.11 21:18 Сейчас в теме
Подскажите пожалуйста. Сделал по вашему примеру отчет в наборе данных. После добавления цены в ресурсы и выбранные поля, в отчете в строках цены пусто. Если убираю галочку "рассчитывать по" номенклатуре напротив цены, тогда цена в строках появляется.
33. Nykyanen 273 29.06.12 12:43 Сейчас в теме
Аналогичная задача на запросе.
Тут остатки на каждый день * цены номенклатуры на дату остатком,
там суммы документов в у.е. * курсы валют на день документа.

"Курсы валют на разные даты в одном запросе. Делаем свой нестандартный срез последних."
http://infostart.ru/public/140933/
34. Flashback1979SE 15.08.12 05:01 Сейчас в теме
ну ваще ниньзя

PS: тоже люблю максимально работать запросами
35. ManyakRus 299 28.12.12 14:43 Сейчас в теме
всё правильно, только не забыть:
1) в первом запросе обязательно сгруппировать данные,
в несгруппированных все цифры потом задвоятся, затроятся.
2) в третьем запросе главное не сгруппировывать или обязательно сгруппировывать по периоду
(я сам не понял почему)
3) все группировки из первого запроса должны быть и во втором, чтоб цифры не задвоились.
(а может и нет)

что не нравится:
группировать по числовым колонкам нежелательно,
это тоже самое что написать
ТЗ.Свернуть("Товар,СуммаРуб","СуммаШт") - СуммаРуб должна быть в правой части а не в левой.
36. Поручик 4333 01.11.13 20:23 Сейчас в теме
Спасибо автору, пригодилось для разработки. Почему-то с соединением средствами СКД не взлетело, а чисто на запросе получилось.
Spacer; _also; +2 Ответить
54. natarezn 01.09.14 10:35 Сейчас в теме
(36) Поручик, что делать, если дата пустая ?
39. Abbra 22 08.01.14 19:44 Сейчас в теме
Для тех, кто не понимает (пока?) вложенные запросы и соединения есть еще вариант для СКД - Вычисляемые поля.
Делаем вычисляемое поле Цена и в Выражение ставим - Ценообразование.ПолучитьЦенуНоменклатуры(Субконто1, Субконто2.ТипЦенРозничнойТорговли, Период, Константы.ВалютаРегламентированногоУчета.Получить(), 1, 1)
Это частный пример для бухгалтерии 2.0.
И очень надеемся на кеширование. )
PowerBoy; +1 Ответить
40. Gureev 18.02.14 13:31 Сейчас в теме
Столкнулся с проблемой в СКД.

Ни в какую не хочет показывать данные на дату. Показывает только срез на текущую дату.

Как только не вертел, не пойму в чем причина.
Такое ощущение, что из источника в приемник параметр не передается.
41. Gureev 18.02.14 15:03 Сейчас в теме
Решил проблему.
Похоже, в соединении наборов данных, первую связь нужно делать по периоду, вторую по другим полям.
Так заработало... колдунство какое-то.
42. puzakov 07.03.14 10:13 Сейчас в теме
Во втором наборе данных нужно было передавать параметры через расширение языка запросов.


РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
            {(&Дата)},
            {(Номенклатура = &Номенклатура
                И ТипЦен = &ТипЦен)})


Иначе отработает неправильно.
48. ildarovich 6756 07.03.14 14:15 Сейчас в теме
Тогда поподробнее расскажите как тестировали, может быть запрос не оптимально написали, на каких данных тестировали, файловый или серверный вариант, схему компоновки и запрос приведите. Действительно интересно. Просто я сравнивал как-то разные варианты "нарезки" последних. Выяснил, что классический метод из двух запросов очень эффективен - там практически нет потерь времени. Поэтому не представляю, где может быть выигрыш. А то, что Вы говорите в памяти или на диске может не быть решающим фактором.
49. puzakov 07.03.14 16:22 Сейчас в теме
50. ЧИА 162 13.04.14 21:49 Сейчас в теме
(48) ildarovich,
Выяснил, что классический метод из двух запросов очень эффективен - там практически нет потерь времени. Поэтому не представляю, где может быть выигрыш.


если в СКД отборы, то фильтр дает ускорение
но - это не совсем корректное сравнение - запрос без отбора и СКД с отбором

если в СКД есть отборы, то в текст запроса надо их тоже добавить, программно, например "из остатки(,"+отбор+")"
и тогда сравнивать
51. ЧИА 162 13.04.14 22:11 Сейчас в теме
_also,

В том виде, что есть сейчас, если опубликованный запрос запустить на УТ 10 и т.п., неподготовленный человек сильно удивится )

Во все три выборки надо вставить характеристику
52. _also 417 15.04.14 09:32 Сейчас в теме
(51) ЧИА, насколько помню, демо-пример вообще на демо УПП писал. Да и учет по характеристикам может быть включен или не включен.
53. Al777 16.07.14 13:59 Сейчас в теме
Статья мне сильно помогла при разработке отчёта на СКД, но с более широкими возможностями. Сделал по второму варианту, но так как выводились не все товары с несуществующими ценами, то сделал связь по типу первого варианта. Чисто первый вариант работает очень долго по всей номенклатуре, поэтому от него отказался, хотя он и проще и быстрее в реализации.
55. natarezn 01.09.14 10:36 Сейчас в теме
спасибо за запросы - пригодились!
56. FlyVodolaz 02.12.14 10:05 Сейчас в теме
Запрос должен быть совсем другим, не нужно группировать лишнюю информацию и по максимум сократить подзапрос втМаксПериод

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


;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
   втБезЦены.Номенклатура,
   втБезЦены.Дата КАК Дата,
   МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
ПОМЕСТИТЬ втМаксПериод
ИЗ
    втБезЦены КАК втБезЦены
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО втБезЦены.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ЦеныНоменклатуры.ТипЦен = &ТипЦен
            И втБезЦены.Дата >= ЦеныНоменклатуры.Период

СГРУППИРОВАТЬ ПО
    втБезЦены.Дата,
    втБезЦены.Номенклатура
;

ВЫБРАТЬ
   втМаксПериод.Номенклатура,
   втМаксПериод.Дата КАК Дата,
   ЦеныНоменклатуры.Цена КАК Цена
ПОМЕСТИТЬ втЦеныНаДату
ИЗ
    втМаксПериодКАК втМаксПериод
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО втМаксПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И втМаксПериод.Период = ЦеныНоменклатуры.Период
            И ЦеныНоменклатуры.ТипЦен = &ТипЦен

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Дата

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    втБезЦены.Дата,
    втБезЦены.Контрагент,
    втБезЦены.Номенклатура,
    втБезЦены.Количество,
    втБезЦены.Стоимость,
    втЦеныНаДату.Цена
ИЗ
    втБезЦены КАК втБезЦены
        ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНаДату КАК втЦеныНаДату
        ПО втБезЦены.Номенклатура = втЦеныНаДату.Номенклатура
            И втБезЦены.Дата = втЦеныНаДату.Дата

АВТОУПОРЯДОЧИВАНИЕ
Показать
60. ui69 41 02.03.15 20:20 Сейчас в теме
А как вычислить стоимость Цена*Количество, если Количество в первом наборе данных, а Цена во втором?
64. Chandr73 16.02.16 12:53 Сейчас в теме
Спасибо большое, пригодилось!
twilight_dream; +1 Ответить
65. aleksdiez 4 11.05.16 14:01 Сейчас в теме
Условие по ТипуЦен надо указывать в связи пацаны ;)
twilight_dream; +1 Ответить
66. BAE1234567 16.08.16 16:01 Сейчас в теме
Оч. здорово! Спасибки за статью!
twilight_dream; +1 Ответить
68. KazanKokos 8 31.05.17 13:12 Сейчас в теме
отлично. как раз нужно
twilight_dream; +1 Ответить
69. SmArtist 67 20.06.17 08:23 Сейчас в теме
70. inf012 07.07.17 08:50 Сейчас в теме
Спасибо!
именно по вашей статье получилось
71. rick_77 09.11.17 15:07 Сейчас в теме
Добрый день!
Вопрос подобный.
Возможно ли средствами 1с вывести список материалов, которые не списаны более 30 ней?
Спасибо!
72. user693558_zdorenkomail 01.02.19 14:39 Сейчас в теме
Подскажите как в данный пример прикрутить пересчет валютной цены из регистра ЦеныНоменклатуры по курсу?
74. twilight_dream 19.05.19 11:12 Сейчас в теме
Большое спасибо! Избавили от мук творчества и сэкономили массу времени и нервов.
Ну, то что тип цен в левое соединение нужно прикручивать, надеюсь, кто хотел - догадался.
75. user1022955 13.08.19 06:39 Сейчас в теме
Автор ты молодец конечно.
Но твой пример будет работать только если у тебя в базе один-единственный вид цен.
А если видов цен несколько - то во втором запросе пакета надо наверное поставить условие по виду цен, иначе ты там много чего наловишь.
76. d4rkmesa 20.09.19 08:18 Сейчас в теме
Вот столько времени прошло, а иногда подсматриваю, когда забываю, как оно работает. Респект автору за читабельность.
Оставьте свое сообщение

См. также

Альтернативный способ задания расшифровки СКД-отчета 14

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования

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

11.11.2019    981    Serge R    9       

Лайфхак работы с СКД. Собираем отчет. 60

Статья Программист Бизнес-аналитик Пользователь Стажер Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

В этой статье я опишу небольшой "лайфхак" по сборке отчетов в СКД. Думаю, этот подход будет интересен тем, кто хочет быстро оформить отчет.

25.10.2019    5798    aximo    22       

Немного про СКД. Характеристики и проверка пустого отчета 75

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пример использования характеристик в СКД и программная работа с ними. А также описание проверки результата отчета на заполненность.

10.10.2019    3693    YPermitin    7       

Полезняшки по СКД и построителям. Просто код 45

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Универсальные функции

Полезные процедуры и функции для работы с построителями и СКД. Просто исходник.

10.10.2019    4086    Yashazz    45       

Две схемы СКД в одном отчете с пользовательскими параметрами 18

Статья Программист Нет файла v8::СКД Россия Бесплатно (free) Практика программирования

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

10.10.2019    2395    evgeni-red    6       

Три способа создания одного отчета на СКД 81

Статья Программист Нет файла v8 v8::СКД ERP2 УТ11 КА2 Бесплатно (free) Практика программирования

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

08.10.2019    5231    ids79    23       

СКД. Отчеты с картинками 184

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Работа с интерфейсом

Решение популярных кейсов с картинками в отчетах на СКД.

25.09.2019    5874    YPermitin    24       

СКД не только для отчетов 142

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

18.09.2019    8194    YPermitin    31       

Агрегатные функции СКД, о которых мало кто знает 343

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    13171    ids79    44       

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 253

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    14290    ids79    30       

Форма отчета СКД 59

Статья Пользователь Нет файла v8::СКД 1cv8.cf Бесплатно (free) Работа с интерфейсом

Описание объекта ОбщиеФормы – ФормаОтчета.

01.08.2019    3968    vasilev2015    5       

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 131

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    12914    ids79    6       

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 148

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Инструментарий разработчика Практика программирования

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    11317    ids79    27       

Пользовательские настройки системы компоновки данных 88

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Работа с интерфейсом

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

09.07.2019    7877    ids79    0       

"Меньше копипаста!", или как Вася универсальную процедуру писал 183

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    8119    SeiOkami    49       

Работа с настройками системы компоновки данных 107

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

02.07.2019    12897    ids79    8       

Создание отчетов с помощью СКД - основные понятия и элементы 209

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Математика и алгоритмы

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    21183    ids79    17       

Не провоцируйте СКД, или пример "как не надо" 52

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Пример того, что не нужно использовать в запросах, чтобы не провоцировать СКД.

10.06.2019    7914    SeiOkami    91       

Еще один способ нестандартной расшифровки отчета. Без использования обработчиков формы. Для ленивых 92

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Лень+ СКД. Еще один нестандартный способ расшифровки отчета. Без использования обработчиков формы. Только макет компоновки и модуль отчета. Весь исходный текст в статье.

16.05.2019    6022    tusv    55       

Расшифровка отчета на СКД с детализацией по выбранному полю на основе БСП 93

Статья Программист Нет файла v8 v8::УФ v8::СКД 1cv8.cf Россия Бесплатно (free) Практика программирования Работа с интерфейсом Разработка

В данной статье рассмотрим механизм работы с расшифровкой отчета, созданного при помощи системы компоновки данных, в управляемом приложении. Показывать буду на примере реальной задачи. Условие: использовать имеющиеся в конфигурации механизмы БСП, с минимальными и "правильными" изменениями. Расшифровка должны быть двух видов на каждом поле: 1. Открывать ссылочный объект 2. Открывать новую форму с детализацией табличной части документа. Собственно ради второго пункта и писалась статья, в основном для себя, чтобы не забыть.

14.05.2019    8448    Viktor_Ermakov    6       

Разворачивание таблицы свойств и значений по колонкам через СКД 18

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

СКД! Юниоры 1С начинают паниковать, когда слышат эту аббревиатуру. Хороший пример, упрощающий жизнь начинающему разработчику, представлен ниже.

12.05.2019    4026    Eret1k    0       

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

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Разработка

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    6219    m-rv    2       

Свой макет оформления отчета 34

Статья Программист Нет файла v8 v8::СКД Россия Windows Бесплатно (free) Работа с интерфейсом

Пример создания и оформления и применения своего (пользовательского ) макета оформления для СКД.

24.04.2019    5318    olegpkc    5       

Как прикрутить ГУИД к регистру сведений 23

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8 Разработка

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

16.04.2019    8848    m-rv    16       

Как добавить типовую форму для СКД (для начинающих) (1С 8.3, управляемые формы) 9

Статья Программист Стажер Нет файла v8 v8::УФ v8::СКД Бесплатно (free) Инструментарий разработчика Работа с интерфейсом

Кастомизация СКД, нестандартная расшифровка, загрузка параметров и другие действия требуют наличия формы отчета. При создании СКД отчета по умолчанию форма не создается, в большинстве случаев это и не требуется. Однако при ситуациях, перечисленных выше, форму все же нужно создать. Это простая инструкция по созданию такой типовой формы.

25.03.2019    6151    ellavs    9       

"Склеивание" отчетов на СКД 23

Статья Программист Нет файла v8::СКД Бесплатно (free) Практика программирования Разработка

Методика программного объединения данных нескольких отчетов в итоговый сводный. По ссылке опубликован пример на реальных данных и код отчета: https://infostart.ru/public/1017891/

10.03.2019    4977    bivmail    2       

Добавление отчетов в типовые конфигурации 1С 206

Статья Программист Нет файла v8::УФ v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Универсальные функции БСП (Библиотека стандартных подсистем)

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

07.03.2019    26259    ids79    33       

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

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования Разработка

В данной публикации рассмотрена возможность программной обработки данных, полученных запросом в отчете, с последующим выводом обработанных данных пользователю с помощью штатных средств СКД.

17.02.2019    4614    srub    10       

Вывод результата компоновки в таблицу и дерево значений 29

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

Загрузка данных из ТабличногоДокумента в ТаблицуЗначений с использованием внешних наборов данных СКД, для последующей обработки в запросе.

14.02.2019    4474    kasper076    5       

Ещё раз о суммировании группировок в СКД 60

Статья Программист Нет файла v8 v8::СКД 1cv8.cf УУ Производство готовой продукции (работ, услуг) Бесплатно (free) Практика программирования Разработка

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

11.02.2019    7271    Dioneo    17       

Еще раз о расшифровке для СКД 23

Статья Программист Нет файла v8 v8::СКД Бесплатно (free) Практика программирования

Программное управление расшифровкой для отчета, сформированного с помощью Системы Компоновки Данных.

27.12.2018    5396    scientes    2       

Заголовок с параметром в отчете СКД 30

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Россия Бесплатно (free) Практика программирования

Статья, как сделать заголовок с параметром в отчете СКД.

19.12.2018    5920    user913680    16       

Тот самый Рабочий стол. Возрождение легенды 78

Статья Программист Нет файла v8::УФ v8::СКД 1cv8.cf Бесплатно (free) Работа с интерфейсом

Невероятный инструмент построения адаптивных интерфейсов.

30.11.2018    10430    1c-intelligence    23       

Установка собственных значений полей при программном выводе отчета СКД по имени поля (по принципу "как в макете") 16

Статья Программист Нет файла v8::СКД Бесплатно (free) Практика программирования

При программном выводе отчета на СКД возникает задача заполнить поля своими значениями. Но при поэлементном выводе отчета параметры "обезличены" как П1, П2, П3, ... Как узнать в какое "П" содержит нужное поле и куда устанавливать значение? Статья поможет программистам начинающим освоение СКД и перешедшим на СКД с "макета" ответить на эти вопросы на примере готового решения.

23.11.2018    5426    lmnlmn    0       

Дополнительные реквизиты в типовом отчете и их отсутствие 18

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Пара Лайфхаков, случайно найденных, когда было лень запускать конфигуратор. Отбор при отсутствии дополнительного реквизита.

18.11.2018    5335    dyuha    0       

Программное заполнение пользовательских параметров и отборов СКД 136

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

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

13.11.2018    22267    Unk92    19       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 127

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    22358    ids79    40       

Перевод конфигурации на 8.3.13 17

Статья Программист Нет файла v8 v8::СКД 1cv8.cf Россия Бесплатно (free) Практика программирования

Опыт решения проблем. 1. Проблема с СКД преобразованием запроса при отключении режима совместимости:

06.11.2018    5933    serferian    26       

Вертикальные границы отчета в интерфейсе "Такси" 8

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Работа с интерфейсом

После перехода на интерфейс "такси" некоторых "старожилов" покоробило отсутствие вертикальных границ отчетов, кому то не понравиись цвета или размер текста. Как это изменить - в данной статье.

30.10.2018    3980    FesenkoA    9       

Вспомогательные инструкции в коде 1С 106

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    21569    tormozit    100       

Приемы работы с СКД: делаем за 5 минут то, на что у других уйдет час 380

Статья Программист Нет файла v8::СКД Бесплатно (free) Практика программирования

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

03.09.2018    32717    SergeyN    26       

Как легко в СКД сделать переключатель: рубли, тыс. руб., млн. руб. 73

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Практика программирования

Достаточно часто пользователи просят добавить в отчеты функцию округления показателей отчетов до тысяч или миллионов. Работая в франчайзи, я встречал различные варианты реализации, например, разные варианты отчетов или округление значения показателей сразу в запросе и т.д. и т.п. Хочу предложить вариант решения данной задачи в отчетах, построенных в СКД.

07.08.2018    8844    SayDimas    15       

[Шпаргалка] Свой заголовок отчету на СКД с параметрами (без программирования) 206

Статья Программист Нет файла v8::СКД 1cv8.cf Бесплатно (free) Работа с интерфейсом

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

23.07.2018    26821    rpgshnik    39       

Повышаем эффективность разработки правил обмена 124

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

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

25.06.2018    20308    olegtymko    47