База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как изменить движения регистра «Расчёты с покупателями» в УНФ через расширение?
- В этой теме 1 ответ, 2 участника, последнее обновление 30 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
9 ноября 2026 в 22:42 #38988
у меня Управление нашей фирмой, редакция 3.0 (3.0.12.253)
мне нужно в документе Корректировка реализаций перезаписать движения по регистру «Расчеты с покупателями» так, как нужно мне -
9 ноября 2026 в 22:42 #38989
В УНФ 3.0.12.253 это можно сделать через расширение конфигурации, не изменяя типовую конфигурацию.
Правильная схема такая:
1. Типовая процедура
ОбработкаПроведениясначала выполняется.
2. Типовые движения регистраРасчетыСПокупателямиочищаются.
3. В регистр добавляются ваши движения.
4. При записи документа платформа записывает уже измененный набор движений.Используйте аннотацию
&ИзменениеИКонтроль, потому что здесь нужно выполнить код после типового проведения.## 1. Создайте расширение
В конфигураторе:
1С (Код)123КонфигурацияРасширения конфигурацииДобавитьНапример, назовите расширение:
1С (Код)1ИзменениеРасчетовСПокупателямиДобавьте в расширение документ:
1С (Код)1Документы → КорректировкаРеализацийОткройте его:
1С (Код)1Модуль объектаЕсли регистра
РасчетыСПокупателямине видно в объектном модуле расширения, добавьте его в состав движений документа через расширение.Обычно это делается так:
1С (Код)123Документ КорректировкаРеализацийДвиженияРасчетыСПокупателямиУ регистра должна быть включена возможность использования документом как регистратора.
—
## 2. Базовый шаблон кода
В модуле объекта документа
КорректировкаРеализацийрасширения напишите:1С (Код)123456789101112131415161718192021&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)// Сначала выполняем типовое проведение документаПродолжитьВызов(Отказ, РежимПроведения);// Если типовое проведение завершилось с отказом,// свои движения изменять не нужноЕсли Отказ ТогдаВозврат;КонецЕсли;// Включаем запись движений по региструДвижения.РасчетыСПокупателями.Записывать = Истина;// Удаляем движения, сформированные типовой процедуройДвижения.РасчетыСПокупателями.Очистить();// Здесь добавляем свои движенияКонецПроцедурыКлючевая строка:
1С (Код)1Движения.РасчетыСПокупателями.Очистить();Она удаляет из набора движений движения, которые сформировала типовая процедура.
После этого вы добавляете свои записи:
1С (Код)123456Движение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Сумма = СуммаДокумента;Но конкретные имена полей нужно проверить именно в вашей базе. В регистре могут использоваться, например:
—
Контрагент;
—Партнер;
—Договор;
—Организация;
—РасчетныйДокумент;
—Сумма;
—Валюта;
—Курс;
—Кратность;
—Сделка;
—ЗаказКлиента;
—ВидДвижения.Нельзя заранее гарантировать точные имена измерений и ресурсов без просмотра структуры регистра в вашей конфигурации.
—
# 3. Как посмотреть правильные имена полей
В конфигураторе откройте:
1С (Код)12Регистры накопленияРасчетыСПокупателямиПосмотрите вкладки:
1С (Код)123ИзмеренияРесурсыРеквизитыНапример, если структура регистра выглядит так:
1С (Код)123456789Измерения:ОрганизацияПартнерДоговорДокументРасчетовРесурсы:СуммаСуммаРеглто движение нужно создавать так:
1С (Код)123456789Движение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Организация = Организация;Движение.Партнер = Партнер;Движение.Договор = Договор;Движение.ДокументРасчетов = Ссылка;Движение.Сумма = СуммаДокумента;Движение.СуммаРегл = СуммаДокумента;Если регистр остаточный, у него дополнительно будет поле:
1С (Код)1Движение.ВидДвижения = ВидДвиженияНакопления.Приход;или:
1С (Код)1Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Если регистр оборотный, свойства
ВидДвиженияу него не будет.—
# 4. Пример с одной собственной записью
Допустим, вы хотите полностью удалить типовые движения и создать одну запись по текущему документу.
Пример:
1С (Код)1234567891011121314151617181920212223&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)// Выполняем штатное проведениеПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;// Очищаем типовые движенияДвижения.РасчетыСПокупателями.Записывать = Истина;Движения.РасчетыСПокупателями.Очистить();// Формируем свое движениеДвижение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Сумма = СуммаДокумента;КонецПроцедурыЕсли документ не имеет реквизита
Договор, а договор находится в табличной части или в другом реквизите, этот код нужно изменить.—
# 5. Пример с движением по строкам документа
Если в
КорректировкаРеализацийесть табличная часть, напримерТовары, и по каждой строке нужно сформировать свое движение:1С (Код)1234567891011121314151617181920212223242526&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.РасчетыСПокупателями.Записывать = Истина;Движения.РасчетыСПокупателями.Очистить();Для Каждого СтрокаТовара Из Товары ЦиклДвижение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Номенклатура = СтрокаТовара.Номенклатура;Движение.Сумма = СтрокаТовара.Сумма;КонецЦикла;КонецПроцедурыНо
Номенклатураобычно не является измерением регистра расчетов с покупателями. Поэтому добавлять это поле можно только если оно действительно есть в регистре.Чаще расчетный регистр заполняется не по каждой номенклатуре, а по документу расчетов, партнеру, договору и сумме.
—
# 6. Как определить, приход или расход нужно ставить
Если
РасчетыСПокупателямиявляется регистром остатков, у него есть полеВидДвижения.Для увеличения задолженности покупателя обычно используется один вид движения, для уменьшения задолженности, другой.
В типовом коде документа нужно посмотреть, что делает сама конфигурация.
Откройте движения документа:
1. Откройте документ
Корректировка реализации.
2. Нажмите:1С (Код)1Еще → Движения документа3. Выберите регистр
Расчеты с покупателями.
4. Посмотрите типовые строки.
5. Сравните:
— вид движения;
— сумму;
— контрагента;
— договор;
— документ расчетов;
— организацию;
— валюту;
— дату.Можно также временно включить регистрацию движений и посмотреть результат после проведения.
Пример движения с видом движения:
1С (Код)1234567Движение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.ВидДвижения = ВидДвиженияНакопления.Приход;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Сумма = СуммаДокумента;Важный момент: нельзя автоматически считать, что для уменьшения задолженности всегда нужно указывать
Расход. Это зависит от назначения конкретного регистра и логики УНФ. Сначала нужно посмотреть типовую запись в движениях.—
# 7. Более надежный способ: скопировать типовое движение и изменить только нужные поля
Если типовая конфигурация заполняет много обязательных реквизитов, безопаснее не создавать движение полностью вручную, а:
1. Выполнить типовое проведение.
2. Получить типовую запись.
3. Изменить нужные значения.
4. Оставить остальные заполненные поля.Например, если после типового проведения в регистре всегда создается одна строка:
1С (Код)12345678910111213141516171819202122&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.РасчетыСПокупателями.Записывать = Истина;Если Движения.РасчетыСПокупателями.Количество() = 0 ТогдаВозврат;КонецЕсли;Движение = Движения.РасчетыСПокупателями[0];// Изменяем только нужные значенияДвижение.Сумма = НужнаяСумма;Движение.Период = НужнаяДата;КонецПроцедурыТакой вариант удобен, если нужно изменить только сумму, дату или документ расчетов.
Но если типовая процедура создает несколько движений, нужно понимать, какую именно строку вы изменяете.
—
# 8. Если нужно удалить типовые движения и создать несколько своих
1С (Код)1234567891011121314151617181920212223242526272829&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.РасчетыСПокупателями.Записывать = Истина;Движения.РасчетыСПокупателями.Очистить();// Первое движениеДвижение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Сумма = Сумма1;// Второе движениеДвижение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Сумма = Сумма2;КонецПроцедурыЕсли регистр остаточный и нужно сделать расходное движение:
1С (Код)1Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Если приходное:
1С (Код)1Движение.ВидДвижения = ВидДвиженияНакопления.Приход;—
# 9. Почему не нужно использовать
Записать()вручнуюВ обработке проведения не нужно писать:
1С (Код)1Движения.РасчетыСПокупателями.Записать();Движения документа записываются платформой автоматически после выполнения
ОбработкаПроведения.Правильно:
1С (Код)1234Движения.РасчетыСПокупателями.Записывать = Истина;Движения.РасчетыСПокупателями.Очистить();Движение = Движения.РасчетыСПокупателями.Добавить();Неправильно:
1С (Код)1Движения.РасчетыСПокупателями.Записать();Ручная запись внутри проведения может привести к проблемам с транзакцией и повторной записью регистра.
—
# 10. Если после
ПродолжитьВызовдвижения нельзя изменитьВозможны две причины.
## Причина 1. Регистр не включен в движения документа
Проверьте, что в расширении у документа есть регистр:
1С (Код)1Документы → КорректировкаРеализаций → Движенияи там указан:
1С (Код)1РасчетыСПокупателямиЕсли регистра нет, платформа может выдать ошибку при обращении к:
1С (Код)1Движения.РасчетыСПокупателямиили движение не будет записываться.
## Причина 2. Документ не является регистратором регистра
Откройте регистр накопления и проверьте, входит ли документ
КорректировкаРеализацийв список регистраторов.Если документ не является регистратором, штатным способом через
Движениязаписать этот регистр нельзя. Тогда нужно либо:— добавить документ в регистраторы регистра в расширении, если конфигурация это позволяет;
— использовать предусмотренный типовой механизм корректировки;
— изменять движения регистра через специальный документКорректировка регистров, если он предусмотрен в УНФ;
— не записывать регистр напрямую в произвольной серверной процедуре.Для регистра расчетов это особенно важно, поскольку в типовых конфигурациях взаиморасчеты могут пересчитываться специальными обработками.
—
# 11. Практический вариант для начала
Сначала поставьте такой диагностический код:
1С (Код)1234567891011121314151617&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.РасчетыСПокупателями.Записывать = Истина;Сообщить("Количество типовых движений: "+ Строка(Движения.РасчетыСПокупателями.Количество()));КонецПроцедурыПроведите документ и посмотрите количество движений.
Если количество больше нуля, можно временно посмотреть значения конкретного движения:
1С (Код)123456789101112131415161718192021&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.РасчетыСПокупателями.Записывать = Истина;Для Каждого Движение Из Движения.РасчетыСПокупателями ЦиклСообщить("Период: " + Строка(Движение.Период));Сообщить("Сумма: " + Строка(Движение.Сумма));Сообщить("Контрагент: " + Строка(Движение.Контрагент));Сообщить("Договор: " + Строка(Движение.Договор));КонецЦикла;КонецПроцедурыПоля в этом диагностическом примере должны существовать в вашем регистре. Если какого-то поля нет, строку с ним нужно удалить или заменить на фактическое имя.
После проверки замените код на рабочий:
1С (Код)1234567891011121314151617181920&ИзменениеИКонтроль("ОбработкаПроведения")Процедура ИзменениеРасчетов_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.РасчетыСПокупателями.Записывать = Истина;Движения.РасчетыСПокупателями.Очистить();Движение = Движения.РасчетыСПокупателями.Добавить();Движение.Период = Дата;Движение.Контрагент = Контрагент;Движение.Договор = Договор;Движение.Сумма = НужнаяСумма;КонецПроцедурыПеред использованием на рабочей базе сделайте резервную копию и проверьте результат в копии базы на нескольких вариантах документа:
— корректировка увеличивает сумму;
— корректировка уменьшает сумму;
— документ полностью сторнируется;
— документ проводится повторно;
— документ сначала распроводится, затем проводится снова;
— меняются контрагент, договор или документ расчетов.Самое важное в вашем случае: сначала выполнить
ПродолжитьВызов, затем очиститьДвижения.РасчетыСПокупателями, после этого добавить свои записи с полным набором измерений и ресурсов регистра.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.