Корректировка движений документа

26.05.19

Разработка - Универсальные функции

Корректировка движений документа после его проведения по типовому алгоритму.

Скачать исходный код

Наименование Файл Версия Размер
Корректировка движений документа:
.epf 6,67Kb
11
.epf 6,67Kb 11 Скачать

Данная статья инициирована тем, что приводимая ниже информация не была найдена мной на сайте в открытом виде. Поэтому мне пришлось потратить несколько драгоценных минут, чтобы все это сделать самому.

Суть кода - удалить/добавить/скорректировать движения документа "извне". Не трогая сам документ. Для "подстановки" движений в регистр документ должен быть записан, желательно (но не обязательно) проведен. Встречал случаи, когда делаешь выверку данных и не понимаешь, откуда лезут движения; тратишь кучу времени и потом выясняешь, что движения делает не проведенный документ; долго и с выражением ругаешься :) 

Делают это обычно тремя методами:

  1) делают подписку на событие ПриПроведении

  2) делают дописку в конце процедуры ОбработкаПроведения в модуле документа (стало особенно актуально с появлением расширения)

  3) делают внешнюю обработку, которая правит движения по таймеру или по ручному нажатию на кнопку

В общем, суть методов одна и та же, меняется только небольшая часть. Рассмотрим все варианты

1. Дописка движений с помощью подписки на событие (на примере УТ 11)

Добавляем общий серверный модуль:

Пример создания модуля для подписки на событие

Добавляем подписку на событие:

подписка на событие

Ниже сам модуль

Процедура РТУ_ПроведениеОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    // получаем ссылку на документ
    Регистратор=Источник.Ссылка;
    
    НаборЗаписей = РегистрыНакопления.СебестоимостьТоваров.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);
    НаборЗаписей.Прочитать();
    
    // предыдущие движения удаляем
    // можно этого не делать, тогда движения добавятся к существующим
    НаборЗаписей.Очистить();
    
    Для каждого Строка из Регистратор.ВидыЗапасов Цикл
        // Делаем новые движения
        ЗаписьРегистра = НаборЗаписей.Добавить();
        ЗаписьРегистра.ВидДвижения = ВидДвиженияНакопления.Приход;   // эта строчка только для регистров остатков
        ЗаписьРегистра.Период=Регистратор.Дата;
        ЗаписьРегистра.Регистратор=Регистратор;
        
        ЗаписьРегистра.АналитикаУчетаНоменклатуры=Строка.АналитикаУчетаНоменклатуры;
        ЗаписьРегистра.РазделУчета=Перечисления.РазделыУчетаСебестоимостиТоваров.ТоварыНаСкладах;
        ЗаписьРегистра.ВидЗапасов=Строка.ВидЗапасов;
        ЗаписьРегистра.Организация=Регистратор.Организация;
        ЗаписьРегистра.ВидДеятельностиНДС=Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
        // при необходимости добавить заполнение остальных измерений
        
        ЗаписьРегистра.Количество=Строка.Количество;
        ЗаписьРегистра.Стоимость=Строка.СуммаСНДС;
        ЗаписьРегистра.СтоимостьРегл=Строка.СуммаСНДС;
        ЗаписьРегистра.СтоимостьУпр=Строка.СуммаСНДС;
        // при необходимости добавить заполнение остальных ресурсов
        
        ЗаписьРегистра.ХозяйственнаяОперация=Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
        // при необходимости добавить заполнение остальных реквизитов
    КонецЦикла;
    
    // все. фиксируем проводки в регистре
    НаборЗаписей.Записать();
КонецПроцедуры

Правильность кода в смысле бизнес-правил не преследовалась. Это просто пример того, как можно перезаполнить движения документа по какому-то из регистров, в качестве "жертвы" был выбран СебестоимостьТоваров.

Ниже еще вариант правки кода в подписке на событие (для конфигурации БП20 - меняем счет списания для документа Списание товаров):

Процедура ОбработкаПроведенияСписаниеТоваровОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
	// тут движения уже отфильтрованы по Регистратору,  потому просто берем их и используем
	НаборДвижений = Источник.Движения.Хозрасчетный;
	ТаблицаПроводок = НаборДвижений.Выгрузить();
	
	// тут приведена некоторая функция, которая гипотетически, по какому-то алгоритму, получает счет Плана счетов
	// а также Статью прочих доходов и расходов для субконто
	СтатьяЗатрат="";
	СчетЗамены=ПолучитьСчетЗамены(СтатьяЗатрат);
	
	// ниже мы поменяем счет, на который делает проводки документ СписаниеТоваров в типовой БП20 (это счет 94)
	// на какой-то свой счет, у которого есть субконто со статьей прочих доходов и расходов
	Если ЗначениеЗаполнено(СчетЗамены) Тогда
		Отбор = Новый Структура;
		Отбор.Вставить("СчетДт",ПланыСчетов.Хозрасчетный.НедостачиИПотериОтПорчиЦенностей);
		МассивСтрок = ТаблицаПроводок.НайтиСтроки(Отбор);
		
		Для Каждого СтрокаТип   Из МассивСтрок Цикл
			// делаем новую проводку (старую потом удалим)
			НоваяСтрока = ТаблицаПроводок.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТип);
			НоваяСтрока.СчетДт = СчетЗамены;
			НоваяСтрока.ВидСубконтоДт1 = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ПрочиеДоходыИРасходы;
			НоваяСтрока.СубконтоДт1 = СтатьяЗатрат;

			// удаляем старую проводку
			ТаблицаПроводок.Удалить(СтрокаТип);
		КонецЦикла;
	КонецЕсли;
	
	НаборДвижений.Загрузить(ТаблицаПроводок);
	
КонецПроцедуры

Можно заметить, что в двух процедурах выше немного меняется способ получения набора записей для их редактирования. В первом случае приходится делать отбор по новому набору, так как простое использование Источник.Движения.СебестоимостьТоваров дает следующую ошибку при проведении:

Документ Реализация товаров и услуг А0ТП-000065 от 31.01.2019 12:37:53 не проведен: Попытка использования закрытого менеджера временных таблиц

Подробно проблему не исследовал, но видимо при записи регистра для набора записей есть своя подписка на события, которая не дает идти по короткому пути. В любому случае, полезно знать оба метода получения набора записей.

 

2. Изменение движений с помощью дописки в конец процедуры ОбработкаПроведения в Расширении


&После("ОбработкаПроведения")
Процедура Общ_ОбработкаПроведения(Отказ, РежимПроведения)
    Св_ва=УправлениеСвойствами.СвойстваОбъекта(Ссылка, Ложь, Истина);
    Для каждого Св_во из Св_ва Цикл
        Если Св_во.Имя="ПодразделениеКорр._ПРС" Тогда
            ПодрКорр=УправлениеСвойствами.ЗначениеСвойства(Ссылка, Св_во);
            Если ЗначениеЗаполнено(ПодрКорр) Тогда
                Общ_СкорректироватьПроводки(ПодрКорр);
            КонецЕсли; 
            Прервать;
        КонецЕсли; 
    КонецЦикла; 
КонецПроцедуры

Процедура Общ_СкорректироватьПроводки(ПодрКорр)
    Для каждого Движ из Движения.Хозрасчетный Цикл
        Движ.ПодразделениеКт=ПодрКорр;
    КонецЦикла; 
КонецПроцедуры

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

Также можно набор записей выгрузить в таблицу значений, что-то с ней сделать, потом загрузить обратно в набор записей и снова его записать.

 

Ну, и наконец

3. Обработка для изменения движений (вообще, это может быть просто процедура, которая вызывается из регламентного задания или откуда-то еще)

Сама обработка:

Форма обработки

Код в модуле формы:


&НаСервереБезКонтекста
Процедура КорректированиДвиженияНаСервере(Регистратор)
    НаборЗаписей = РегистрыНакопления.СебестоимостьТоваров.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);
    НаборЗаписей.Прочитать();
    
    // предыдущие движения удаляем
    // можно этого не делать, тогда движения добавятся к существующим
    НаборЗаписей.Очистить();
    
    Для каждого Строка из Регистратор.ВидыЗапасов Цикл
        // Делаем новые движения
        ЗаписьРегистра = НаборЗаписей.Добавить();
        ЗаписьРегистра.ВидДвижения = ВидДвиженияНакопления.Приход;   // эта строчка только для регистров остатков
        ЗаписьРегистра.Период=Регистратор.Дата;
        ЗаписьРегистра.Регистратор=Регистратор;
        
        ЗаписьРегистра.АналитикаУчетаНоменклатуры=Строка.АналитикаУчетаНоменклатуры;
        ЗаписьРегистра.РазделУчета=Перечисления.РазделыУчетаСебестоимостиТоваров.ТоварыНаСкладах;
        ЗаписьРегистра.ВидЗапасов=Строка.ВидЗапасов;
        ЗаписьРегистра.Организация=Регистратор.Организация;
        ЗаписьРегистра.ВидДеятельностиНДС=Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
        // при необходимости добавить заполнение остальных измерений
        
        ЗаписьРегистра.Количество=Строка.Количество;
        ЗаписьРегистра.Стоимость=Строка.СуммаСНДС;
        ЗаписьРегистра.СтоимостьРегл=Строка.СуммаСНДС;
        ЗаписьРегистра.СтоимостьУпр=Строка.СуммаСНДС;
        // при необходимости добавить заполнение остальных ресурсов
        
        ЗаписьРегистра.ХозяйственнаяОперация=Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
        ЗаписьРегистра.ЗаказКлиента=Регистратор.ЗаказКлиента;
        ЗаписьРегистра.Подразделение=Регистратор.Подразделение;
        ЗаписьРегистра.ПериодПродажи=НачалоМесяца(Регистратор.Дата);
        ЗаписьРегистра.ДокументИсточник=Регистратор;
        // при необходимости добавить заполнение остальных реквизитов
    КонецЦикла;
    
    // все. фиксируем проводки в регистре
    НаборЗаписей.Записать();
КонецПроцедуры

&НаКлиенте
Процедура КорректированиДвижения(Команда)
    КорректированиДвиженияНаСервере(ДокументРТУ);
КонецПроцедуры


Видно, что код очень похож на самый первый пример, где мы отбираем набор записей по Источник.Ссылка

Конечно же, эти сведения не уникальны, но собранные в одной статье помогут сэкономить некоторое количество времени.

В приложенном файле - обработка коррекции движений, полный код которой представлен в статье. Обработка тестировалась на платформе версии 1С:Предприятие 8.3 (8.3.14.1630), конфигурация Управление торговлей, редакция 11 (11.4.6.207).

движения обработка корректировка документ подписка событие удаление движений замена

См. также

Исправление в 1С:ЗУП/ЗКГУ ошибок по НДФЛ и взаиморасчетам с сотрудниками на начало расчетного года.

Корректировка данных Зарплата Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры бюджетного учреждения 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ Платные (руб)

Обработка исправляет технические ошибки по НДФЛ, взаиморасчетам с сотрудниками в 1С:ЗУП (1С:ЗКГУ) на начало года. Фактически все ошибки, которые проявляются в ведомостях на выплату, расчетных листках, при заполнении ведомостей на выплату и отчетах 6-НДФЛ и т.д. нужно начинать исправлять с начала расчетного года. Это позволит быть уверенными, что после завершения расчетов предыдущего года, начали работать с «чистого листа» без ошибочных остатков.

4800 руб.

06.10.2023    2621    30    15    

35

Тестирование и исправление ключей аналитики ERP, УТ11, КА

Корректировка данных Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    107281    636    173    

679

Ускоренное проведение документов (x4), устранение ошибок 60/62 счетов и зачет авансов (Бухгалтерия 3.0)

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    27924    82    146    

61

Исправление ошибки закрытия месяца "Обнаружены ненулевые остатки по суммам при нулевом остатке по количеству в регистре себестоимости по организации". УТ 11.4,УТ 11.5, КА 2.4,КА 2.5, ERP 2.4, ERP 2.5, КА 2 Казахстан, Управление торговлей 3 для Казахстана

Закрытие периода Корректировка данных Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

2400 руб.

27.10.2021    22553    302    35    

74

Заполнение документа "Корректировка регистров" произвольными данными

Закрытие периода Корректировка данных Платформа 1С v8.3 Система компоновки данных 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

2400 руб.

13.07.2015    50318    171    29    

121

Исправление ошибок по НДФЛ и взаиморасчетам с сотрудниками в 1С:Бухгалтерия 3.0

Корректировка данных Зарплата Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    716    3    4    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. goliath-itd 29.07.21 16:41 Сейчас в теме
В моем случае имеется закрытый для просмотра модули объекта и менеджера документа. Но требовалось заполнять свой реквизит в регистре накопления. В результате, после срабатывания подписки на событие с обработкой серверным методом, движения возвращались в исходные значения. Использование расширения со своим методом после проведения так же не представлялось возможным.
В результате получилось следующее:
Процедура ПриПроведенииДокументаОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

	Если Источник.ДавальческаяПрограмма Тогда
		Регистратор = Источник.Ссылка;
		НаборыЗаписей = Источник.Движения;
		НаборЗаписей = НаборыЗаписей.СкладГотовойПродукции;
		Для Каждого Стр Из НаборЗаписей Цикл
			Стр.НомерЗаказа	= Источник.ТЧ1[НаборЗаписей.Индекс(Стр)].Заказ;
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры
Показать


При этом надо понимать, что порядок движений и их количество должны совпадать с количеством записей в табличной части документа.
+
Оставьте свое сообщение