Разбить период по месяцам в запросе 1с
Можно ли как то в запросе получить остатки на момент времени следующий сразу за датой документов выбранных в другом запросе? Поясняю. У меня запросом выбираются документы, а после этого мне нужно выбрать остатки по некоторым счетам на момент времени после этих документов (для каждого). Сейчас я просто перебираю в цикле ТЗ документов и с помощью РегистрыБухгалтерии.Остатки(МоментСразуПослеДокумента,,Отбор) получаю нужные остатки и дописываю их в ТЗ. Но это очень медленно получается. Поэтому интересуюсь, можно или нет в одном запросе все сделать.
(0) Погуглите остатки на каждый день в запросе. Стал расписывать как это получается простыми словами, но решил Вас больше не путать. Тема уже была на обсуждении..
(0) Особо быстрее вряд ли получится, ибо если даты документов разные, а нужно получить остаток именно на момент времени - никак кроме как отдельный запрос на каждую дату каждого документа.
Возможно следует подумать как упростить задачу.
(1) Я смотрел уже это, но не совсем понимаю как мне это использовать. У меня не на каждый день надо, а на даты конкретных документов. А они могут быть с интервалом в месяц, или три в один день. Может намекнете еще как нибудь, как
делать то?
(2) Печально если так. Документы разные, причем может быть как раз в месяц, так и несколько за день, остатки соответственно за день будут разными. Т.е. нельзя в запрос список передать и остатки по нему получить?
А вообще я давно не делал запрос к регистру юухгалтреии. Остатки и обороты там есть? Конечный остаток и так будет остатком сразу за моментом времени документа
(5) Не совсем понял о чем речь. Да там есть и остатки и обороты. Но про какой остаток идет речь? Остаток на конец чего?
(6) Да, конечный остаток. В 1 таблице в запросе Вы выберите все документы, во втором в отбор по ним, в таблице РегистрБухгалтреии.ДВиженияхССубконто отбор по регистраторам из таблицы1 и выводить регистратор и конечный остаток
(7) Я об этом и спрашиваю. Как это сделать? Как передать этот отбор в запрос 2? Пример или ссылку на пример можно?
(0) как вариант при обходе таблицы доков делать динамический текст запроса
И тд и потом один раз выполнить запрос
(9) И быстрее получится? Доков может быть несколько сотен, значит и запросов будет столько же. Я правильно понял?
(11) Рассчитать остаток на дату первого документа и выбрать движения всех последующих до последнего, а потом считать остатки в обходе предлагали уже?
(13) Мне надо на время документа, включая этот документ. Т.е. показать какие остатки получились после проведения этого документа.
(15) ОстаткиИОбороты с периодичностью по регистратору (РесурсКонечныйОстаток) тебе в помощь
(14) Дак заранее не понятно один документ в течении дня или несколько. Что за "хитрый" запрос нужно написать чтобы это все обрабатывалось, я не понимаю. Тогда уж, наверное проще оставить как я сделал, через перебор списка док в цикле с расчетом остатков по каждому. Медленно но зато понятно. Или я не правильно понял что вы предлагаете?
(15) Постановка задачи вызывает сомнения. Одно проведение задним числом и эти данные уже неактуальны. Я бы докопался до истоков и скорректировал постановку.
Отсутствие эффективных типовых механизмов для решения задачи это сигнал о том, что постановка возможно неадекватная. Либо структура метаданных неадекватная.
(21) В ОстаткиИОбороты с периодичностью по регистратору. Мне же нужно запрос составить с отбором по этим регистраторам. Во и вопрос как список подать туда? Не в цикле же. Я конечно скорее всего туплю, но не могу сообразить как
(20) Возможно и так. Но с этим ничего поделать уже не получится. Мне нужно вывести отчет в котором список документов (разных), а в дополнительных колонках остатки по 41 и 60 счетам. Причем не все документы двигают эти счета и у некоторых остаток будет повторятся.
(22) Получи "ОстаткиИОбороты с периодичностью по регистратору" за весь период (мин., макс.) и отбирай по регистраторам.
(24) А как быть если документ не двигал этот счет? Как я понял тогда его не будет в остатках или не так?
(27) Остатки нужно взять с предыдущего или следующего дока, как-то извернуться. ВычислитьВыражение() например.
(27) Как присоединить то? Как вообще сделать подобный запрос? Например есть список из дат и как его засунуть в запрос остатков? РегистрБухгалтерии.РасчетыРегистр.Остатки(Дата в (&СписокДат)) КАК РасчетыРегистр Ведь так же не получится сделать или может через ГДЕ делать Дата в (&СписокДат). Дайте пример или ссылку на пример, ну или направление хотя бы. А то я правда не понимаю что делать и в каком направлении копать?
(30) Нет готового решения, нужно думать, изобретать. Направление я указал.
(30) Как было сказано в знаменитом вирусном ролике про тех поддержку "Вы заходите не оттуда".
Вам нужно рассчитывать остатки путем добавления и вычитания к остатку на некую минимальную дату икс. Если речь идёт о датах документа то добавляем секунду при формировании таблицы дат, а если речь идёт о моментах времени, а у вас скорее всего речь именно о моментах времени, о границах, то даже и не знаю. Думать надо и самое простое что при этом выдумывается так это некая отстранённая структура хранения для нужных данных. Ни достоверности правда при этом ни эффективности. Можно ещё в выдуманный реквизит при проведении писать якую чушь нужную
Я в прошлом году похожие кульбиты с расчетом долга на позицию документа и кучей сопутствующих параметров по просьбе заказчика крутил ибо он настаивал на том что нельзя менять структуру и перепроводить документы, то есть требовал что бы вместо получения данных из структур хранения цифирь бралась расчетным путём от момента начала ведения учёта. Отчёт менеджера о продажах или как то так эта хрень называлась. Ну я пошёл человеку на встречу, но по мере накручивания им хотелок становилось всё хуже и всё страшнее и я окончательно сломался и отказался продолжать работу когда мой запрос стал занимать эдак 11 тысяч строк. Пытаешься же держать всю логику в голове, а там и сальда на итую дату и просроченное сальдор на итую дату и ещё куча доп условий и выводимых параметров была
(33) Про то что можно добавить 1 сек к датам я понимаю, и можно так и сделать. Но вод как запрос сделать с запросом остатков на эти даты никак не пойму. Не делать же условие ГДЕ Дата в (&СписокДат). Так же не прокатит? И как соединить в одном запросе Таблицу с документами и Запрос остатка? Я понимаю, что эти вопросы может быть и тривиальны для знающих, но мой "скил" явно недостаточный для того чтобы слёту понимать "обороты" вроде "присоедини список доков". Можно пример на пальцах (схематично) как запихать этот чертов список в запрос? Ну типа так: ВЫБРАТЬ * ИЗ Регистр.Обороты(Дата В (ВЫБРАТЬ * ИЗ СписокДокументов).ДатаДокумента)
(34) И кстати, не подскажете как лучше в запросе сравнивать со счетом?
Так РасчетыРегистр.СчетКт.Код = ""41"" или так РасчетыРегистр.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Расчеты.Счет41)
(35) Да нет же. вы не ставите условие на таблицу остатков, а формируете таблицу дат и на каждую дату соединением таблиц рассчитываете остаток
+37 Посмотрите как определяется курс валюты на каждую дату. от вам примерно также
Аналог типовой функции РазложитьНаПериоды(ДатаНачала = '00010101', ДатаОкончания = '00010101') , только релизовано на языке запросов. Не удалось найти готового решения, поэтому выкладываю запрос по разбиению периода на помесячные интервалы тут.
архив с текстом запроса и сохраненная версия для "Универсальной консоли отчетов"Специальные предложения
(16) давайте я поясню свою мысль.
Предложенное вами решение без должного основания использует зависимости:
1) от наличия в составе конфигурации такого объекта как регистр сведений "РегламентированныйПроизводственныйКалендарь";
2) от его правильной заполненности на нужный период.
Если первая зависимость легко проверяется (при попытке использовать этот метод в конфигурации без календаря, вы просто получите ошибку), то вторая зависимость неприятнее. При частичной заполненности календаря вы получите ошибку в отчете, которую еще потребуется поискать.
Кроме того, используемый принцип совершенно зря перебирает все даты периода, когда из месяца требуется только одна запись. То есть работает в 30 раз медленнее возможного.
Вопрос, наверное не такой уж важный, но тут много начинающих, которые используют готовый код, никак его не осмысливая. В результате чего недостаточно проработанные, сделанные на скорую руку решения множатся. Авторы публикаций могли бы этому препятствовать, а вы, кажется, способствуете.
Кстати, если уж настаиваете на использовании календаря, могу предложить вот такой вариант из одного запроса:
Он короче и более универсальный - легко вид периода (день, месяц, год, квартал) поменять.
А вообще в свете вопроса (15) можно было бы и конкурс объявить на решение этой задачи без календаря.
1С 8.3 Разбить период по подпериодам (месяц, неделя, день, квартал)
&НаСервере
Функция ЗапросомРазбитьПериодНаПодпериоды ( Знач НачДата , Знач КонДата )
// например НачДата 05.05.2021, КонДата 27.09.2021
Запрос = Новый Запрос ( "ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(&НачДата, МЕСЯЦ) КАК Период
|ИТОГИ ПО
| Период ПЕРИОДАМИ(МЕСЯЦ, &НачДата, &КонДата)" );
Запрос . УстановитьПараметр ( "НачДата" , НачДата );
Запрос . УстановитьПараметр ( "КонДата" , КонДата );
РезультатЗапроса = Запрос . Выполнить ();
Если Не РезультатЗапроса . Пустой () Тогда // Такая проверка рекомендуется фирмой 1С
Записи = РезультатЗапроса . Выбрать ( ОбходРезультатаЗапроса . ПоГруппировкам , "Период" , "ВСЕ" );
// Обход результата запроса по каждой записи в полученной выборке
Пока Записи . Следующий () Цикл
Сообщить ( Записи . Период );
// 01.05.2021 0:00:00
// 01.06.2021 0:00:00
// 01.07.2021 0:00:00
// 01.08.2021 0:00:00
// 01.09.2021 0:00:00
//Год_Даты = СокрЛП(Год(Записи.Период)); // 2 021
//Месяц_Даты = СокрЛП(Месяц(Записи.Период)); // 9
//Сообщить(Год_Даты+" "+Месяц_Даты);
КонецЦикла;
Иначе // Например: Сообщить("Данные отсутствуют!");
КонецЕсли;
&НаСервере
Функция РазбитьПериодНаПодпериоды ( Знач НачДата , Знач КонДата , УровеньДетализации )
ТаблицаДат = Новый ТаблицаЗначений ;
ТаблицаДат . Колонки . Добавить ( "НачДата" );
ТаблицаДат . Колонки . Добавить ( "КонДата" );
ПервыйОбходЦикла = Истина;
Если УровеньДетализации = "День" Тогда
Пока НачДата <= КонДата Цикл
Если ПервыйОбходЦикла Тогда
Если КонецДня ( НачДата ) >= КонДата Тогда
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачДата ;
НоваяСтрока . КонДата = КонДата ;
Прервать;
Иначе
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачДата ;
НоваяСтрока . КонДата = КонецДня ( НачДата );
КонецЕсли;
Иначе
Если КонецДня ( НачДата ) >= КонДата Тогда
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачалоДня ( НачДата );
НоваяСтрока . КонДата = КонДата ;
Прервать;
Иначе
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачалоДня ( НачДата );
НоваяСтрока . КонДата = КонецДня ( НачДата );
КонецЕсли;
КонецЕсли;
НачДата = КонецДня ( НачДата )+ 1 ;
ПервыйОбходЦикла = Ложь;
КонецЦикла;
Пока НачДата <= КонДата Цикл
Если ПервыйОбходЦикла Тогда
Если КонецНедели ( НачДата ) >= КонДата Тогда
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачДата ;
НоваяСтрока . КонДата = КонДата ;
Прервать;
Иначе
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачДата ;
НоваяСтрока . КонДата = КонецНедели ( НачДата );
КонецЕсли;
Иначе
Если КонецНедели ( НачДата ) >= КонДата Тогда
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачалоНедели ( НачДата );
НоваяСтрока . КонДата = КонДата ;
Прервать;
Иначе
НоваяСтрока = ТаблицаДат . Добавить ();
НоваяСтрока . НачДата = НачалоНедели ( НачДата );
НоваяСтрока . КонДата = КонецНедели ( НачДата );
КонецЕсли;
КонецЕсли;
НачДата = КонецНедели ( НачДата )+ 1 ;
ПервыйОбходЦикла = Ложь;
КонецЦикла;
В запросе задаем период отборки. Отчет на основании запроса. Как выводить в отчете период отборки?
В запросе задаем период отборки. Отчет на основании запроса. Как выводить в отчете период отборки.
Дата по рабочим дням в запросе
Добрый день. УТ 10 В документе Реализация добавлен реквизит.
Сортировка по дням рождения в запросе
Добрый день. SELECT DateSerial(Year(Date()), Month(), Day()) AS Дни, Сотрудники.ДеньРождения.
2. В типовых конфигурациях есть регистр сведений РегламентированныйПроизводственныйКалендарь, можно выбирать дни из него. вар 1 (топор): в цикле загони в таблицу дни между границами, таблицу сунь в запрос;
вар 2 (по конкретным обстоятельствам): если по этим периодам будешь выбирать с оборотного регистра - можно указать переодичность в запросе у самого регистра (см.скрин);
вар 3.
" по дням можно посмотреть занят номер или нет" - уточни более детально, что делаешь запросом
Перекрестная таблица в СКД тут вот должно получиться то что в итоге. Вторая картинка
Добавлено через 11 часов 21 минуту
2. В типовых конфигурациях есть регистр сведений РегламентированныйПроизводственныйКалендарь, можно выбирать дни из него. Joker_vad, Странно, что Вы не прислушались к верному совету. Если нужны дни, а РС.РегламентированныйПроизводственныйКалендарь отсутствует, создайте ТЗ с датами и включите в источники СКД Странно, что Вы не прислушались к верному совету. Если нужны дни, а РС.РегламентированныйПроизводственныйКалендарь отсутствует, создайте ТЗ с датами и включите в источники СКД честно не знаю как это сделать. В виртуальной таблице использовать итоги нельзя. А как еще это прикрутить понять не могу ЛЕВОЕ СОЕДИНЕНИЕ с датами по периоду День или ещё по какой - это по структуре данных уж соображать. ЕстьНАЛЛ и ВЫБОР КОГДА довершат дело.
Разбить период на подпериоды
Здравствуйте, столкнулся с такой проблемой, есть период с 1.10.16 по 31.10.16, он разбит в таблице.
Разбить некий временной период
Задача, подскажите в каком двигаться на майскле: Есть некий временной интервал t0, t1 : TIME.
Разбить период дат на заданные периоды
Добрый день всем! Задан период дат типа 01.01.2020 - 31.05.2020 Необходимо разбить его на.
Данная задача может быть решена как с использованием вложенных запросов, так и с помощью. временных таблиц. Попробуем решить задачу, используя временные таблицы. Сначала приведем весь текст запроса, а потом кратко разберем по частям принцип его работы.
Текст запроса:
Код 1C v 8.х
Данный пакетный запрос содержит три подзапроса. Рассмотрим их подробнее.
Первый запрос пакета группирует данные по периоду, контрагенту и номенклатуре и помещает их во временную таблицу втБезЦены. Далее мы будем соединять эту таблицу с таблицей цен номенклатуры и получим небольшой выигрыш в том, что соединять будем уже сгруппированные данные.
Во втором подзапросе мы соединяем временную таблицу с регистром сведений «ЦеныНоменклатуры» при этом из регистра сведений мы выбираем МАКСИМАЛЬНУЮ дату из меньших или равных дат. Результат этого подзапроса также помещаем во временную таблицу (втМаксПериод). Посмотрим, какие данные попадают в эту таблицу:
Рис. 8 Временная таблица втМаксПериод
В последнем запросе пакета, мы еще раз соединяем временную таблицу с таблицей цен номенклатуры. На этот мы соединяем таблице по номенклатуре и периоду.
Итоговый результат запроса:
Похожие FAQ
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Excel файл как Внешний источник данных 14
Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто. 1. В конфигурации добавляет новый объект метаданных типа " Внешние источники данных" и назовем его просто " Excel" . https://helpf.pro/uploads/img Быстрая функция чтения данных с листа Excel 9
При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки ра В чем разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С 10
Цитата из справки 1С: " По умолчанию при объединении запросов полностью одинаковые строки в результате запроса, сформированные РАЗНЫМИ запросами, заменяются одной . Если требуется, чтобы были оставлены разные строки, необходимо указать ключевое Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр Посмотреть все результаты поиска похожих
Еще в этой же категории
Значения NULL ( ЕСТЬ NULL и ЕСТЬNULL()) 48NULL – отсутствующие значения. Не путать с нулевым значением! NULL – это не число, не равно пробелу, пустой ссылке, Неопределено. NULL – типообразующее значение, т.е. есть тип NULL и единственное значение этого типа. NULL значения появляются в 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ Нарастающий итог в запросе 22
Необходимо использовать левое соединение таблицы с самой собой. ВЫБРАТЬ Обороты.Период, Обороты.Номенклатура, Обороты.Количество ПОМЕСТИТЬ ВТдвижения ИЗ РегистрНакопления.Обороты КАК Обороты ; //////////////////////////////////////////////// Полезные сведения о языке запросов 1С 8.х 22
В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для ко Оператор ПОДОБНО 18
ПОДОБНО - Оператор проверки строки на подобие шаблону. Аналог LIKE в SQL. Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если з Посмотреть все в категории Запросы
Ключевые слова и Изображения
Слова упорядочены по частоте использования в тексте
Изображения
Читайте также: