Создание одной сводной реализации в день на конец дня
Добрый день!
В бухгалтерской базе стоит не сложная с одной стороны задача:
Нужна внешняя обработка для БП
Алгоритм обработки:
Выбрать все проведенные реализации за выбранный период по контрагенту "розничный покупатель"
период и контрагент задается в шапке
Создает одну сводную реализацию в день на конец дня. ранее созданные Реализации помечает на удаление
Перепривязывает документы оплаты к новому документу.
Устанавливает границу запрета обмена данными на конец периода обработки
Написал не сложный код для ее выполнения:
Программа и консоль запросов ругается:
{(6, 4)}: Группировка по таблицам верхнего уровня и вложенным таблицам
<<?>>РеализацияТоваровУслуг.Товары.Ссылка КАК Ссылка
Кто знает, что ей не нравится?
В бухгалтерской базе стоит не сложная с одной стороны задача:
Нужна внешняя обработка для БП
Алгоритм обработки:
Выбрать все проведенные реализации за выбранный период по контрагенту "розничный покупатель"
период и контрагент задается в шапке
Создает одну сводную реализацию в день на конец дня. ранее созданные Реализации помечает на удаление
Перепривязывает документы оплаты к новому документу.
Устанавливает границу запрета обмена данными на конец периода обработки
Написал не сложный код для ее выполнения:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добвляем команду формы
НоваяКоманда = ЭтаФорма.Команды.Добавить("Обработать");
// Свойство "Действие" содержит имя процедуры-обработчика команды
НоваяКоманда.Действие = "Обработать";
НовыйЭлемент = Элементы.Добавить("КомандаОбработать", Тип("КнопкаФормы"));
НовыйЭлемент.ИмяКоманды = "Обработать";
КонтрагентРП=Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель",Истина);
РозничныйПокупатель=КонтрагентРП.Ссылка;
КонецПроцедуры
&НаКлиенте
Процедура Обработать(Элемент)
Если НЕ ЗначениеЗаполнено(ДатаНач) Тогда
Сообщить("Не заполнена дата начала!");
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДатаКон) Тогда
Сообщить("Не заполнена дата конца!");
Возврат;
КонецЕсли;
Если ДатаНач>ДатаКон Тогда
Сообщить("Начальная дата превышает конечкую!");
Возврат;
КонецЕсли;
ВыполнитьЗапросНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьЗапросНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
| РеализацияТоваровУслуг.ПометкаУдаления КАК ПометкаУдаления,
| РеализацияТоваровУслуг.Контрагент КАК Контрагент,
| РеализацияТоваровУслуг.Дата КАК Дата,
| РеализацияТоваровУслуг.Организация как Организация,
| РеализацияТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| РеализацияТоваровУслугТовары.Количество КАК Количество,
| РеализацияТоваровУслугТовары.Цена КАК Цена,
| РеализацияТоваровУслугТовары.Сумма КАК Сумма,
| РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС,
| РеализацияТоваровУслугТовары.СуммаНДС КАК СуммаНДС,
| РеализацияТоваровУслугТовары.СчетУчета КАК СчетУчета,
| РеализацияТоваровУслугТовары.СчетДоходов КАК СчетДоходов,
| РеализацияТоваровУслугТовары.Субконто КАК Субконто,
| РеализацияТоваровУслугТовары.СчетРасходов КАК СчетРасходов,
| РеализацияТоваровУслугТовары.НомерГТД КАК НомерГТД,
| РеализацияТоваровУслугТовары.КодТНВЭД КАК КодТНВЭД,
| РеализацияТоваровУслугТовары.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
| И РеализацияТоваровУслугТовары.ДокументОприходования = РеализацияТоваровУслуг.Ссылка
|ГДЕ
| РеализацияТоваровУслуг.Дата >= &ДатаНач
| И РеализацияТоваровУслуг.Дата <= &ДатаКон
| И РеализацияТоваровУслуг.ПометкаУдаления = &Ложь
| И РеализацияТоваровУслуг.Контрагент = &РозничныйПокупатель
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Ссылка,
| РеализацияТоваровУслуг.ПометкаУдаления,
| РеализацияТоваровУслуг.Контрагент,
| РеализацияТоваровУслуг.Дата,
| РеализацияТоваровУслуг.Организация,
| РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
| РеализацияТоваровУслугТовары.Количество,
| РеализацияТоваровУслугТовары.Цена,
| РеализацияТоваровУслугТовары.Сумма,
| РеализацияТоваровУслугТовары.СтавкаНДС,
| РеализацияТоваровУслугТовары.СуммаНДС,
| РеализацияТоваровУслугТовары.СчетУчета,
| РеализацияТоваровУслугТовары.СчетДоходов,
| РеализацияТоваровУслугТовары.Субконто,
| РеализацияТоваровУслугТовары.СчетРасходов,
| РеализацияТоваровУслугТовары.НомерГТД,
| РеализацияТоваровУслугТовары.КодТНВЭД,
| РеализацияТоваровУслугТовары.СчетНаОплатуПокупателю";
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("Ложь", Ложь);
Запрос.УстановитьПараметр("РозничныйПокупатель", РозничныйПокупатель);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка Как Ссылка,
| РеализацияТоваровУслуг.ПометкаУдаления
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И РеализацияТоваровУслуг.ПометкаУдаления = &Ложь";
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("Ложь", Ложь);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.Удалить();
КонецЦикла;
НоваяРеализация=Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НоваяРеализация.Контрагент=РозничныйПокупатель;
НоваяРеализация.Дата=ТекущаяДата();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовыйТовар=НоваяРеализация.Товары.Добавить();
НовыйТовар.Номенклатура=ВыборкаДетальныеЗаписи.Ссылка;
НовыйТовар.ЕдиницаИзмерения=ВыборкаДетальныеЗаписи.ЕдиницаИзмерения;
НовыйТовар.Количество=ВыборкаДетальныеЗаписи.Количество;
НовыйТовар.Цена=ВыборкаДетальныеЗаписи.Цена;
НовыйТовар.Сумма=ВыборкаДетальныеЗаписи.Сумма;
НовыйТовар.СтавкаНДС=ВыборкаДетальныеЗаписи.СтавкаНДС;
НовыйТовар.СуммаНДС=ВыборкаДетальныеЗаписи.СуммаНДС;
НовыйТовар.СчетУчета=ВыборкаДетальныеЗаписи.СчетУчета;
НовыйТовар.СчетДоходов=ВыборкаДетальныеЗаписи.СчетДоходов;
НовыйТовар.НомерГТД=ВыборкаДетальныеЗаписи.НомерГТД;
НовыйТовар.КодТНВЭД=ВыборкаДетальныеЗаписи.КодТНВЭД;
НовыйТовар.СчетНаОплатуПокупателю=ВыборкаДетальныеЗаписи.СчетНаОплатуПокупателю;
НоваяРеализация.Организация=ВыборкаДетальныеЗаписи.Организация;
КонецЦикла;
НоваяРеализация.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
НаборЗаписей = РегистрыСведений.ДатыЗапретаИзменения.СоздатьНаборЗаписей();
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ДатаКон;
НоваяЗапись.ДатаЗапрета = ДатаКон;
НоваяЗапись.Записать();
НаборЗаписей.Записать();
КонецПроцедуры
ПоказатьПрограмма и консоль запросов ругается:
{(6, 4)}: Группировка по таблицам верхнего уровня и вложенным таблицам
<<?>>РеализацияТоваровУслуг.Товары.Ссылка КАК Ссылка
Кто знает, что ей не нравится?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
и что за бредятина??
а что группируете?? судя по запросу - ничего
в запросе нету того на что ругается - значить Вы скинули не то, что на самом деле выполняется в консоле
а по факту ругательства Вы пытаетесь сгруппировать по непонятному полю, что-то типа такого %))
и что за бредятина??
| И РеализацияТоваровУслугТовары.ДокументОприходования = РеализацияТоваровУслуг.Ссылка
должно быть так
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
а что группируете?? судя по запросу - ничего
в запросе нету того на что ругается - значить Вы скинули не то, что на самом деле выполняется в консоле
а по факту ругательства Вы пытаетесь сгруппировать по непонятному полю, что-то типа такого %))
ВЫБРАТЬ
РеализацияТоваровУслуг.Товары.
(Ссылка,
НомерСтроки)
ИЗ
Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслуг.Товары.(Ссылка)
(1)Если бы розница проводилась как розничные продажи с формированием кассового чека, то ничего бы делать не пришлось бы. Ибо закрытие кассовой смены генерит как раз такой сводный документ, который еще и как с-ф по рознице учитывается. Так что если таки хочется изобрести велосипед, то можно в указанных документах подсмотреть устройство такого велосипеда и что-то даже слямзить.
Вместо подобного кода:
Лучше использовать встроенную функцию ПроверитьЗаполнение()
Если НЕ ЗначениеЗаполнено(ДатаНач) Тогда
Сообщить("Не заполнена дата начала!");
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДатаКон) Тогда
Сообщить("Не заполнена дата конца!");
Возврат;
КонецЕсли;
Лучше использовать встроенную функцию ПроверитьЗаполнение()
(12) смотрите внимательно параметры в консоле запроса (или не заполнены, или с такими параметрами нету данных)
замените "ВЫБРАТЬ" на "ВЫБРАТЬ ПЕРВЫЕ 1", чтобы обрабатывался быстро
уберите условия в запросе... проверьте результат
добавляйте и комбинируйте условия, чтобы определить при каком условии результат пустой
p.s. все равно не понимаю суть группировки %)) теоретически она лишняя
замените "ВЫБРАТЬ" на "ВЫБРАТЬ ПЕРВЫЕ 1", чтобы обрабатывался быстро
уберите условия в запросе... проверьте результат
добавляйте и комбинируйте условия, чтобы определить при каком условии результат пустой
p.s. все равно не понимаю суть группировки %)) теоретически она лишняя
(12)
проверьте даты, многие по началу неправильно заполняют период, так как сортировка параметров в консоли по наименованию, а не по порядку в запросе
и вообще текст запрос не очень сделан
1. не нужно ВНУТРЕННЕЕ СОЕДИНЕНИЕ, доступ к реквизитам шапки можно и нужно делать через Ссылку, например "РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент"
2. группировка в том виде как она в запросе тоже не нужна, вероятно вы хотели свернуть строки по товару, но забыли указать суммируемые поля "Количество", "Сумма", "СуммаНДС"
проверьте даты, многие по началу неправильно заполняют период, так как сортировка параметров в консоли по наименованию, а не по порядку в запросе
и вообще текст запрос не очень сделан
1. не нужно ВНУТРЕННЕЕ СОЕДИНЕНИЕ, доступ к реквизитам шапки можно и нужно делать через Ссылку, например "РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент"
2. группировка в том виде как она в запросе тоже не нужна, вероятно вы хотели свернуть строки по товару, но забыли указать суммируемые поля "Количество", "Сумма", "СуммаНДС"
(15)
Запрос в 1C
выполняемый запрос на SQL
Запрос в 1C
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления КАК ПометкаУдаления,
РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Дата КАК Дата,
РеализацияТоваровУслугТовары.Ссылка.Организация КАК Организация,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
РеализацияТоваровУслугТовары.Цена КАК Цена,
СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма,
РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС,
СУММА(РеализацияТоваровУслугТовары.СуммаНДС) КАК СуммаНДС
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И НЕ РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления
И РеализацияТоваровУслугТовары.Ссылка.Контрагент = &РозничныйПокупатель
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
РеализацияТоваровУслугТовары.СтавкаНДС,
РеализацияТоваровУслугТовары.Цена,
РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления,
РеализацияТоваровУслугТовары.Ссылка.Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Дата,
РеализацияТоваровУслугТовары.Ссылка.Организация
Показатьвыполняемый запрос на SQL
SEL ECT
T1._Document620_IDRRef,
T2._Marked,
T2._Fld16760RRef,
T2._Date_Time,
T2._Fld16763RRef,
T1._Fld16799RRef,
CAST(SUM(T1._Fld16803) AS NUMERIC(21, 3)),
T1._Fld16821,
CAST(SUM(T1._Fld16819) AS NUMERIC(21, 2)),
T1._Fld16818RRef,
CAST(SUM(T1._Fld16820) AS NUMERIC(21, 2))
FR OM dbo._Document620_VT16797 T1 WITH(NOLOCK)
LEFT OUTER JOIN dbo._Document620 T2 WITH(NOLOCK)
ON T1._Document620_IDRRef = T2._IDRRef
WHERE (T2._Date_Time >= @P1) AND (T2._Date_Time <= @P2) AND (T2._Marked = 0x00) AND (T2._Fld16760RRef = @P3)
GROUP BY T1._Document620_IDRRef,
T1._Fld16799RRef,
T1._Fld16818RRef,
T1._Fld16821,
T2._Marked,
T2._Fld16760RRef,
T2._Date_Time,
T2._Fld16763RRef
Показать
(16)
Ничего не понимаю
Даже с этим исправленным запросом в консоли вижу пустую таблицу результата
Чтобы не было сомнений привожу скриншот с параметрами запроса и документом в базе, удовлетворяющим параметрам запроса.
Что еще я мог забыть???
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления КАК ПометкаУдаления,
РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Дата КАК Дата,
РеализацияТоваровУслугТовары.Ссылка.Организация КАК Организация,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
РеализацияТоваровУслугТовары.Цена КАК Цена,
СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма,
РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС,
СУММА(РеализацияТоваровУслугТовары.СуммаНДС) КАК СуммаНДС
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И НЕ РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления
И РеализацияТоваровУслугТовары.Ссылка.Контрагент = &РозничныйПокупатель
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
РеализацияТоваровУслугТовары.СтавкаНДС,
РеализацияТоваровУслугТовары.Цена,
РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления,
РеализацияТоваровУслугТовары.Ссылка.Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Дата,
РеализацияТоваровУслугТовары.Ссылка.Организация
ПоказатьРеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления КАК ПометкаУдаления,
РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Дата КАК Дата,
РеализацияТоваровУслугТовары.Ссылка.Организация КАК Организация,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
РеализацияТоваровУслугТовары.Цена КАК Цена,
СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма,
РеализацияТоваровУслугТовары.СтавкаНДС КАК СтавкаНДС,
СУММА(РеализацияТоваровУслугТовары.СуммаНДС) КАК СуммаНДС
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И НЕ РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления
И РеализацияТоваровУслугТовары.Ссылка.Контрагент = &РозничныйПокупатель
СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Ссылка,
РеализацияТоваровУслугТовары.ЕдиницаИзмерения,
РеализацияТоваровУслугТовары.СтавкаНДС,
РеализацияТоваровУслугТовары.Цена,
РеализацияТоваровУслугТовары.Ссылка.ПометкаУдаления,
РеализацияТоваровУслугТовары.Ссылка.Контрагент,
РеализацияТоваровУслугТовары.Ссылка.Дата,
РеализацияТоваровУслугТовары.Ссылка.Организация
Ничего не понимаю
Даже с этим исправленным запросом в консоли вижу пустую таблицу результата
Чтобы не было сомнений привожу скриншот с параметрами запроса и документом в базе, удовлетворяющим параметрам запроса.
Что еще я мог забыть???
Прикрепленные файлы:



(19) наймите программиста, дешевле обойдется. Задача действительно не самая сложная, за полдня вам любой сделает.
Как минимум одну ошибку видно сразу. Правильно так
Как минимум одну ошибку видно сразу. Правильно так
РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ НачалоПериода(&ДатаНач, День) И КонецПериода(&ДатаКон, День)
Экспериментируя, удалил условие " РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон "
И получил не пустой результат.
(20)
спасибо за помощь, я хочу разобраться своими силами.
Когда-то заканчивал универ по математической специальности, способности есть :)
НачалоПериода() не оказало влияния на результат :(
А функция НачалоДня() вызывает синтаксическую ошибку в консоли запросов
И получил не пустой результат.
(20)
наймите программиста, дешевле обойдется
спасибо за помощь, я хочу разобраться своими силами.
Когда-то заканчивал универ по математической специальности, способности есть :)
НачалоПериода() не оказало влияния на результат :(
А функция НачалоДня() вызывает синтаксическую ошибку в консоли запросов
Прикрепленные файлы:

(17)
вы спросили, какой реальный запрос, я ответил
внутренне соединение ничем не хуже/лучше левого
в данном конкретном случае производительность будет одинаковая
вся разница в том что упрощается текст запроса на языке 1С,
нет необходимости явно соединять таблицы, когда средство разработки позволяет обращаться через точку
вы спросили, какой реальный запрос, я ответил
внутренне соединение ничем не хуже/лучше левого
в данном конкретном случае производительность будет одинаковая
вся разница в том что упрощается текст запроса на языке 1С,
нет необходимости явно соединять таблицы, когда средство разработки позволяет обращаться через точку
Просто мистика. Интересно с ней таки разобраться
Когда оставляю только условие " РеализацияТоваровУслугТовары.Ссылка.Дата <= &ДатаКон"
запрос выбирает все документы до этой даты (скрин 1)
Но если добавляю еще одно условие
РеализацияТоваровУслугТовары.Ссылка.Дата >= &ДатаНач
то результат запроса - пустой (скрин 2).
Пробовал менять даты, без разницы
Когда оставляю только условие " РеализацияТоваровУслугТовары.Ссылка.Дата <= &ДатаКон"
запрос выбирает все документы до этой даты (скрин 1)
Но если добавляю еще одно условие
РеализацияТоваровУслугТовары.Ссылка.Дата >= &ДатаНач
то результат запроса - пустой (скрин 2).
Пробовал менять даты, без разницы
Прикрепленные файлы:


Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот