База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему движения по регистру «РасчетыСПокупателями» не изменяются в документе «Ко
- В этой теме 1 ответ, 2 участника, последнее обновление 13 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
12 ноября 2026 в 16:54 #39006
у меня цель: в документе корректировка накладных движения по регистру часто ложатся как аванс. и авансы не зачитаются при взаиморасчетах.
мне нужно переписать движения, сделать их как долг и чтобы зачет был автоматически.
но у меня не получается переписать движения, почемуто они или не отображаются и выпадает ошибка:Ошибка при выполнении обработчика — ‘ОбработкаПроведения’
по причине:
Поле объекта не обнаружено (Движения)
{ОбщийМодуль.ПроведениеДокументовУНФ.Модуль(163)}:Для каждого НаборЗаписей Из ДокументОбъект.Движения Цикл
{OSM_Sborka Документ.КорректировкаРеализации.МодульОбъекта(61)}:ПроведениеДокументовУНФ.ЗаписатьНаборыЗаписей(Документ);[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
код:
&После(«ОбработкаПроведения»)
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)// ПродолжитьВызов(Отказ, РежимПроведения);
Если Отказ Тогда
Возврат;
КонецЕсли;
// 1. Определяем исходную накладную (поднимаемся по цепочке корректировок)
Документ = этотобъект.Ссылка;
ИсходнаяНакладная = этотобъект.ИсправляемыйДокументРеализации;
Если Не ЗначениеЗаполнено(ИсходнаяНакладная) Тогда
ИсходнаяНакладная = Документ.ДокументОснование;
КонецЕсли;// Если это корректировка по корректировке — поднимаемся до накладной
Пока ЗначениеЗаполнено(ИсходнаяНакладная)
И ТипЗнч(ИсходнаяНакладная) = Тип(«ДокументСсылка.КорректировкаРеализации») Цикл
ИсходнаяНакладная = ИсходнаяНакладная.ИсправляемыйДокументРеализации;
КонецЦикла;Если Не ЗначениеЗаполнено(ИсходнаяНакладная) Тогда
Возврат; // нечего исправлять
КонецЕсли;// 2. Заказ — из шапки корректировки (он там уже есть!)
Заказ = Документ.Заказ;//перезапоолняем движения, чтобы попадало во взаиморасчеты
//Движения.РасчетыСПокупателями.Записывать = Истина;
//Движения.РасчетыСПокупателями.Очистить();
//
//Движение = Движения.РасчетыСПокупателями.Добавить();
//Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
//Движение.ТипРасчетов = перечисления.ТипыРасчетов.Долг;
//Движение.Период = Дата;
//Движение.Контрагент = Контрагент;
//Движение.Договор = Договор;
//Движение.Организация = Организация;
//Движение.Документ = этотобъект.Ссылка;
//Заказ = этотобъект.Ссылка.заказДвижения.РасчетыСПокупателями.Записывать = Истина;
Для Каждого Движение Из Движения.РасчетыСПокупателями Цикл
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.ТипРасчетов = перечисления.ТипыРасчетов.Долг;
Движение.Документ = ИсходнаяНакладная;
Движение.Заказ = Заказ;
Движение.СпособЗачета = Перечисления.СпособыЗачетаИРаспределенияПлатежей.Авто;
КонецЦикла;ПроведениеДокументовУНФ.ЗаписатьНаборыЗаписей(Документ);
ПроведениеДокументовУНФ.ЗакрытьМенеджерВременныхТаблиц(ЭтотОбъект);МассивСтрокПриход = Новый Массив;
МассивСтрокРасход = Новый Массив;// Разбираем строки: где количество увеличилось, а где уменьшилось
Для Каждого СтрокаТЧ Из ЭтотОбъект.Запасы ЦиклРазницаКоличества = СтрокаТЧ.Количество — СтрокаТЧ.КоличествоДоКорректировки;
Если РазницаКоличества < 0 Тогда
// Стало больше — нужен приходный ордер
МассивСтрокПриход.Добавить(СтрокаТЧ);
ИначеЕсли РазницаКоличества > 0 Тогда
// Стало меньше — нужен расходный ордер
МассивСтрокРасход.Добавить(СтрокаТЧ);
КонецЕсли;КонецЦикла;
// Находим ранее созданные ордера по основанию
СуществующийПриход = НайтиОрдерПоОснованию(«Документ.ПриходныйОрдер», ЭтотОбъект.Ссылка);
СуществующийРасход = НайтиОрдерПоОснованию(«Документ.РасходныйОрдер», ЭтотОбъект.Ссылка);// Приходный ордер
Если МассивСтрокПриход.Количество() > 0 Тогда
СоздатьИлиОбновитьПриходныйОрдер(МассивСтрокПриход, СуществующийПриход);
ИначеЕсли ЗначениеЗаполнено(СуществующийПриход) Тогда
// Строк на приход больше нет — помечаем старый ордер на удаление
ПометитьОрдерНаУдаление(СуществующийПриход);
КонецЕсли;// Расходный ордер
Если МассивСтрокРасход.Количество() > 0 Тогда
СоздатьИлиОбновитьРасходныйОрдер(МассивСтрокРасход, СуществующийРасход);
ИначеЕсли ЗначениеЗаполнено(СуществующийРасход) Тогда
// Строк на расход больше нет — помечаем старый ордер на удаление
ПометитьОрдерНаУдаление(СуществующийРасход);
КонецЕсли;КонецПроцедуры
-
12 ноября 2026 в 16:54 #39007
Ошибка возникает по конкретной причине:
1С (Код)1ПроведениеДокументовУНФ.ЗаписатьНаборыЗаписей(Документ);Эта процедура внутри выполняет:
1С (Код)1Для каждого НаборЗаписей Из ДокументОбъект.Движения ЦиклНо у документа
КорректировкаРеализациив УНФ нет стандартного свойстваДвижения. В УНФ проведение организовано через общий механизмПроведениеДокументовУНФ, а не через стандартную коллекцию наборов записей документа.Поэтому
ЗаписатьНаборыЗаписей()для этого документа вызывать нельзя.## Что необходимо убрать
Из обработчика нужно удалить:
1С (Код)12ПроведениеДокументовУНФ.ЗаписатьНаборыЗаписей(Документ);ПроведениеДокументовУНФ.ЗакрытьМенеджерВременныхТаблиц(ЭтотОбъект);Менеджер временных таблиц также не нужно закрывать вручную. Им управляет типовой механизм проведения.
Кроме того, в обработчике
&После("ОбработкаПроведения")вы не должны заново вызывать запись наборов движений. Типовой механизм сам выполнит запись в установленной последовательности.## Вторая ошибка в логике
Вы изменяете движения так:
1С (Код)1Движение.Документ = ИсходнаяНакладная;Это, скорее всего, неправильно.
Нужно разделять:
—
Регистратор, текущий документКорректировкаРеализации;
—ДокументРасчетовилиДокумент, аналитика расчетов;
— исходную реализацию, которая может быть основанием корректировки.Регистратором движения должен оставаться текущий документ. Иначе движение либо не попадет в отбор текущего документа, либо типовой механизм удалит его при перепроведении.
Исходную накладную следует записывать только в то поле регистра, которое действительно является аналитикой документа расчетов. Название поля зависит от вашей версии УНФ. Это может быть
ДокументРасчетов,Документ,ДокументРасчетовСКлиентоми т. п.## Почему движения не отображаются
Вариантов несколько.
### 1. Документ не регистрирует нужный регистр
Проверьте в конфигураторе:
Документ КорректировкаРеализации→ДвиженияЕсли регистра
РасчетыСПокупателямитам нет, стандартный механизм может не создавать набор движений для этого регистра.В УНФ дополнительно нужно проверить, входит ли регистр в учетный механизм, который зарегистрирован для документа
КорректировкаРеализации.### 2. Типовой механизм перезаписывает движения после вашей процедуры
Обработчик:
1С (Код)1&После("ОбработкаПроведения")не всегда является последней точкой записи движений в УНФ. Вы можете изменить данные в памяти, но затем типовой механизм снова сформирует движения и заменит их.
Для надежного решения нужно менять источник формирования движений:
— функцию получения данных документа для проведения;
— учетный механизм документа;
— точку расширения типового общего модуля проведения;
— либо использовать обработчик после формирования и записи движений, если такая точка есть в вашей версии УНФ.Прямое изменение движений в
&После("ОбработкаПроведения")может работать только в конкретной версии и при правильном порядке вызовов.### 3. Вы обрабатываете несуществующие строки
Этот код только изменяет уже существующие записи:
1С (Код)1Для Каждого Движение Из Движения.РасчетыСПокупателями ЦиклЕсли типовой механизм не сформировал движений по регистру, цикл не выполнится ни разу. Новое движение при этом не создается.
## Как минимум исправить текущий код
Если в вашей версии УНФ переменная
Движения.РасчетыСПокупателямидоступна в обработчике, используйте такой вариант:1С (Код)1234567891011121314151617181920Движения.РасчетыСПокупателями.Записывать = Истина;Для Каждого Движение Из Движения.РасчетыСПокупателями Цикл// Вид движения нужно определить по типовой реализации.// Для долга покупателя обычно используется Приход,// но обязательно сравните с движениями документа РеализацияТоваровУслуг.Движение.ВидДвижения = ВидДвиженияНакопления.Приход;Движение.ТипРасчетов = Перечисления.ТипыРасчетов.Долг;// Здесь должен быть текущий документ, если поле является// ссылкой на документ расчетов.Движение.Документ = ЭтотОбъект.Ссылка;Движение.Заказ = Заказ;Движение.СпособЗачета =Перечисления.СпособыЗачетаИРаспределенияПлатежей.Авто;КонецЦикла;Но если в регистре есть отдельное поле для исходной реализации, тогда нужно заполнять именно его, например:
1С (Код)1Движение.ДокументРасчетов = ИсходнаяНакладная;или:
1С (Код)1Движение.ДокументРасчетовСКлиентом = ИсходнаяНакладная;Точное имя поля нужно посмотреть в структуре регистра
РасчетыСПокупателями.Не следует без проверки записывать
ИсходнаяНакладнаяв полеДокумент.## Если нужно полностью заменить движения
Если типовой механизм уже создал движения, а их нужно заменить, сначала очистите набор, затем добавьте одну или несколько новых записей:
1С (Код)1234567891011121314151617181920212223Движения.РасчетыСПокупателями.Записывать = Истина;Движения.РасчетыСПокупателями.Очистить();Движение = Движения.РасчетыСПокупателями.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Приход;Движение.Период = Дата;Движение.ТипРасчетов = Перечисления.ТипыРасчетов.Долг;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Организация = Организация;Движение.Заказ = Заказ;Движение.СпособЗачета =Перечисления.СпособыЗачетаИРаспределенияПлатежей.Авто;// Регистратором должен быть текущий документ.// Обычно это поле заполняется платформой автоматически.Движение.Регистратор = ЭтотОбъект.Ссылка;// Заполняется только если такое поле есть в регистре.Движение.ДокументРасчетов = ИсходнаяНакладная;Но этот код применим только если в вашей конфигурации действительно существует объект
Движения.РасчетыСПокупателями. Судя по ошибке, дляКорректировкаРеализациитиповая модель проведения УНФ его напрямую не предоставляет.## Более правильный вариант для УНФ
Для УНФ лучше не пытаться редактировать объект
Движения, а добавить или изменить данные, из которых типовой механизм формирует таблицу движений.Обычно схема выглядит так:
1. Документ регистрирует учетный механизм взаиморасчетов.
2. Общий механизм УНФ вызывает получение данных для проведения документа.
3. Полученная таблица преобразуется в движения регистра.
4.ПроведениеДокументовУНФзаписывает наборы записей.Вам нужно найти в конфигурации реализацию проведения документа
РеализацияТоваровУслуги документаКорректировкаРеализации.Ищите процедуры и функции по строкам:
1С (Код)1ПараметрыДляПроведенияДокумента1С (Код)1ДанныеДокументаДляПроведения1С (Код)1РасчетыСПокупателями1С (Код)1ТипРасчетов1С (Код)1СпособЗачетаПосмотрите, где типовая реализация формирует строку по регистру
РасчетыСПокупателями. Затем в расширении нужно изменить именно этот участок, добавив:1С (Код)1ТипРасчетов = Перечисления.ТипыРасчетов.Долги:
1С (Код)12СпособЗачета =Перечисления.СпособыЗачетаИРаспределенияПлатежей.Авто;Важно сохранить все остальные поля, которые заполняет типовой код: контрагента, договор, организацию, заказ, валюту, сумму, направление движения, документ расчетов и аналитику расчетов.
Примерно логика должна быть такой:
1С (Код)12345678910Если СтрокаДвижения.ТипРасчетов =Перечисления.ТипыРасчетов.Аванс ТогдаСтрокаДвижения.ТипРасчетов =Перечисления.ТипыРасчетов.Долг;СтрокаДвижения.СпособЗачета =Перечисления.СпособыЗачетаИРаспределенияПлатежей.Авто;КонецЕсли;Но менять нужно не произвольную таблицу после проведения, а ту таблицу, которая передается в механизм записи регистра.
## Важное замечание про автоматический зачет
Одного изменения:
1С (Код)1ТипРасчетов = Перечисления.ТипыРасчетов.Долг;может быть недостаточно.
Для автоматического зачета должны совпадать аналитики:
— организация;
— контрагент;
— договор;
— заказ, если учет ведется по заказам;
— валюта;
— направление деятельности;
— вид расчетов;
— документ расчетов;
— раздел учета;
— подразделение или другая аналитика, если она является измерением регистра.Если хотя бы одна ключевая аналитика отличается, аванс или долг не будет найден механизмом взаимозачета.
Также проверьте направление движения. Нельзя автоматически считать, что для долга покупателя всегда нужен
Приход. Сравните движение:— обычной реализации;
— оплаты от покупателя;
— зачета аванса;
— корректировки реализации.Если в типовом регистре долг покупателя формируется расходом, установка
Приходдаст противоположный результат.## Ошибка в определении исходного документа
В вашем коде есть потенциально опасный участок:
1С (Код)1ИсходнаяНакладная = этотобъект.ИсправляемыйДокументРеализации;Если
ИсправляемыйДокументРеализацииявляется ссылкой на документ, такой код допустим. Но дальше:1С (Код)1ИсходнаяНакладная = ИсходнаяНакладная.ИсправляемыйДокументРеализации;работает только если текущий объект действительно является документом
КорректировкаРеализации. Лучше явно проверять тип и не обращаться к реквизитам через ссылку составного типа без проверки.Например:
1С (Код)12345678Пока ЗначениеЗаполнено(ИсходнаяНакладная)И ТипЗнч(ИсходнаяНакладная) =Тип("ДокументСсылка.КорректировкаРеализации") ЦиклИсходнаяНакладная =ИсходнаяНакладная.ИсправляемыйДокументРеализации;КонецЦикла;Этот участок у вас в целом построен правильно, но исходный документ не нужно подставлять вместо текущего регистратора.
## Что исправить прямо сейчас
Минимально:
1. Удалить:
1С (Код)12ПроведениеДокументовУНФ.ЗаписатьНаборыЗаписей(Документ);ПроведениеДокументовУНФ.ЗакрытьМенеджерВременныхТаблиц(ЭтотОбъект);2. Не присваивать исходную реализацию в поле
Документ, пока не проверено назначение этого поля.3. Проверить, что регистр
РасчетыСПокупателямивходит в проведение документа.4. Проверить, что строки регистра уже сформированы к моменту выполнения вашего обработчика.
5. Если строк нет, не изменять существующие движения, а добавлять обработку в функцию формирования таблицы движений типового механизма УНФ.
6. Сравнить движения реализации и корректировки в регистре, особенно:
— вид движения;
— тип расчетов;
— документ расчетов;
— заказ;
— способ зачета;
— сумму;
— регистратор.Ваш текущий вызов
ЗаписатьНаборыЗаписей()нужно убрать обязательно. Он предназначен для документа, у которого есть стандартное свойствоДвижения, аКорректировкаРеализациив вашей УНФ проводится через специализированный механизм. Рекомендую посмотреть здесь: https://infostart.ru/1c/articles/1343740/
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.