Рубрики
Ошибки в платформе 1С

Неправильные данные выполнения запроса движений и остатков

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

Рабочая система: 1С 8.3.16.1063 + MSSQL 2012.

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

Исходные данные: регистр накопления (остатки) «Товары на складах» с измерениями «Склад, Номенклатура» и ресурсом «Количество».

Пишем простой запрос:

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

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

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

ДвижениеДатаСкладНоменклатураКоличество
Приход01.06.2020СК1Товар1100
Приход02.06.2020СК2Товар1200
Расход02.06.2020СК1Товар150
Расход03.06.2020СК2Товар1100
Вот такие простые исходные данные

Теперь мы выполняем наш запрос с указанием периода с 01.06.2020 по 04.06.2020 и на выходе получаем табличку с такими данными:

ДатаНоменклатураОст. нач.ПриходРасходОст. кон.
01.06.2020Товар101000100
02.06.2020Товар110020050250
03.06.2020Товар12000100100
04.06.2020Товар115000150
Вот такой результат

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

Будьте очень внимательны! Не наступайте на эти грабли!

Я на этот косяк (при выборке ежедневных остатков и движений) потратил 3 часа: на разбор полетов (поиск и выявление ошибки) и переделку алгоритма. Пришлось действовать по старинке — писать цикл со сборкой запроса «ОБЪЕДИНИТЬ», где в каждом подзапросе вытаскиваются остатки на одну дату. Так получилось дольше (по времени выполнения запроса), но зато данные верные.

Некоторые могут задаться вопросом — кому и на кой черт нужны остатки и движения с разбивкой по дням. Ответ — очень часто требуются такие данные для анализа товарных запасов, расчета автозаказа и, как ни странно, официальные представители больших контор требуют от дистрибьюторов данные о вторичных продажах и товарных запасов на складах и просят ежедневную выгрузку этих данных за последние 40 дней. А 1С подкладывает ОЧЕНЬ большую свинью с косяком в выполнении запроса.

На сегодня все. Дальше будет больше и интереснее.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x