Странные движения документа по регистру накопления
Товарищи, помогите советом, я уже всю голову сломал...
Есть регистр накопления (остатки). У него 2 регистратора, назовем их ДокПриход и ДокРасход. Соответственно направления движений ясны.
Проблема в следующем: каждая новая запись из документа ДокПриход проходит как-бы без учета предыдущих остатков. То есть, например, был остаток по регистру 5. Провели ДокПриход на 3 единицы. Остаток станет не 8, а 3.
А ДокРасход работает нормально. Но из-за этой ерунды с приходом в ДокРасходе не работает запрет проведения в минус.
Тот же пример: было 5 единиц, провели ДокПриход на 3 единицы, потом пытаемся сделать ДокРасход на 6 единиц (должно хватать), а выдается ошибка, т.к. регистр считает, что в остатке 3.
И еще одна странность - регистр не сортируется по периоду. Это касается того же документа ДокПриход. Т.е. если сделать запрос к вирт.таблице остатки и обороты с детализацией по регистратору, то сначала могут идти документы, например, за 18 июля, а потом за 30 июня.
ТиИ делал, пересчет итогов делал, доки перепроводил. Куда еще можно покопать?
Есть регистр накопления (остатки). У него 2 регистратора, назовем их ДокПриход и ДокРасход. Соответственно направления движений ясны.
Проблема в следующем: каждая новая запись из документа ДокПриход проходит как-бы без учета предыдущих остатков. То есть, например, был остаток по регистру 5. Провели ДокПриход на 3 единицы. Остаток станет не 8, а 3.
А ДокРасход работает нормально. Но из-за этой ерунды с приходом в ДокРасходе не работает запрет проведения в минус.
Тот же пример: было 5 единиц, провели ДокПриход на 3 единицы, потом пытаемся сделать ДокРасход на 6 единиц (должно хватать), а выдается ошибка, т.к. регистр считает, что в остатке 3.
И еще одна странность - регистр не сортируется по периоду. Это касается того же документа ДокПриход. Т.е. если сделать запрос к вирт.таблице остатки и обороты с детализацией по регистратору, то сначала могут идти документы, например, за 18 июля, а потом за 30 июня.
ТиИ делал, пересчет итогов делал, доки перепроводил. Куда еще можно покопать?
По теме из базы знаний
- Удаление движений документа
- Перенос движений документа, 8
- Ведение взаиморасчетов в конфигурациях «Комплексная автоматизация 1.1» и «Управление производственным предприятием 1.3» - часть 2
- Базовый курс для начинающих 1С-программистов. Онлайн-курс с 10 марта по 26 мая 2021 года.
- Быстрый старт в профессии 1С-программист: от начинающего до 1С:Профессионала (онлайн интенсив). С 4 июня по 25 июля 2024 г.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) Если есть отчет ДвиженияДокумента сделайте скриншот движений и сюда выложите, если нету, то внедрите отчет и сделайте.
Отчета нет. Сейчас уже не успею его сделать, в отпуск улетаю через несколько часов. Если ничего не решим, то сделаю, когда вернусь.
Есть скрин консоли запросов по этому регистру. Попробую прикрепить.
(4) ну ясно всё ... нужно было один регистр использовать раз уж остаток явный хотите в разрезе регистратора
Тут не понял... Регистр и так один, в него запись ведут несколько доков. Но даже если док только один, а другой движений не дает, все равно остатков нет.
(5) Механизм типовой или самописный? Если последнее, покажите код, который формирует движения в регистр для прихода и для расхода
Механизм самописный. ДокРасход писал я, а ДокПриход уже был, автора я не знаю. Но ошибку найти не могу.
ДокПриход:
Движения.Бегунки.Записывать = Истина;
Движения.Бегунки.Очистить();
Движения.УпаковочныеЛисты.Записывать = Истина;
Движения.УпаковочныеЛисты.Очистить();
Для Каждого ТекСтрокаСостав Из Состав Цикл
Движение = Движения.Бегунки.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Заказ = Заказ;
Движение.Номенклатура = ТекСтрокаСостав.Марка;
Если
Исполнители.Количество()=2
Тогда
Фио1=Исполнители[0].Сотрудник.Наименование;
фио2=Исполнители[1].Сотрудник.Наименование;
Движение.Звено=ВыделитьСлово(фио1) +"+"+ВыделитьСлово(фио2);
ИначеЕсли
Исполнители.Количество()=1
Тогда
Фио1=Исполнители[0].Сотрудник.Наименование;
Движение.Звено=ВыделитьСлово(фио1);
Иначе
Звено = "";
Для каждого Исполнитель из Исполнители цикл
Если Звено <> "" тогда
Звено = Звено + "+"
КонецЕсли;
Фио = Исполнитель.Сотрудник.Наименование;
Звено = Звено + ВыделитьСлово(Фио);
КонецЦикла;
МаксДлина = Метаданные.РегистрыНакопления.Бегунки.Измерения.Звено.Тип.КвалификаторыСтроки.Длина;
Если СтрДлина(Звено) > МаксДлина тогда
Звено = Лев(Звено, МаксДлина);
КонецЕсли;
Движение.Звено = Звено;
КонецЕсли;
Движение.Количество = ТекСтрокаСостав.Количество;
Движение.Вес = ТекСтрокаСостав.Вес;
//Движения по упаковочным листам
Движение=Движения.УпаковочныеЛисты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период=Дата;
Движение.Активность=Истина;
Движение.Регистратор=Ссылка;
Движение.Бегунок = Ссылка;
Движение.Заказ = Заказ;
Движение.Номенклатура = ТекСтрокаСостав.Марка;
Движение.Количество = ТекСтрокаСостав.Количество;
Движение.Вес = ТекСтрокаСостав.Вес;
КонецЦикла;
ПоказатьДокРасход:
ТЗ = Состав.Выгрузить();
ТЗ.Свернуть("Номенклатура, Заказ, ВесЕденицы", "КоличествоШт");
Для Каждого Строка из ТЗ Цикл
ПроверитьНаличиеБегунка(Строка.Номенклатура, Строка.КоличествоШт, Строка.Заказ, Отказ);
Если Отказ Тогда
Прервать;
КонецЕсли;
СформироватьДвиженияУпаковочныеЛисты(Строка.Номенклатура,Строка.Заказ, Строка.КоличествоШт, Строка.ВесЕденицы*Строка.КоличествоШт);
КонецЦикла;
Процедура СформироватьДвиженияУпаковочныеЛисты(Номенклатура, _Заказ, Количество, Вес)
запрос=новый запрос;
запрос.Текст="ВЫБРАТЬ
| УпаковочныеЛистыОстатки.Бегунок,
| УпаковочныеЛистыОстатки.КоличествоОстаток,
| УпаковочныеЛистыОстатки.ВесОстаток
|ИЗ
| РегистрНакопления.УпаковочныеЛисты.Остатки(
| &Период,
| Номенклатура = &Номенклатура
| И Заказ = &Заказ) КАК УпаковочныеЛистыОстатки";
запрос.УстановитьПараметр("Период", МоментВремени());
запрос.УстановитьПараметр("Номенклатура", Номенклатура);
запрос.УстановитьПараметр("Заказ", _Заказ);
Рез = запрос.Выполнить().Выбрать();
ОсталосьВес = Вес;
ОсталосьКоличество=Количество;
Пока Рез.Следующий() И ОсталосьВес>0 И ОсталосьКоличество>0 Цикл
Движение=Движения.УпаковочныеЛисты.Добавить();
Движение.Период = Дата;
Движение.Бегунок = Рез.Бегунок;
Если Рез.ВесОстаток>ОсталосьВес Тогда
Движение.Вес = ОсталосьВес;
ОсталосьВес=0;
Иначе
Движение.Вес = Рез.ВесОстаток;
ОсталосьВес = ОсталосьВес - Рез.ВесОстаток;
КонецЕсли;
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Заказ = _Заказ;
Если Рез.КоличествоОстаток>ОсталосьКоличество Тогда
Движение.Количество = ОсталосьКоличество;
ОсталосьКоличество=0;
Иначе
Движение.Количество = Рез.КоличествоОстаток;
ОсталосьКоличество = ОсталосьКоличество - Рез.КоличествоОстаток;
КонецЕсли;
Движение.Номенклатура=Номенклатура;
КонецЦикла;
КонецПроцедуры
ПоказатьПрикрепленные файлы:
(22) могу предположить, что документы Расход вводятся не по порядку.
Как вариант: сначала более поздний документ, затем более ранний. Тогда более ранний проведется правильно, но движения первого (более позднего) будут уже не верны.
Попробуйте перепровести документы расход. Получится?
Как вариант: сначала более поздний документ, затем более ранний. Тогда более ранний проведется правильно, но движения первого (более позднего) будут уже не верны.
Попробуйте перепровести документы расход. Получится?
(14) Остаток должен браться в разрезе измерений на момент времени. Но и таким способом остатки берутся неверно.
(15) Эту строчку я добавил для эксперимента. Она не влияет. Да и в копии документа она тоже есть, а копия работает.
Похоже какой-то глюк с документом... ПРидется делать копию, переносить туда существующие доки, а глючный документ убирать
(15) Эту строчку я добавил для эксперимента. Она не влияет. Да и в копии документа она тоже есть, а копия работает.
Похоже какой-то глюк с документом... ПРидется делать копию, переносить туда существующие доки, а глючный документ убирать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот